13

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

谢谢你。

4

6 回答 6

15

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

于 2009-01-07T15:08:19.887 回答
6

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

将矩阵 L 本身保存在内存中并计算

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

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

inv(L)[1 0 0 ...],
inv(L)[0 1 0 ....],
inv(L)[0 0 1 ....]
依此类推,因此您会发现根本不反转它要容易得多。

于 2009-04-29T12:49:46.287 回答
3

给定一个下三角矩阵 L,反向代换可以让您快速求解系统 L x = b 的任意右侧 b。

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

如果您对封闭形式的解决方案感兴趣,则逆的对角元素是原始对角元素的逆元素,并且当您远离对角线时,逆元素的其余元素的公式会变得越来越复杂.

于 2009-04-06T18:07:57.003 回答
2

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

于 2009-01-07T15:09:13.333 回答
1

作为三角矩阵 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
于 2019-08-01T18:53:16.357 回答
-2

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

于 2009-01-07T15:10:50.773 回答