【问题标题】:Inverting a matrix of any size反转任意大小的矩阵
【发布时间】:2015-05-31 15:53:37
【问题描述】:

我正在使用GNU Scientific Library 来实现一个需要能够将矩阵求幂的计算器。不幸的是,GSL 中似乎没有这样的函数可用于矩阵乘法(gsl_matrix_mul_elements() 函数仅使用加法过程进行乘法),并且通过扩展,没有提升幂。

我希望能够提升到负面力量,这需要逆向的能力。从我的搜索中,我找不到任何用于计算任意矩阵的逆矩阵(只有具有定义维度的矩阵)的声音代码,并且我发现的手动操作指南使用了巧妙的“纸上技巧” '在代码中不能真正工作。

是否有一种通用算法可用于计算任意大小矩阵的逆矩阵(当无法计算逆矩阵时当然会失败)?

【问题讨论】:

  • 只有方阵(然后只有其中一些)可以反转。
  • 没关系。但是,我想要一个可以对任何大小的方阵执行此操作的函数。
  • 你熟悉LU分解吗?
  • 我不是,但我现在确实看到了 GSL 文档中的部分。
  • 一旦你计算出逆,你可以写一个简单的递归函数来快速计算负幂。

标签: c matrix inverse exponent matrix-inverse


【解决方案1】:

如 cmets 中所述,可以为整数指数的方阵计算矩阵的幂。 n 的幂 AA^n = A*A*...A,其中 A 出现 n 次。如果BA 的倒数,那么A-n 幂就是A^(-n) = (A^-1)^n = B^n = B*B*...B

因此,为了计算 An 幂,我可以建议使用 GSL 的以下算法:

gsl_matrix_set_identity();         // initialize An as I
for(i=0;i<n;i++) gsl_blas_dgemm(); // compute recursive product of A

要计算B 矩阵,您可以使用以下例程

gsl_linalg_LU_decomp();       // compute A decomposition
gsl_linalg_complex_LU_invert  // comput inverse from decomposition

【讨论】:

  • 本说明不解释获取gsl_linalg_LU_decomp()所需的gsl_permutation_t作为参数的方法。其中的数据需要已经初始化。
  • @2mac gsl_permutation_t 并不总是需要。这取决于数据的存储方式。该问题没有提供任何相关信息。
  • 但是,在查看gsl_linalg_LU_decomp() 的来源时,它要做的第二件事是检查排列的大小是否等于矩阵的size1 值。如果我没有正确初始化它,这将返回 false(嗯,真的未定义),并且调用将失败。
  • @2mac 我不明白问题的根源,但请注意,只有方阵是可逆的。
  • gsl_linalg_LU_decomp() 需要 gsl_permutation 作为其第二个参数。这个gsl_permutation 在函数中使用,它需要基于作为第一个参数给出的矩阵具有某些值。如果我没有正确初始化排列,调用将失败,因为不知道我给了它什么数据,并且仅仅初始化大小不是一个选项,因为排列值稍后在 decomp 中使用。这与矩阵是否为正方形无关。它与内存以及如何初始化数据有关,这在 C 中是基本的。
【解决方案2】:

我建议阅读 gsl 实现的 SVD。如果你的矩阵是可逆的,那么通过 SVD 计算它是一个不错的方法,虽然有点慢。如果您的矩阵不可逆,则 SVD 允许您计算下一个最好的东西,generalised inverse

在矩阵计算中,浮点运算中固有的误差会累积得惊人。一个例子是Hilbert matrix,一个看起来很无辜的东西,条件数非常大,即使是在相当适中的维度上也是如此。反演例程的一个很好的测试是查看它可以反转多大的希尔伯特矩阵,以及计算出的矩阵与恒等式的倒数有多接近。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 2016-03-03
    • 1970-01-01
    • 2011-09-16
    • 2016-11-11
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多