matlab局部静态变量

时间:2012-08-03 09:45:02

标签: matlab

为了在不同场景下测试算法,需要迭代调用matlab函数alg.m。

alg.m的瓶颈就像:

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

为了加快我的测试速度,我想只在第一次调用alg.m时加载large5Dmatrix,并且对将来的调用有效,可能只在alg.m

有没有办法在matlab中实现这一点,然后将large5Dmatrix设置为全局?

你能想到一个更好的方法来处理alg.m中这个大的常量值矩阵吗?

2 个答案:

答案 0 :(得分:10)

您可以将persistent用于静态局部变量:

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

但是因为你没有改变large5Dmatrix,所以@High Performance Mark答案更适合并且没有计算含义。除非你真的,否则真的不希望large5Dmatrix在调用者的范围内。

答案 1 :(得分:3)

当您将数组作为参数传递给Matlab函数时,只有在函数更新时才复制数组,如果函数只读取数组,则不会复制。因此,如果函数更新大型数组,函数在时间和空间上支付的任何性能损失都应该启动。

我从来没有使用递归函数对此进行测试,但我不会立即明白为什么它应该开始复制大数组(如果只是从中读取)。

所以你的策略是load函数外部的数组,然后将它作为参数传递给函数。

This note可能会澄清。