是否有一种简单的方法来反转三角形(上部或下部)矩阵?

时间:2009-01-07 15:00:23

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

我正在尝试实现一些基本的线性代数运算,其中一个运算是三角形(上部和/或下部)矩阵的反演。有没有一个简单而稳定的算法呢?

谢谢。

6 个答案:

答案 0 :(得分:14)

是的,请使用back substitution。反转矩阵的标准算法是找到它的LU分解(分解成下三角形和上三角矩阵),在三角形片上使用反向替换,然后组合结果以获得原始矩阵的逆。

答案 1 :(得分:6)

如果可以的话,不要颠倒它。这是数值线性代数的基本诫命之一。

将矩阵L本身保留在内存中,并且只要你需要用inv(L)做其他事情就用后向替换计算

inv(L)b
,速度和数值更稳定。

< / p>

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

inv(L)[1 0 0 ...],
inv(L)[0 1 0 ....],
inv(L)[0 0 1 ....]
等等,所以你会发现它根本不容易反转它。

答案 2 :(得分:3)

给定较低的三角矩阵L,backsubstitution允许您解决系统 L x = b 快速为任何右手b。

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

如果你对封闭形式的解决方案感兴趣,那么逆的对角线元素是原始对角线元素的逆,当你离开时,逆的其余元素的公式变得越来越复杂从对角线。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

作为三角形矩阵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