有點背景優先。我找到了一個實對稱矩陣的特徵值和特徵向量,其中行總和爲0.更具體地說,一旦我找到一個特徵向量,我使用$ argsort $來查找排列其中一個特徵值的排列,並將排列應用於原始矩陣。numpy中的精確性:比較數字時的問題
現在,我使用numpy包在python中實現了代碼。代碼本身是遞歸的,如果它在特徵向量中找到一組相等的值,則它提取對應於我們具有相等值的索引的對稱子矩陣,並將算法重新應用於此矩陣。雖然這一切都很好,而且大部分都是咕嚕咕嚕的工作,但是當一堆應該與特徵向量中的相等條目相對應的索引沒有被識別爲具有相等的值時,我感到驚訝。問題是這些值是通過一些算法計算出來的(可能是Lanczos,但我對numpy並不完全熟悉)。這是一個示例輸出,其中我明確檢查兩個條目之間的差在本徵向量:
>>> T=spectral.seriation(A,index)
columns [ 0 1 2 3 4 5 6 7 8 9 10 11]
[ 3.30289130e-01 -2.75240941e-01 -2.75240941e-01 3.30289130e-01
-2.75240941e-01 3.30289130e-01 -2.75240941e-01 3.30289130e-01
3.30289130e-01 -2.75240941e-01 -1.69794463e-16 -2.75240941e-01]
[ 4 6 9 1 2 11 10 0 5 7 8 3]
difference -5.55111512313e-17
例程系列化()是一個遞歸函數。浮點數組是正在考慮的特徵向量,下面的數組給出了列的排序順序。請注意,列[4,6,9,1,2,11]具有相同的值。但是,特徵向量和特徵值計算總是近似值,實際上,當我輸出第9列和第2列中的入口之間的差值時,它不是零。如果算法應該將[4,6,9,1,2,11]組合在一起,那麼它只將[4,6,9]分組,並將其餘的組合放在另一個組中,向作品中投擲扳手。
所以問題是這樣的:有沒有一種方法來執行numpy的任意精度計算?如果做不到這一點,這個問題會是一個「好」的解決方法嗎?
另外,我應該提到,它可以在數學上證明這些條目必須相同。這是矩陣的一個屬性,但希望與這個問題沒有密切關係。
正如@amit已經說過的,不要檢查與浮點數的相等性。檢查它們是否在容錯範圍內。如果你想要一個'numpy'函數,使用'numpy.allclose(a,b)'而不是'a == b'。爲了更直接地回答你的問題,雖然,numpy不支持任意精度。 (你可以使用'decimal'對象數組來僞造它,但是1)會破壞numpy數組的全部目的,2)'numpy.linalg'使用lapack,它不支持任意精度,所以你不會在這種情況下獲得任何東西。) – 2012-01-09 17:37:56