0

我正在計算使用Cholesky分解使用不同庫的方陣的倒數。然而我的結果並不像我期待的那樣。我不是數學專家,但我期待得到更接近的結果。矩陣求逆Cholesky分解 - >結果不準確

我使用MLK,岩漿和CULA庫來計算CPU和GPU中矩陣的逆矩陣。 經過計算後,我發現這些庫的結果總是不同的一個元素。說我要來計算A= [0.237306,0.000458;0.000458,0.238497]倒數:

A[0] = 0.237306 
A[1] = 0.000458 
A[2] = 0.000458 
A[3] = 0.238497 

我得到的結果是:

inv(A)[0] = 4.213983 
inv(A)[1] = -0.008092 
inv(A)[2] = 0.000458 
inv(A)[3] = 4.192946 

但是,正確的結果應該是

4.2139841 -0.0080924 
    -0.0080924 4.1929404 

正如你所看到的,inv(A)[3]是不同的,儘管其餘的都很好。那麼Cholesky Inversion是如何工作的?這是一個正確的/近似的結果,還是我在這裏做錯了什麼?

+0

要麼提供使用庫的信息,要麼嘗試http://math.stackexchange.com/ – ipavlic 2012-07-20 12:02:14

+7

您確定這些值都應該可用嗎?典型的對稱矩陣庫只用作矩陣的一邊輸出,依靠你通過對稱完成另一邊。請張貼導致結果的代碼大綱。 – 2012-07-20 12:07:44

回答

3

我明白髮生了什麼事。這個庫計算矩陣的倒數,如Alexandre C指出的那樣,上限或下限。因此,根據您傳遞給庫(Upper或Lower)的參數,它會計算矩陣的上邊或下邊的倒數。 我以爲你可以計算完整的逆矩陣,但顯然這是不可能的。

1

這可能是由於IEEE規範的浮點數和與它們一起工作的不精確性。

如果您指定了32位或64位浮點數,您不會說。嘗試提高你的精確度。

另一點需要注意的是人們通常不計算矩陣的逆矩陣,因爲它容易受到四捨五入誤差的影響。更好的選擇是LU分解和前向替換。

你從哪裏得到「正確」答案?你如何評價你的結果的正確性?

我知道這是不是數值方法的最佳工具,但如果我把你的矩陣:

0.237306 0.000458 0.000458 0.238497

,並通過MINVERSE運行它,我得到這個回答:

4.213984 -0.00809 -0.00899 4.19294

我可以乘以原和逆看看,如果我得到一個識別矩陣回檢查它的有效性。下面是我離開MMULT的:

2.1684e-19 -2.168e-19

這就是一個數值方法的人更願意稱之爲單位矩陣。

所以我說我得到的答案是正確的。你應該以同樣的方式檢查你的,並閱讀What Every Computer Scientist Should Know About Floating Point Arithmetic