Программирование в Matlab GUI: использование данных, импортированных с помощью uiimport - PullRequest
0 голосов
/ 29 октября 2018

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

1 - импорт набора данных для текстового файла

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

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

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

S = uiimport('-file');

Данные загружаются как «двойной 191384x3». Я также изменил функцию следующим образом, чтобы S была доступна для 2-й кнопки:

function S = load_data_Callback(hObject, eventdata, handles)

Затем я нажимаю вторую кнопку, чтобы выполнить второе задание. В Callback 2-й кнопки я написал

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);

Когда я нажимаю 2-ю кнопку, я получаю сообщение об ошибке:

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

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

1 Ответ

0 голосов
/ 30 октября 2018

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

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

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

Работая с руководством, структура guidata по умолчанию заполняется структурой, содержащей все объекты пользовательского интерфейса, названные в честь их тега. Дополнительные поля могут быть добавлены по мере необходимости. Аргумент 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)

Сохранение загруженных данных в некоторые пользовательские данные объекта, например, 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');
%...%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...