我正在使用GNU GSL來做一些矩陣計算。我試圖將矩陣B與矩陣A的逆相乘。GSL/BLAS:將矩陣與逆矩陣相乘
現在我已經注意到GSL的BLAS部分有一個功能來做到這一點,但只有當A是三角形時。這是否有特定的原因?另外,做這個計算最快的方法是什麼?我應該使用LU分解來反轉A,還是有更好的方法?
FWIW,A的形式爲P'G P,其中P是一個常規矩陣,P'是它的倒數,G是一個對角矩陣。
多謝:)
我正在使用GNU GSL來做一些矩陣計算。我試圖將矩陣B與矩陣A的逆相乘。GSL/BLAS:將矩陣與逆矩陣相乘
現在我已經注意到GSL的BLAS部分有一個功能來做到這一點,但只有當A是三角形時。這是否有特定的原因?另外,做這個計算最快的方法是什麼?我應該使用LU分解來反轉A,還是有更好的方法?
FWIW,A的形式爲P'G P,其中P是一個常規矩陣,P'是它的倒數,G是一個對角矩陣。
多謝:)
:
,只有三角矩陣支持,這一事實很簡單,因爲這種操作是很容易的三角矩陣(其稱爲回代)來執行BLAS只提供低級函數的例程。任何更高級別的函數通常都在LAPACK中使用,BLAP內部使用BLAS進行按塊操作。
在具體的情況下,你正在處理:A:=P'*G*P
,如果P
是一個正常的矩陣,那麼A
的倒數可以寫成inv(A) := P'*inv(G)*P
。然後,您有兩種選擇:
inv(A)
與B
相乘。inv(A)
的不同因素:乘法B
由P
(在左側),然後重新調整的結果的每一行與G
的對角線元素的逆,然後用P'
(再次左)再次繁殖。根據具體情況,您可以選擇您的方法。無論如何,假設雙精度,您需要dgemm
(矩陣矩陣乘法,Lvl3 BLAS)和dscal
(線的縮放,Lvl 1 BLAS)。
希望這會有所幫助。
A.
我相信阿德里安是正確與BLAS不必爲方陣的反函數的原因。它取決於你用來優化其逆矩陣的矩陣。
一般而言,您可以使用LU分解,它對任何方形矩陣均有效。一,即是這樣的:
gsl_linalg_LU_decomp(A, p, signum);
gsl_linalg_LU_invert(A, p, invA);
其中A是你想要它的逆方陣,p是gsl_permutation
對象(其中置換矩陣編碼的置換對象),正負號是置換的符號invA是A的倒數。
由於您聲明A = P' G P
爲P
正常,並且G
對角線,因此A
可能是一個常規矩陣。我有一段時間沒有用過它們,但是它們必須有一個分解定理,在線性代數書中,你可以在Chapter 14 of the GSL reference manual中找到甚至更好。只是一個例子,如果你有對稱正定矩陣並且想要找到它的逆矩陣,你可以使用Cholesky因式分解,它對這種矩陣進行了優化。然後,您可以在GSL中使用gsl_linalg_cholesky_decomp()
和gsl_linalg_cholesky_invert()
函數來使其效率更高。
我希望它有幫助!
感謝您的回覆。我不確定排列來自哪裏。你是否因爲我的一個矩陣被稱爲「P」而混淆了某些東西? 你說得對,我實際上可以將我的問題重新定義爲(P')* G * P * X = B,但是我沒有看到你如何能夠進一步推導出你的建議?你介意詳細介紹一下嗎? 另外,請不要這麼說,雖然我的矩陣A是由P'* G * P組成的,但這不是某種特徵值分解,如果你正在思考這些問題。 – Tom 2010-08-23 17:47:05
我的錯誤,...我之前正在處理排列矩陣,...我將編輯帖子以糾正。 – Adrien 2010-08-24 09:39:50