2014-03-25 37 views
1

我嘗試使用eig_pair來獲得相同大小的一對稠密方陣A和B的特徵分解,例如A * eigvec = B * eigvec * diagmat(eigval),但結果與Matlab不匹配功能eig。例如:C++線性代數庫armadillo:如何使用eig_pair獲得與Matlab中的eig函數相同的結果?

在Matlab
A= [1,2;3,4]  B=[2,4;5,8] 

[u,v] = eig(A,B) 

結果:

u = 

-1.0000 -0.0000 

0.5000 -1.0000 

v = 

    1.0000   0 
     0 0.5000 

在犰狳:

eig_pair(v,u,A,B) 

結果: U:

9.9301e-016  -1.0000e+000 

1.0000e+000  5.0000e-001 

五:

0.5000 

1.0000 

我的問題是:如何獲得的u匹配在Matlab中的結果,確定價值和v? 期待您的回覆!

+0

你的結果是相同的排列... – Shai

+0

特徵向量並不是唯一的。如果_u_是一個特徵向量,所有_lambda!= 0_都是_lambda * u_。 (根據定義,Eigenvectors不能爲0) –

+0

你是對的..但我不知道如何找到排列並將結果轉換爲匹配Matlab .. – user3459578

回答

4

特徵向量並不是唯一的。如果ü是一個特徵向量,所以是米* ü所有米!= 0。此外,在Matlab中返回特徵向量的順序是任意的。 (我不知道Armadillo以什麼順序返回特徵向量。)你可以可以嘗試通過排序特徵值爲特徵向量創建一個規範的順序,但是如果你有複雜的特徵值,這是有問題的。 (回想一下,實矩陣可以具有複雜的本徵值。)

因此,(-1.0000,0.5000)(的ü在Matlab第一列)是相同的特徵向量作爲(-1.0000e + 000,5.0000e -001)(在Armadillo的的第二列,的第二列)。同樣,當您按-1縮放並解釋浮點錯誤時,(-0.0000,-1.0000)相當於(9.9301e-016,1.0000e + 000)。請注意,即使在數學上等於,也可能存在數字精度錯誤,這會導致浮點值比較不等。

如果您想要特徵向量的規範表示,您可以將它們重新標定爲具有範數1,並且如果第一個元素的符號爲負,也可以乘以-1。當然,如果特徵向量中的第一個元素接近於0,這也是有問題的,因爲由於數字原因該值可能僅僅在零的錯誤邊上結束。因此,想一想,最好確保最大的因素(標準化後) - 而不是第一個 - 是積極的。

+0

謝謝!現在我知道結果爲什麼不同了。但事實上,我實際上做的是將matlab語言轉換爲C++,問題是我需要多次計算矩陣A(300 * 300)和B(300 * 300)對的特徵分解一個循環,因爲Matlab任意地返回特徵向量,所以我不能爲它們每次創建一個規範的次序..... – user3459578

相關問題