2010-08-23 596 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()函数来使其效率更高。

我希望它有帮助!