tim
tim

Reputation: 10186

Matlab: Abort function call with Strg+C but KEEP return value

I have a function in matlab with something like this:

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

    % Return
    out = times;
end

I want to abort the running function now but keep the values of times which are currently already taken. How to do it? When I press strg+c, I simply loose it because it's only a local function variable which is deleted when the function leaves the scope... Thanks!

Upvotes: 2

Views: 533

Answers (4)

crobar
crobar

Reputation: 2939

Another possible solution is to use the assignin function to send the data to your workspace on each iteration. e.g.

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

Upvotes: 0

Egon
Egon

Reputation: 4787

Couldn't you use persistent variables to solve your problem, e.g.

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

I'm not sure whether persistent variables are cleared upon Ctrl-C, but I don't think it should be the case. What this should do: if you supply arguments, it will run as before. When you omit all arguments however, the last value of times should be returned.

Upvotes: 1

Edric
Edric

Reputation: 25160

onCleanup functions still fire in the presence of CTRL-C, however I don't think that's really going to help because it will be hard for you to connect the value you want to the onCleanup function handle (there are some tricky variable lifetime issues here). You may have more luck using a MATLAB handle object to track your value. For example

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

Upvotes: 0

Alex McAndrew
Alex McAndrew

Reputation: 26

Simplest solution would be to turn it from a function to a script, where times would no longer be a local variable.

The more elegant solution would be to save the times variable to a .mat file within the loop. Depending on the time per iteration, you could do this on every loop, or once every ten loops, etc.

Upvotes: 1

Related Questions