2012-08-03 85 views
3

爲了測試不同場景下的算法,需要迭代調用matlab函數alg.m.matlab本地靜態變量

在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中這個常量值的大矩陣嗎?

回答

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性能標誌的答案是更適合,也沒有計算問題。除非你真的,真的不希望large5Dmatrix在調用者的範圍內。

3

當您將數組作爲參數傳遞給Matlab函數時,只有在函數更新函數時才複製數組,如果該函數只讀取數組,則不進行復制。因此,函數在時間和空間上所付出的任何性能損失只應在函數更新大型數組時才起作用。

我從來沒有用遞歸函數測試過這個,但是我沒有立即明白爲什麼它應該開始複製大數組,如果它只是從中讀取。

所以你的策略是將load這個數組放在函數外面,然後把它作爲參數傳遞給函數。

This note可以澄清。

+0

您建議更改alg.m,以便通過調用alg.m的測試腳本加載並輸入'large5Dmatrix'?這會讓整個事情變得不那麼直觀,'large5Dmatrix'是我正在測試的算法的邏輯的一部分,但如果沒有其他解決方案出現,我會去做。謝謝 – Gianni 2012-08-03 10:03:23

+0

是的,我正在編輯我的答案,因爲你評論。 – 2012-08-03 10:04:43