2012-05-22 199 views
1

當我使用eigs時,我似乎獲得不同的性能結果。在相同的矩陣上,呼叫
[c, v] = eigs(A, 2, 'sm'); somtimes需要30秒,有時2秒。
我需要知道是否有使用一些緩存對同一矩陣隨後呼籲eigs因爲我要報時代的加速......爲eigs做matlab緩存解決方案

+0

真的嗎? 30秒?這個矩陣有多大?也許你正在運行一些需要大量CPU的進程? –

回答

1

如果是這樣,這並不似乎是一個通用的功能。我跑在命令行

A = randn(10000); 
B = randn(10000); 
C = B; 
tic; [c1,v1] = eigs(A,2,'sm'); toc; 
tic; [c2,v2] = eigs(A,2,'sm'); toc; 
tic; [c3,v3] = eigs(B,2,'sm'); toc; 
tic; [c4,v4] = eigs(C,2,'sm'); toc 

該項測試,並得到了這個結果

經過的時間32.373128秒。

已用時間爲28.412905秒。

已用時間爲32.752616秒。

已用時間爲29.024055秒。

我很驚訝,因爲通常MATLAB試圖智勝你,並將存儲結果重用。

+0

如果MATLAB試圖通過簡單地返回它所做的最後一件事來規避重複調用,這將是一件壞事。如果你的功能是一個隨機過程呢?你想讓MATLAB返回相同的結果嗎?例如,應該重複調用rand來返回相同的結果嗎?當然不是。但實際上,eigs使用隨機起始值,所以它可能會在最低位產生不同的結果。或者,它可能會返回相同的一組特徵向量,但具有不同的符號。 – 2012-05-22 17:57:28

+0

@woodchips:MATLAB是一種腳本語言。解釋器通常可以確定重複函數調用是否會返回相同的值,尤其是內置函數。正如你所說,它可能是MATLAB知道eigs使用rand調用,所以每次都應該從頭開始。 – Marc

+0

對不起,但我知道一個事實,即MATLAB不會像你說的那樣做,我可以證明這是一個真實的陳述。從3.2版本開始從未如此(早在我作爲一個大用戶時,儘管我有一個早期版本的副本),但在最新版本中仍然不是這樣。 – 2012-05-22 18:28:59

0

在某些情況下,足夠大的矩陣可能會將事物推入虛擬內存,或者不是,這取決於是否有足夠大的連續RAM可用塊。或者,你可能在做一些事情。

您可以通過在測試時觀察過程監視器來驗證發生了什麼。突然有大量的磁盤訪問?如果是這樣,那麼虛擬內存正在被觸摸。是否有一個不同的,不相關的進程正在佔用CPU?