GSL / BLAS:将矩阵与逆矩阵相乘

时间:2010-08-23 15:13:22

标签: math matrix linear-algebra gsl

我正在使用GNU GSL进行一些矩阵计算。我试图将矩阵B乘以矩阵A的倒数。

现在我注意到GSL的BLAS部分有一个这样做的功能,但只有当A是三角形的时候。这有什么特别的原因吗?此外,进行此计算的最快方法是什么?我应该使用LU分解来反转A,还是有更好的方法?

FWIW,A的形式为P' G P,其中P是正常矩阵,P'是逆矩阵,G是对角矩阵。

非常感谢:)

2 个答案:

答案 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 PP正常且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。然后你有两个选择:

  1. 构建inv(A)并将其与B相乘。
  2. 依次将B乘以inv(A)的不同因子:将B乘以P(左侧),然后使用对角元素的倒数重新缩放结果的每一行G然后再次与P'相乘(再次左)。
  3. 根据具体情况,您可以选择您的方法。无论如何,你需要dgemm(矩阵 - 矩阵乘法,Lvl3 BLAS)和dscal(线的缩放,Lvl 1 BLAS),假设是双精度。

    希望这有帮助。

    一个。