Matlab本地静态变量

3
为了在不同场景下测试算法,我需要迭代调用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

为了加快我的测试速度,我想让large5Dmatrix只在alg.m的第一次调用时加载,并在将来的调用中保持有效,可能仅限于alg.m的范围内。
除了将large5Dmatrix设置为全局变量之外,MATLAB中是否有其他方法实现这一点?
你能想到更好的方法来处理alg.m中的这个大的常数值矩阵吗?
2个回答

11
你可以使用 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置于调用方的范围内。


3
当您将数组作为参数传递给Matlab函数时,只有在函数更新它时才会复制该数组,如果函数仅读取该数组,则不会进行任何复制。因此,函数在时间和空间方面支付的任何性能惩罚应该只在函数更新大数组时启动。
我从未使用递归函数测试过这一点,但我立即没有看到为什么它应该开始复制大数组,如果它仅从中读取。
因此,您的策略是在函数外部“load”数组,然后将其作为参数传递到函数中。
这个笔记可能会澄清。

您建议更改alg.m,以便测试脚本调用alg.m时加载并将large5Dmatrix作为输入提供?这会使整个过程变得有些不直观,并且large5Dmatrix是我正在测试的算法逻辑的一部分,但如果没有其他解决方案出现,我会采取这种方法!谢谢 - Gianni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接