Сохранить вывод функции

Я смог собрать следующий код, чтобы найти отметку времени каждый раз, когда нажимается пробел. Однако я не могу найти способ сохранить 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 Разве он не будет возвращать значения в рабочую область только после завершения функции main? Я думаю, что нужно создать дескриптор в рабочей области, передать его в 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
Я действительно смущен сейчас. Вы говорите, что я должен использовать function[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