3

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?

4

2 に答える 2

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あなたが本当に、本当に呼び出し元のスコープに入れたくない場合を除きます。

于 2012-08-03T10:01:12.840 に答える
3

配列を引数として Matlab 関数に渡すと、関数が配列を更新する場合にのみ配列がコピーされます。関数が配列を読み取るだけの場合、コピーは作成されません。したがって、関数が時間と空間で支払うパフォーマンスのペナルティは、関数が大きな配列を更新する場合にのみ発生するはずです。

これを再帰関数でテストしたことはありませんが、読み取り専用の場合に大きな配列のコピーを開始する必要がある理由がすぐにはわかりません。

したがって、あなたの戦略はload、関数の外側の配列になり、それを引数として関数に渡します。

このメモは明確になるかもしれません。

于 2012-08-03T09:54:20.287 に答える