首页 > 解决方案 > Matlab GUI 编程:使用 uiimport 导入的数据

问题描述

我正在编写一个简单的 GUI,它必须执行 2 个任务:

1-为一个txt文件导入一组数据

2- 使用之前导入的数据进行一些计算

这两项任务都是按一个按钮执行的,每个任务一个按钮。

对于“加载数据”按钮(任务 1),我在该按钮的回调中使用了 uiimport 命令(如此处所述Matlab Calling 'Import Data' with GUI Button):

S = uiimport('-file');

数据加载为“191384x3 双精度”。我还修改了如下功能,以便 S 可用于第二个按钮:

function S = load_data_Callback(hObject, eventdata, handles)

然后我按下第二个按钮来执行第二个任务。在我写的第二个按钮的回调中

function pushbutton2_Callback(hObject, eventdata, handles, S)

loaded_data = S; % to access the data in the non structured array
% Then I want to have 3 separate vectors out of the structure
v1 = loaded_data(:,1);       
v2 = loaded_data(:,2);     
v3 = loaded_data(:,3);

当我按下第二个按钮时,我收到一条错误消息:

Not enough input arguments.
loaded_data = S;
Error in gui_mainfcn (line 95)
    feval(varargin{:});

我错过了什么?

标签: matlabuser-interface

解决方案


您需要将第一个函数的输出存储在某个地方,第二个函数将能够访问它。这通常通过将其存储在某个 ui 对象的 UserData 属性中来完成,或者存储在附加到图形对象的某些特殊数据存储结构中,并通过guidata函数或getappdataandsetappdata函数进行访问。

dat=guidata(hObj);hObj从父图形获取 guidata

guidata(hObj,dat);将父图形的 guidata 设置hObjdat

使用指南时,guidata 结构默认填充有包含所有 ui 对象的结构,以它们的标签命名。可以根据需要添加额外的字段。回调的handle参数包含 guidata(hObj)。

三种可能的实现:

1. 使用guidata

使用 guidata 存储加载的数据

function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
handles.S=S;
guidata(hObject,S);

它将自动加载回handles输入变量

function pushbutton2_Callback(hObject, eventdata, handles)
assert(isfield(handles,S),'Load some data first!');
loaded_data=handles.S;
%...%

2. 具有Userdata属性(R2014a 之前)

将加载的数据存储到一些 uiobject UserData 中,例如 pushbutton2

function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
set(handles.pushbutton2,'UserData',S,'Enable','on'); %You could disable pushbutton2 by default, until some data has been loaded

从 UserData 属性中恢复数据

function pushbutton2_Callback(hObject, eventdata, handles)

loaded_data=get(hObject,'UserData');
assert(~isempty(loaded_data),'Load some data first!');
%...%

3.具有appdata功能

使用setappdata存储加载的数据

function load_data_Callback(hObject, eventdata, handles)
% Load the file and save the result in variable S%
% Then: %
setappdata(hObject,'loaded_data',S);

使用getappdata恢复:

function pushbutton2_Callback(hObject, eventdata, handles)
assert(isappdata(hObject,'loaded_data'),'Load some data first!');
loaded_data=getappdata(hObject,'loaded_data');
%...%

推荐阅读