【问题标题】:Storing/passing semi-large data in GUIDE, Matlab在 GUIDE、Matlab 中存储/传递半大数据
【发布时间】:2016-10-21 11:48:10
【问题描述】:

我正在制作一个可以进行一些信号处理的 gui。其中一个组件是“录制”按钮,它可以从麦克风录制几秒钟的声音。几个滑块稍后会以不同的方式改变它的音高,然后有一个播放按钮来播放转换后的声音。

我使用句柄来获取有关从滑块中选择的频率的所有信息,它工作正常,但是对于录制的声音,我有点担心,因为我知道句柄结构一直被复制。几秒钟的声音可能不会太多,但我担心性能问题,因为 gui 运行了很长时间并且很多组件都被点击了。我在一些 Mathworks 页面上读到 guidata/handles 不应该用于大型数据结构,因为它会被复制。我尝试按照这里的说明使用 setappdata 和 getappdata https://se.mathworks.com/help/matlab/ref/getappdata.html

这里 https://se.mathworks.com/help/matlab/creating_guis/share-data-among-callbacks.html#bt9p4t0

但它不起作用,并给了我一个

Attempt to reference field of non-structure array.

Error in gui>recordbutton_Callback (line 334)
setappdata(hObject.Parent, 'v', 'Record')

错误。

这是我尝试存储它的方式:

% --- Executes just before gui is made visible.
function gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui (see VARARGIN)

setappdata(hObject, 'v', '');

%% --- Other app-specific inits


% --- Executes on button press in recordbutton.
function recordbutton_Callback(hObject, eventdata, handles)
% hObject    handle to recordbutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
setappdata(hObject.Parent, 'v', 'Record')
getappdata(hObject.Parent)

我尝试将它存储在 hObject.Parent 和 hObject 本身中。两者都给出相同的错误。我希望可以从所有其他组件的回调函数中访问数据,但不要一直复制。 请注意,在此示例中,我只是尝试将字符串 'Record' 存储在变量 v 中,而不是记录以便于阅读。

编辑:我正在使用指南。

【问题讨论】:

  • 这是 MATLAB hObject.Parent,hObject不是结构体
  • 是的,> 版本提供 8.3.0.532 (R2014a) 所以我猜是这样。我在 Stackoverflow 上看到了 hObject.Parent 的东西,所以我只是复制了它。任何解决方法?最终,代码应该在 2014a 和 2016 都运行,但这不是严格要求。
  • 复制粘贴代码而不知道它做了什么!多么可怕可怕的想法。主要是因为你不知道如果失败会发生什么,而且 SO 中并非所有代码都是正确的。
  • 我基本同意你的说法。然而,我只是假设 hObject.Parent 将是 hObject 的一个字段,它将访问将存储数据并可以从所有组件访问的底层图形。查看 Internet 上的示例并了解其工作原理是程序员的学习方式。在这种情况下,它并没有像我所怀疑的那样行事,我也承认这一点,但我没有发现任何问题。而且我没有复制粘贴。我写了一句话。复制粘贴你不理解的长段代码,当然。但是尝试您在 Stackoverflow 答案中读出的新关键字并没有那么错误 IMO。
  • 谢谢。不确定。在互联网上你永远不知道。

标签: matlab matlab-guide data-storage


【解决方案1】:

要在 r2014a 和 r2016b 中实现此功能,您有两个选择:

让 r2014a 像 r2016b 一样工作:

function recordbutton_Callback(hObject, eventdata, handles)
% hObject    handle to recordbutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
hObject = handle(hObject);
setappdata(hObject.Parent, 'v', 'Record')
getappdata(hObject.Parent)

在两者中都使用 r2014a 语法:

function recordbutton_Callback(hObject, eventdata, handles)
% hObject    handle to recordbutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
Parent = get ( hObject, 'Parent' );
setappdata(Parent, 'v', 'Record')
getappdata(Parent)

【讨论】:

  • 谢谢。可能是愚蠢的问题,但是 hObject = handle(hObject) 是做什么的?
  • 它使 pre 2014b 处理一个变量,您可以使用 'dot' 语法
猜你喜欢
  • 2017-02-21
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多