我正在使用GNU GSL进行一些矩阵计算。我试图将矩阵B乘以矩阵A的倒数。
现在我注意到GSL的BLAS部分有一个这样做的功能,但只有当A是三角形的时候。这有什么特别的原因吗?此外,进行此计算的最快方法是什么?我应该使用LU分解来反转A,还是有更好的方法?
FWIW,A的形式为P' G P,其中P是正常矩阵,P'是逆矩阵,G是对角矩阵。
非常感谢:)
答案 0 :(得分:4)
我相信Adrien是正确的,因为BLAS没有方形矩阵的反函数。它取决于您用来优化其逆的微积分的矩阵。
通常,您可以使用LU分解,它对任何方阵都有效。我是这样的:
gsl_linalg_LU_decomp(A, p, signum);
gsl_linalg_LU_invert(A, p, invA);
其中A是你希望其反转的方阵,p是gsl_permutation
个对象(置换矩阵被编码的置换对象),signum是置换的符号,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()
函数来提高效率。
我希望它有所帮助!
答案 1 :(得分:3)
仅支持三角矩阵的事实仅仅是因为这种操作对于三角矩阵(其称为反向替换)非常容易执行,而BLAS仅提供低级函数的例程。任何更高级别的函数通常都在LAPACK中找到,它在内部使用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),假设是双精度。
希望这有帮助。
一个。