[英]Calculating an inverse matrix in Matlab
我正在運行一個優化算法,該算法需要計算矩陣的逆。 該算法的目標是從矩陣A中消除負值並獲得新的矩陣B。基本上,我從已知的相同大小的平方矩陣B和C開始。
我首先計算等於的矩陣A:
A = B ^ -1 * C
或在Matlab中:
A = B\\C;
我使用它是因為Matlab告訴我B\\C
比inv(B)*C
更准確。
然后將A中的負值除以2,然后對A進行歸一化,使其行的長度為1。使用這個新的A,我計算出一個新的B,其值如下:
(1 / N)* A * C'= B ^ -1
其中N只是一個比例因子(A中的列數)。 然后,將在第一步中再次使用新的B,並且這些迭代將繼續進行,直到A中的負數消失。
我的問題是我必須根據第二個方程式計算B,然后對其進行歸一化。
invB = (1/N)*A*C'; B = inv(invB);
我一直在使用inv(B^-1)
計算B,但是經過幾次迭代,我開始收到消息,說B^-1
“接近奇異或縮放比例很差”。
該算法實際上適用於較小的矩陣(大約70x70),但是當它達到大約500x500時,我開始收到這些消息。
有沒有更好的方法來計算inv(B^-1)
?
您絕對應該警告有關奇異矩陣的警告。 當您向條件數高的矩陣移動時,數值線性代數的結果往往會分解。 基本思想是
A*b_1 = c
並且我們實際上正在解決問題(因為使用計算機時我們使用的是近似數字)
(A + matrix error)*b_2 = (c + vector error)
b_1和b_2作為矩陣和向量誤差的函數有多接近? 當A的條件數較小時,b_1和b_2接近。 當A具有較大的條件數時,b_1和b_2不關閉。
您可以對算法進行有益的分析。 在每次迭代中,找到B后,請使用Matlab查找其條件編號。 這是
cond(B)
您可能會看到這個數字迅速攀升。 這表明,每次迭代算法時,您應該越來越信任B的結果。
諸如此類的問題一直在數值數學中出現。 如果您將經常使用數值算法,那么您應該花一些時間來熟悉條件編號在現場的作用以及如上所述的預處理技術。 我首選的文字是Lloyd Trefethen的“數值線性代數”,但是有關數值代數的任何文字都應解決其中一些問題。
祝你好運,安德魯
主要問題是矩陣的條件數很高(例如,您的情況中的rcond(B)很小)。 我猜這是由於算法中的迭代結構造成的。 每次迭代時,小的奇異值會越來越小,因此條件數呈指數增長。 您應該檢查預處理以避免這種行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.