Запазете изхода на функция

Успях да събера следния код, за да намеря времеви печат всеки път, когато се натисне интервал. Не мога обаче да измисля начин да запазя S.tm в работното пространство. Ето кода:

function main
    S.tm = [];
    S.cnt = 0;   
    S.fh = figure('KeyPressFcn',@youPressedSomething,...
                  'menu','none',...
                  'pos',[400 400 320 50]);
    S.th = uicontrol('Style','text','Position',[10 10 300 30],...
            'String','You have not hit space yet');
 function  youPressedSomething(varargin)
    if strcmp(varargin{2}.Character,' ')
            S.tm = [S.tm now] 
            S.cnt = S.cnt + 1;
            set(S.th,'str',sprintf('You hit space %i!',S.cnt));

    end
  end
 end

person DashD    schedule 02.05.2016    source източник
comment
не е ли защото не декларирате никакви изходи? вижте тук   -  person shamalaia    schedule 02.05.2016
comment
Ето за това не съм сигурен. Не съм използвал този вид функционалност преди, така че не съм сигурен как да я приложа.   -  person DashD    schedule 02.05.2016
comment
@A_C Няма ли да върне стойности в работното пространство само след като mainfunction приключи? Мисля, че човек трябва да създаде манипулатор в работното пространство, да го прехвърли на main и след това на yPS, за да бъде актуализиран.   -  person Crowley    schedule 02.05.2016
comment
@Crowley Дори когато затворя фигурата, изходът не се записва в работното пространство.   -  person DashD    schedule 02.05.2016


Отговори (2)


Тук има два основни варианта. Можете да използвате assignin в вашата функция, за да запазите данните в основното работно пространство.

function main
    S.tm = [];
    S.cnt = 0;   
    S.fh = figure('KeyPressFcn',@youPressedSomething,...
                  'menu','none',...
                  'pos',[400 400 320 50]);
    S.th = uicontrol('Style','text','Position',[10 10 300 30],...
            'String','You have not hit space yet');

    function  youPressedSomething(varargin)
        if strcmp(varargin{2}.Character,' ')
            S.tm = [S.tm now] 
            S.cnt = S.cnt + 1;

            set(S.th,'str',sprintf('You hit space %i!',S.cnt));

            %// Save as "timestamps" in the base workspace
            assignin('base', 'timestamps', S.tm);

        end
    end
end

Или по-добър подход би бил да използвате waitfor за блокиране на изпълнението на функцията докато фигурата се затвори. След това можете да върнете S.tm точно като нормален изходен аргумент

function timestamps = main()
    S.tm = [];
    S.cnt = 0;   
    S.fh = figure('KeyPressFcn',@youPressedSomething,...
                  'menu','none',...
                  'pos',[400 400 320 50]);

    S.th = uicontrol('Style','text','Position',[10 10 300 30],...
            'String','You have not hit space yet');

    %// Wait until the figure is closed
    waitfor(S.fh);

    %// Save S.tm as timestamps and return
    timestamps = S.tm;

    function  youPressedSomething(varargin)
        if strcmp(varargin{2}.Character,' ')
            S.tm = [S.tm now] 
            S.cnt = S.cnt + 1;

            set(S.th,'str',sprintf('You hit space %i!',S.cnt));

            %// Save as "timestamps" in the base workspace
            assignin('base', 'timestamps', S.tm);

        end
    end
end
person Suever    schedule 02.05.2016

Можете да опитате да редактирате кода си по следния начин:

function[S.fh]=main()
%% Your Code

function yPS(varargin)
  if...
  %% Your Code
  end
  set(S.fh,'UserData',S.tm);
end %yPS
end %main

Това трябва да върне манипулатора на фигурата в работното пространство и да го запази и в паметта. След това всеки път, когато се извика функцията yPS, тя използва споделен манипулатор S.fh на фигурата и (пре)настройва свойството UsedData, което е предназначено да съдържа потребителски данни.

За да използвате функцията, извикайте я Foo=main.

get(Foo.fh,'UserData')

ans = 

[]

Натиснете интервал няколко пъти

>> get(AA.fh,'userdata')

ans =

1.0e+005 *

  7.3645
  7.3645
  7.3645
person Crowley    schedule 02.05.2016
comment
Направих това, което предложихте, но показва tm като празен. Направих една промяна в това, което предложихте. В [S.fh]=main() използвах [S]=main(), защото MATLAB не харесваше S.fh изхода. - person DashD; 02.05.2016
comment
Все още се извежда празно - person DashD; 02.05.2016
comment
Сега наистина съм объркан. Казвате, че трябва да използвам функция[Fig]=nestie() и да я извикам в различен файл, нали? Кога обаче да натисна интервала, за да запиша времевите клейма? - person DashD; 02.05.2016
comment
Когато пуснах кода, в момента той просто съхранява колко пъти съм натиснал интервал, но не записва времето, така че ще трябва да го редактирам съответно. Кодът обаче работи само ако държите фигурата отворена, ако е затворена, get(Foo,'UserData') води до грешка - person DashD; 02.05.2016
comment
Да, ако затворите фигурата, нейната структура от данни се изтрива. Можете да опитате да запазите данните, като използвате свойството DeleteFcn. - person Crowley; 02.05.2016
comment
Не мога да го накарам да изведе времевите печати. Използвах реда от код, който използвах в първоначалната си публикация... но не мога да го разбера. - person DashD; 02.05.2016
comment
Нека продължим тази дискусия в чата. - person Crowley; 02.05.2016