我在使用GNU GSL进行一些矩阵计算。我正在尝试将矩阵B乘以矩阵A的逆。
现在我注意到GSL的BLAS部分有一个函数可以做到这一点,但仅当A为三角形时才能使用该函数。这是有特定原因吗?此外,最快的计算方法是什么?我应该使用LU分解来求A的逆,还是有更好的方法?
顺便说一下,A的形式为P'GP,其中P是一个正常矩阵,P'是它的逆,而G是一个对角矩阵。
非常感谢 :)
我在使用GNU GSL进行一些矩阵计算。我正在尝试将矩阵B乘以矩阵A的逆。
现在我注意到GSL的BLAS部分有一个函数可以做到这一点,但仅当A为三角形时才能使用该函数。这是有特定原因吗?此外,最快的计算方法是什么?我应该使用LU分解来求A的逆,还是有更好的方法?
顺便说一下,A的形式为P'GP,其中P是一个正常矩阵,P'是它的逆,而G是一个对角矩阵。
非常感谢 :)
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
是一个正常的矩阵。我有一段时间没有使用它们了,但是必须有一个针对它们的分解定理,您可以在GSL参考手册第14章或更好的线性代数书中找到它们。
只是一个例子,如果您有对称正定矩阵并希望找到其逆,则可以使用Cholesky分解,这是针对该类型矩阵进行优化的。然后,您可以使用GSL中的gsl_linalg_cholesky_decomp()
和gsl_linalg_cholesky_invert()
函数使其高效。
希望对您有所帮助!
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),假设是双精度。