вставить массив с помощью графического интерфейса в Matlab

Я хочу вставить массив с помощью графического интерфейса, но не понимаю, почему я получаю эти ошибки:

Error using waitfor

Undefined function or variable 'A'.

Error using waitfor

Error while evaluating uicontrol Callback

КОД:

function read()
clear all
clc

n=2;

b=50;   
a=300;
B = nan(n);
S.fh = figure('units','pixels',...
              'position',[500 500 500 500],...
              'menubar','none',...
              'numbertitle','off',...
              'name','Matrix',...
              'resize','off');
for i=1:n    
    for j=1:n
        A(i,j) = uicontrol('style','edit','units','pixels',...
                 'position',[b a 50 50],'fontsize',20,'string','',...
                 'Callback', 'B(A == gco) = str2double(get(gco, ''string''));');
       b = b+60;
    end
    b = 50;
    a = a-60;
end

S.bb = uicontrol('style','push',...
                 'units','pixels',...
                 'position',[300 10 75 50],...
                 'fontsize',14,...
                 'string','Done',...
                 'callback','close');

waitfor(S.fh)
B

person alinush2693    schedule 20.05.2013    source источник
comment
P.S...если я удалю первую строку (функция read())..работает, но я хочу использовать с функцией, потому что это часть программы с большим количеством функций, и я хочу вернуть массив B другой функции. ..спасибо   -  person alinush2693    schedule 20.05.2013
comment
используйте анонимную функцию для обратного вызова вместо строки.   -  person Shai    schedule 20.05.2013
comment
Ну, вы не определили A перед его использованием. Может быть, попробуйте добавить A=[] перед первым циклом for.   -  person Justin    schedule 21.05.2013


Ответы (1)


Вместо использования обратных вызовов для всех полей редактирования по отдельности я рекомендую один обратный вызов, который считывает все значения на кнопке. Например:

function read()
clear all
clc

n=2;

b=50;   
a=300;
% A = zeros(n);
S.fh = figure('units','pixels',...
              'position',[500 500 500 500],...
              'menubar','none',...
              'numbertitle','off',...
              'name','Matrix',...
              'resize','off');
for i=1:n    
    for j=1:n
        A(i,j) = uicontrol('style','edit','units','pixels',...
                 'position',[b a 50 50],'fontsize',20,'string','');
                 % no callback for the edit boxes

       b = b+60;
    end
    b = 50;
    a = a-60;
end

S.bb = uicontrol('style','push',...
                 'units','pixels',...
                 'position',[300 10 75 50],...
                 'fontsize',14,...
                 'string','Done',...
                 'callback',@(~,~)(readvalues(A,n)));
                 % callback that reads all the values in one run
                 % (and closes the figure as you wanted)

waitfor(S.fh)


function readvalues(A,n)
B = zeros(n);
for i=1:n
    for j=1:n
        B(i,j) = str2double(get(A(i,j), 'String'));
    end
end
disp(B)
close
person RudolfW    schedule 21.05.2013