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 的范围内

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

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

4

2 回答 2

10

您可以将持久性用于静态局部变量:

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在调用者的范围内。

于 2012-08-03T10:01:12.840 回答
3

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

我从来没有用递归函数测试过这个,但我没有立即明白为什么它应该开始复制大数组,如果它只被读取。

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

本说明可能会澄清。

于 2012-08-03T09:54:20.287 回答