2012-11-05 81 views
0

我在C++中使用dgesv和dgemm fortran子例程來做一些簡單的矩陣乘法和左分頻。dgesv的舍入誤差?

對於隨機矩陣A和B,I做:

A\(A\(A*B)); 

其中*是使用DGEMM和\使用dgesv定義。顯然,這個表達式應該簡化爲單位矩陣。我正在測試我對MATLAB的答案,我在對角線上得到的或多或少是1,但其他條目非常少(數字在e-15的數量級上,因此它們已經接近0) 。

我只是想知道這個結果是否可以預期?因爲如果我這樣做:

C = A+B; 
D = A*B; 

D\(C\(C*C)); 

結果應該出來給D \ C。基本上,C(C * C)非常準確(與MATLAB完美匹配),但是第二次我做了D \ C我得到了e-1甚至e + 00關閉的東西。我猜這不應該發生?

+0

你能提供一個獨立的可編譯的例子嗎?通常情況下,我希望MATLAB能夠使用完全相同的BLAS/LAPACK調用。 –

+0

它如何簡化到單位矩陣?除非我誤解了某些東西,否則不是'A \(A \(A * B))'簡單地等於'A \(I * B)== A \ B',就像'D \(C \ C * C))'等於'D \ C'?除非'A == B',否則我不會看到你如何期待一個單位矩陣。你的措辭「隨機矩陣A和B」對此不太清楚,但jimvonmoon的答案很可能是正確的。你也可以在MATLAB中通過計算A \(A \(A * A)) - A \ A'進行檢查。內部圓括號可以防止MATLAB將'A \ A = eye(size(A))'縮短並導致精度損失。 – sigma

回答

2

您的問題似乎與C/C++中浮點變量的有限精度有關。你可以閱讀更多關於它here。有一些技術可以最大限度地減少這種影響(其中一些在維基文章中有描述),但是在幾次操作之後總會有一些精確度損失。您可能想要使用一些支持任意精度數的第三方數學庫(例如GMP)。但仍然 - 只要你堅持數值方法的準確性,你的計算總是會被污染。