2013-03-26 59 views
5

我使用eigs來計算大(數以萬計)的稀疏平方矩陣的特徵向量。 我想要的是最小的一組特徵向量。 但是爲什麼eigs('lm')比eigs('sm')快得多

eigs(A, 10, 'sm')  % Note: A is the matrix 

運行非常緩慢。

但是,使用eigs(A,10,'lm')給了我相對更快的答案。 正如我試過的,用eigs(A,10,'lm')中的A_width替換10,使其包含所有的特徵向量,並不能解決這個問題,因爲這使得它與使用'sm' 。因此,我想知道爲什麼計算最小的向量(使用'sm')比計算最大的向量要慢得多?

順便說一句,如果你對如何使用'sm'和'lm'一樣快使用eigs,請告訴我。

回答

1

由於eigs實際上是一個m文件函數,我們可以對其進行配置。我已經運行了幾個基本的測試,並且非常依賴於矩陣中數據的性質。如果我們分別在下面的代碼兩行運行探查:

eigs(eye(1000), 10, 'lm'), and 
eigs(eye(1000), 10, 'sm'), 

然後在第一種情況下調用arpackc(即所從事的工作的主要功能 - 在eigs根據意見,它可能從here)一共22次。在第二種情況下,它被稱爲103次。

在另一方面,

eigs(rand(1000), 10, 'lm'), and 
eigs(rand(1000), 10, 'sm'), 

我得到的結果,其中'lm'選項一致呼籲arpackcsm選項很多次嘗試它。

我怕我不知道該算法的細節,所以不能在任何更深的數學意義上的解釋,但我的鏈接頁面顯示ARPACK是最好的一些結構矩陣。由於由rand生成的矩陣幾乎沒有結構,因此假設我描述的後一種行爲不是您在正常操作條件下所期望的可能是安全的。

簡而言之:它只是需要的算法迭代次數越多,當你問它的結構化矩陣的特徵值最小的收斂。然而,這是一個反覆的過程,它非常依賴於你給它的實際數據。

編輯:有豐富的有關此方法here信息和參考,並理解的關鍵究竟爲什麼發生這種情況肯定是其中所含的地方。

+0

感謝您的回覆wakjah。我會嘗試有時閱讀你的鏈接信息。 – 2013-03-27 07:25:59

+0

'lm'的計算次數比'sm'少得多。我想只有這樣才能知道爲什麼要學習eigs中使用的算法,它可以在wakjah提供的'here'鏈接中找到。 – 2013-03-29 02:04:58

+0

'eigs'是爲稀疏矩陣設計的,對它進行非稀疏輸入分析就沒有用。 – rubenvb 2013-11-21 09:03:15

5

在幾乎任何標準eigs函數中使用的算法是(的一些變化)的Lanczos algorithm。它是迭代的,第一次迭代給你最大的特徵值。這就解釋了幾乎每一個觀察你做:

  1. 最大特徵值採取迭代量最少,
  2. 最小特徵採取迭代的最大數量,
  3. 全部特徵也採取迭代的最大數量。

有一些技巧可以「愚弄」eigs,通過實際使其成爲另一個問題的最大特徵值來計算最小的特徵值。這通常通過移位參數來完成。瀏覽the Matlab documentation for eigs,我發現他們有一個sigma參數,這可能對您有所幫助。注意,如果矩陣適合內存,相同的文檔建議適當的eig,因爲eigs有它的數字怪癖。

1

其原因實際上要簡單得多,並且由於解決大型稀疏特徵值問題的基礎。這些都是立足於解決:

(1) A x = lam x 

大多數解決方法使用(一個Krylov子空間中都蘭克澤斯和阿諾爾迪方法跨越例如)一些功法

的事情是一個冪級數收斂於(1)的最大特徵值。因此,我們已經知道最大特徵值是由子空間找到的:K^k = {A*r0,....,A^k*r0},其僅需要矩陣向量乘法(便宜)。

要找到最小的,我們必須重新制定(1)如下:

(2) 1/lam x = A^(-1) x or A^(-1) x = invlam x 

現在求解(2)等價於求的最小特徵值最大特徵值(1)。在這種情況下子空間跨越K^k = {A^(-1)*r0,....,A^(-k)*r0},這需要解決幾個線性系統(昂貴的!)。

希望這個

相關問題