Gianni
Gianni

Reputation: 518

matlab local static variable

In order to test an algorithm in different scenarios, in need to iteratively call a matlab function alg.m.

The bottleneck in alg.m is something like:

load large5Dmatrix.mat
small2Dmatrix=large5Dmatrix(:,:,i,j,k)  % i,j and k change at every call of alg.m
clear large5Dmatrix

In order to speed up my tests, i would like to have large5Dmatrix loaded only at the first call of alg.m, and valid for future calls, possibly only within the scope of alg.m

Is there a way to acheve this in matlab other then setting large5Dmatrix as global?

Can you think of a better way to work with this large matrix of constant values within alg.m?

Upvotes: 3

Views: 4793

Answers (2)

Gunther Struyf
Gunther Struyf

Reputation: 11168

You can use persistent for static local variables:

function myfun(myargs)
    persistent large5Dmatrix
    if isempty(large5Dmatrix)
        load large5Dmatrix.mat;
    end

    small2Dmatrix=large5Dmatrix(:,:,i,j,k)  % i,j and k change at every call of alg.m
    % ... 
end

but since you're not changing large5Dmatrix, @High Performance Mark answer is better suited and has no computational implications. Unless you really, really don't want large5Dmatrix in the scope of the caller.

Upvotes: 11

High Performance Mark
High Performance Mark

Reputation: 78316

When you pass an array as an argument to a Matlab function the array is only copied if the function updates it, if the function only reads the array then no copy is made. So any performance penalty the function pays, in time and space, should only kick in if the function updates the large array.

I've never tested this with a recursive function but I don't immediately see why it should start copying the large array if it is only read from.

So your strategy would be to load the array outside the function, then pass it into the function as an argument.

This note may clarify.

Upvotes: 3

Related Questions