我正在使用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