为了在不同场景下测试算法,需要迭代调用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中这个大的常量值矩阵吗?
答案 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可能会澄清。