Передача внешних переменных в MATLAB GUIDE

Моя программа загружает данные из файла и создает график, пользователь нажимает на интересующую область, затем выполняется анализ и создается новый график. Программа продолжает просить пользователя щелкнуть изображение, пока пользователь не нажмет e, чтобы выйти из программы.

Я хочу, чтобы созданный график представлял собой графический интерфейс, который берет данные из моей программы, но у меня, похоже, возникают проблемы с передачей этих данных в функцию графического интерфейса. Вот краткий пример того, как выглядит моя программа:

load(data)
plot(x,y)
while 1%so that it continues asking for user interaction
     figure(1)
     'click on the point you want or press e to exit'
     [x1,y1,key]=ginput(1)

     f=score(x1,y1)
     %the above is a different function that gives us the data that I want to graph,
     %that are called xf,yf 

     %GUI plot
     figure(1)
     test_gui(xf,yf)

     if (key == 'e')
     display('End')
     break;
     else
     display('next point')
     end
end

Мой test_gui.m выглядит так:

function varargout = test_gui(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @test_gui_OpeningFcn, ...
               'gui_OutputFcn',  @test_gui_OutputFcn, ...
               'gui_LayoutFcn',  [] , ...
               'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before fft_guide is made visible.
function test_gui_OpeningFcn(hObject, eventdata, handles, varargin)


% Choose default command line output for test_gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes test_gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = test_gui_OutputFcn(hObject, eventdata, handles) 

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
plot (xf,yf)   

Проблема в том, что когда я нажимаю кнопку «Нажать», она ничего не отображает, поэтому должно быть что-то не так в том, как я передаю переменные xf, yf. Мне было интересно, есть ли у кого-нибудь идеи о том, что я делаю неправильно, я раньше не использовал GUIDE, и кажется, что я потерялся.


person AL B    schedule 11.09.2013    source источник
comment
Вы должны реализовать цикл в функции запуска графического интерфейса внутри реализации графического интерфейса, а не снаружи. Есть много способов сохранить xf и yf, но Matlab рекомендует делать это с помощью переменной handles. Я не могу помочь вам с более подробной информацией, но вы можете посмотреть здесь, чтобы увидеть пример реализации графического интерфейса, который я именно это и объясняю.   -  person Werner    schedule 11.09.2013


Ответы (1)


Судя по вашему коду, xf и yf никогда не определяются, только f (результат score). Возможно, поэтому вы не видите никаких сюжетов.

Предположим, что score выгружает xf и yf в рабочую область, вы должны сначала определить их из varargin, а затем передать их функции обратного вызова с помощью handles, как прокомментировал Вернер.

% --- Executes just before fft_guide is made visible.
function test_gui_OpeningFcn(hObject, eventdata, handles, varargin)
xf = varargin{0}; yf = varargin{1}; % Get xf and yf from input
handles.xf = xf; handles.yf = yf;  % Put the values in handles
guidata(hObject,handles);   % Save handles so you can use it anywhere in the GUI

И в обратном вызове:

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
plot (handles.xf,handles.yf)

Я считаю, что это должно работать, если предположить, что xf и yf правильно определяются перед передачей в функцию графического интерфейса.

person Thales MG    schedule 11.09.2013
comment
Спасибо большое. Вы правильно догадались, что у меня в рабочей области были xf,yf (я просто не включил их в код, который скопировал здесь), но проблема заключалась в том, что я не включил xf = varargin{1}; yf = varargin{2};. Как только я включил эту строку, она отлично сработала! Еще раз спасибо! - person AL B; 11.09.2013
comment
Рад, что это сработало для вас. Если вы удовлетворены своими результатами, пожалуйста, примите мой ответ, нажав зеленую галочку. ;) - person Thales MG; 11.09.2013