Программирование графического интерфейса Matlab: используйте данные, импортированные с помощью uiimport

Я программирую простой графический интерфейс, который должен выполнять 2 задачи:

1- импортировать набор данных для txt-файла

2- сделать некоторые вычисления с ранее импортированными данными

Обе задачи выполняются нажатием кнопки, по одной кнопке для каждой задачи.

Для кнопки «Загрузить данные» (задача 1) я использовал команду uiimport в обратном вызове этой кнопки (как описано здесь Matlab Calling «Импорт данных» с помощью кнопки GUI ):

S = uiimport('-file');

Данные загружаются как «191384x3 double». Я также изменил функцию следующим образом, чтобы иметь 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{:});

Что мне не хватает?

Всего 1 ответ


Вам нужно сохранить выход из первой функции где-нибудь, где вторая функция сможет получить к ней доступ. Обычно это делается путем сохранения его либо в каком-либо объекте UserData объекта ui, либо для хранения в некоторой специальной структуре хранения данных, прикрепленной к объектам фигуры, и к ней обращаются либо с guidata функции guidata , либо с guidata функций getappdata и setappdata .

dat=guidata(hObj); получает руководство от родительской фигуры hObj

guidata(hObj,dat); устанавливает директивы родительской фигуры hObj чтобы

Работая с гидом, структура направляющих по умолчанию заполняется структурой, содержащей все объекты ui, названные в честь их тега. При необходимости могут добавляться дополнительные поля. Аргумент handle от обратных вызовов содержит guidata (hObj).

Три возможных варианта:

1. С рекомендациями

Храните загруженные данные с помощью руководств

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

Он будет автоматически загружен обратно в входную переменную

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

2. С свойством Userdata (до R2014a)

Храните загруженные данные в некоторые пользовательские данные uiobject, например 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');
%...%

Есть идеи?

10000