Как передать параметры в графический файл Matlab
Я новичок в Matlab. Работая через графический интерфейс Matlab, я столкнулся с проблемой, которая заключается в следующем.
Я хочу иметь 2 файла рисунка, один файл рисунка вызывает другой. я знаю, что просто вызывая имя 2-го фигового файла из первого фигового файла, мы можем вызвать 2-ую фигуру. Тем не менее, я также хочу отправить некоторые параметры из одного фигового файла в другой. Здесь мне нужно отправить аргументы, а также получить эти параметры для дальнейшей обработки. Я не смог найти решение этой проблемы. Я был бы рад, если бы кто-нибудь помог мне с этой проблемой.
заранее спасибо
4 ответа
Я нашел три способа сделать это:
Способ 1: использование setappdata
а также getappdata
вот так:
setappdata(0,'some_var',value)
some_other_var = getappdata(0,'some_var')
Вы будете использовать setappdata() в m-файле для fig1 для хранения любых данных, которые вы хотите передать, а затем вызывать getappdata() в другом m-файле для его получения. Аргумент 0
две функции определяют корневое рабочее пространство MATLAB, которое доступно вашей программе везде (т. е. оно является глобальным). Таким образом, когда вы закрываете свои цифры, эти данные будут по-прежнему доступны. Вы можете использовать rmappdata
удалить их.
Способ 2: использование guidata
:
Предполагая, что вы создали свой GUI с GUIDE, у вас есть доступ к структуре под названием handles
который передается везде и который вы можете редактировать, и вы можете сделать это в обратном вызове графического интерфейса:
handles.some_var = some_value
guidata(hObject,handles)
Тогда вы можете получить доступ handles.some_var
в другом месте в каком-то другом обратном вызове (потому что handles
автоматически передается в него для вас) в вашем другом m-файле:
some_other_var = get(handles.some_var)
Способ 3: использование UserData
:
Сохраните переменную, которую вы хотите от вашей первой фигуры:
set(name_of_fig, 'UserData', some_var)
Затем, чтобы получить его от другого:
some_other_var = get(name_of_fig, 'UserData')
(Отказ от ответственности: мои настоящие знания о MATLAB не так уж и велики, но они помогают найти хорошие ресурсы, подобные этим и этим, и даже этим из официальных документов. То, что я здесь написал, может быть неверным, поэтому вам следует Обязательно обратитесь к документации для получения дополнительной помощи.)
Я хотел бы сделать это (при условии, что вы используете GUI Builder GUIDE).
Допустим, ваши фигуры / m-файлы называются firstFigure.fig / m и secondFigure.fig / m. В коде firstFigure просто вызовите secondFigure и передайте параметры в качестве аргументов:
someNumber = 1;
someText = 'test';
aMatrix = rand(3);
secondFigure(someNumber, someText, aMatrix);
Аргументы будут доступны для secondFigure как переменная varargin в функциях обратного вызова.
function varargout = secondFigure(varargin)
а также
function secondFigure_OpeningFcn(hObject, eventdata, handles, varargin)
варагин - клеточная структура; используйте cell2mat и char, чтобы преобразовать его обратно:
theNumber = cell2mat(varargin(1));
theText = char(varargin(2));
theTextAgain = cell2mat(varargin(2));
theMatrix = cell2mat(varargin(3));
Это может помочь: http://www.mathworks.ch/matlabcentral/newsreader/view_thread/171989
Самый простой способ - обернуть параметры в массив ячеек и отправить их непосредственно в конструктор GUI. Вызов с двумя параметрами может выглядеть так:
figure2({param1, param2})
Затем вы можете распаковать аргументы в функции открытия (figure2_OpeningFcn) с помощью кода:
handles.par1 = varargin{1}{1};
handles.par2 = varargin{1}{2};
Эти строки должны быть расположены где-то перед строкой, которая говорит guidata(hObject, handles);
, Тогда вы можете получить доступ handles.par1
а также handles.par2
непосредственно во всех других обратных вызовах.
Я предполагаю, что вы используете GUIDE для создания вашего GUI. Вы можете найти figure2_OpeningFcn в figure2.m, который будет находиться в том же каталоге, что и figure2.fig.
Примечание: вы также можете вернуть значения из фигуры, returnvalue = my_figure({my_input})
, Если вы хотите инструкции по этому вопросу, оставьте комментарий, и я расширю свой ответ.