Matlab: прервать вызов функции с помощью Strg + C, но сохранить возвращаемое значение - PullRequest
2 голосов
/ 23 июня 2011

У меня есть функция в Matlab с чем-то вроде этого:

function [ out ] = myFunc(arg1, arg2)
    times = [];
    for i = 1:arg1
        tic
        % do some long calculations
        times = [times; toc];
    end

    % Return
    out = times;
end

Я хочу сейчас прервать работающую функцию, но сохранить значения times, которые в настоящее время уже приняты.Как это сделать?Когда я нажимаю strg + c, я просто теряю его, потому что это только локальная переменная функции, которая удаляется, когда функция покидает область видимости ... Спасибо!

Ответы [ 4 ]

1 голос
/ 23 июня 2011

Не могли бы вы использовать постоянные переменные для решения вашей проблемы, например

function [ out ] = myFunc(arg1, arg2)
    persistent times
    if nargin == 0
        out = times;
        return;
    end;
    times = [];
    for i = 1:arg1
        tic
        % do some long calculations
        times = [times; toc];
    end

    % Return
    out = times;
end

Я не уверен, очищаются ли постоянные переменные при Ctrl-C, но яЯ думаю, что так и должно быть.Что это должно сделать: если вы предоставите аргументы, он будет работать как прежде.Однако, если вы пропустите все аргументы, должно быть возвращено последнее значение times.

1 голос
/ 23 июня 2011

Самое простое решение - превратить его из функции в скрипт, где времена больше не будут локальной переменной.

Более элегантным решением было бы сохранить переменную times в файле .mat в цикле.В зависимости от времени на итерацию, вы можете сделать это в каждом цикле или один раз в десять циклов и т. Д.

0 голосов
/ 05 июля 2012

Другое возможное решение - использовать функцию assignin для отправки данных в ваше рабочее пространство на каждой итерации.например,

function [ out ] = myFunc(arg1, arg2)
    times = [];
    for i = 1:arg1
        tic
        % do some long calculations
        times = [times; toc];
        % copy the variable to the base workspace
        assignin('base', 'thelasttimes', times)
    end

    % Return
    out = times;
end
0 голосов
/ 23 июня 2011

onCleanup функции по-прежнему работают в присутствии CTRL-C, однако я не думаю, что это действительно поможет, потому что вам будет трудно соединить требуемое значение с дескриптором функции onCleanup (там некоторые хитрые проблемы времени жизни переменных здесь). Возможно, вам повезет больше, если использовать объект дескриптора MATLAB для отслеживания вашего значения. Например

x = containers.Map(); x('Value') = [];
myFcn(x); % updates x('Value') 
% CTRL-C
x('Value') % contains latest value
...