【问题标题】:Is there around a straightforward way to invert a triangular (upper or lower) matrix?是否有一种直接的方法来反转三角形(上或下)矩阵?
【发布时间】:2010-09-30 01:18:49
【问题描述】:

我正在尝试实现一些基本的线性代数运算,其中一个运算是三角(上和/或下)矩阵的求逆。有没有简单稳定的算法来做到这一点?

谢谢。

【问题讨论】:

标签: c++ math matrix linear-algebra triangular


【解决方案1】:

是的,使用back substitution。矩阵求逆的标准算法是求其 LU 分解(分解为下三角矩阵和上三角矩阵),对三角块使用反代换,然后将结果组合得到原始矩阵的逆矩阵。

【讨论】:

  • 我试图得到一个 triangular 矩阵的逆矩阵,而不是一个方阵。反向替换应该如何帮助我获得三角形的倒数?
  • 根据定义,三角矩阵是正方形的。
  • 此外,只有方阵才有逆矩阵。
【解决方案2】:

如果可以,请不要颠倒它。这是数值线性代数的基本戒律之一。

将矩阵 L 本身保存在内存中并进行计算会更快且数值更稳定

inv(L)b
当您需要使用 inv(L) 做其他事情时,可以使用反向替换。

请注意,用于反转它的惯用算法需要求解系统

inv(L)[1 0 0 ...],
inv(L)[0 1 0 ....],
inv(L)[0 0 1 ....]
等等,所以你会看到根本不反转它要容易得多。

【讨论】:

    【解决方案3】:

    给定一个下三角矩阵 L,反向代换可以解决系统 L x = b 快速为任何右侧 b。

    要反转 L,您可以求解此系统的右侧 e1=(1,0,...,0), e2=(0,1,...,0), ..., en =(0,0,...,1) 并将得到的解向量组合成一个(必须是下三角)矩阵。

    如果您对封闭形式的解决方案感兴趣,则逆对角元素是原始对角元素的逆元素,并且逆元素的其余元素的公式会随着您的移动而变得越来越复杂对角线。

    【讨论】:

      【解决方案4】:

      如果您谈论的是单精度实数,请查看 LAPACK 例程 STRTRISTRTI2 的源代码。

      【讨论】:

        【解决方案5】:

        作为三角矩阵A的B逆,可以使用如下MATLAB代码:

        n = size(A,1);
        B = zeros(n);
        for i=1:n
            B(i,i) = 1/A(i,i);
            for j=1:i-1
                s = 0;
                for k=j:i-1
                    s = s + A(i,k)*B(k,j);
                end
                B(i,j) = -s*B(i,i);
            end
        end
        

        【讨论】:

          【解决方案6】:

          哇,这几乎是数值分析课程内容的一半。标准算法会做,还有一堆固定代码here。这个和大多数其他常见数值分析问题的最终来源是Numerical Recipes

          【讨论】:

          • 倒置三角矩阵并不是数值分析课程内容的一半。三角矩阵求逆很简单,朴素算法是稳定的。
          • 要做行旋转。天真不会稳定。
          • 旋转(例如,通过高斯消元法)将线性系统变成三角形形式,然后通过反向代入求解。至于稳定性,请参见 Nicholas Higham 的《数值算法的准确性和稳定性》一书,第二版的第 140 页。
          猜你喜欢
          • 1970-01-01
          • 2011-08-27
          • 2011-06-16
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-18
          • 1970-01-01
          相关资源
          最近更新 更多