2010-08-23 179 views
4

我正在使用GNU GSL來做一些矩陣計算。我試圖將矩陣B與矩陣A的逆相乘。GSL/BLAS:將矩陣與逆矩陣相乘

現在我已經注意到GSL的BLAS部分有一個功能來做到這一點,但只有當A是三角形時。這是否有特定的原因?另外,做這個計算最快的方法是什麼?我應該使用LU分解來反轉A,還是有更好的方法?

FWIW,A的形式爲P'G P,其中P是一個常規矩陣,P'是它的倒數,G是一個對角矩陣。

多謝:)

回答

3
簡而言之

,只有三角矩陣支持,這一事實很簡單,因爲這種操作是很容易的三角矩陣(其稱爲回代)來執行BLAS只提供低級函數的例程。任何更高級別的函數通常都在LAPACK中使用,BLAP內部使用BLAS進行按塊操作。

在具體的情況下,你正在處理:A:=P'*G*P,如果P是一個正常的矩陣,那麼A的倒數可以寫成inv(A) := P'*inv(G)*P。然後,您有兩種選擇:

  1. 構建inv(A)B相乘。
  2. 依次乘B配inv(A)的不同因素:乘法BP(在左側),然後重新調整的結果的每一行與G的對角線元素的逆,然後用P'(再次左)再次繁殖。

根據具體情況,您可以選擇您的方法。無論如何,假設雙精度,您需要dgemm(矩陣矩陣乘法,Lvl3 BLAS)和dscal(線的縮放,Lvl 1 BLAS)。

希望這會有所幫助。

A.

+0

感謝您的回覆。我不確定排列來自哪裏。你是否因爲我的一個矩陣被稱爲「P」而混淆了某些東西? 你說得對,我實際上可以將我的問題重新定義爲(P')* G * P * X = B,但是我沒有看到你如何能夠進一步推導出你的建議?你介意詳細介紹一下嗎? 另外,請不要這麼說,雖然我的矩陣A是由P'* G * P組成的,但這不是某種特徵值分解,如果你正在思考這些問題。 – Tom 2010-08-23 17:47:05

+0

我的錯誤,...我之前正在處理排列矩陣,...我將編輯帖子以糾正。 – Adrien 2010-08-24 09:39:50

4

我相信阿德里安是正確與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 PP正常,並且G對角線,因此A可能是一個常規矩陣。我有一段時間沒有用過它們,但是它們必須有一個分解定理,在線性代數書中,你可以在Chapter 14 of the GSL reference manual中找到甚至更好。只是一個例子,如果你有對稱正定矩陣並且想要找到它的逆矩陣,你可以使用Cholesky因式分解,它對這種矩陣進行了優化。然後,您可以在GSL中使用gsl_linalg_cholesky_decomp()gsl_linalg_cholesky_invert()函數來使其效率更高。

我希望它有幫助!