当零元素已知时,改善天真的高斯消除

时间:2014-12-01 14:01:27

标签: matlab linear-algebra

我没有转动就写了天真的高斯消除:

function [x] = NaiveGaussianElimination(A, b)
    N = length(b);
    x = zeros(N,1);
    mulDivOp = 0;
    subAddOp = 0;
    for column=1:(N-1)
        for row = (column+1):N
            mul = A(row,column)/A(column,column);
            A(row,:) = A(row,:)-mul*A(column,:);
            b(row) = b(row)-mul*b(column);
            mulDivOp = mulDivOp+N-column+2; 
            subAddOp = subAddOp +N-column+1;
        end
    end

    for row=N:-1:1
        x(row) = b(row);
        for i=(row+1):N
            x(row) = x(row)-A(row,i)*x(i);
        end
        x(row) = x(row)/A(row,row);
        mulDivOp = mulDivOp + N-row + 1;
        subAddOp = subAddOp + N-row;
    end
    x = x';
    mulDivOp
    subAddOp
    return
end

但我很好奇,如果我知道矩阵的哪些元素是0,我可以减少乘法/除法和加法/减法的次数:

对于N = 10:

A =

    96   118     0     0     0     0     0     0     0    63
   154   -31  -258     0     0     0     0     0     0     0
     0  -168   257  -216     0     0     0     0     0     0
     0     0   202    24   308     0     0     0     0     0
     0     0     0  -262   -36  -244     0     0     0     0
     0     0     0     0   287  -308   171     0     0     0
     0     0     0     0     0   197   229  -258     0     0
     0     0     0     0     0     0   -62  -149   186     0
     0     0     0     0     0     0     0   -43   255  -198
  -147     0     0     0     0     0     0     0  -147  -220

(非零值来自randi)。通常,当abs(i-j)<= 1时,非零元素是a_ {1,N},a_ {N,1}和a_ {i,j}。

1 个答案:

答案 0 :(得分:0)

可能不是。有很好的算法可以减少对角矩阵的三对角矩阵(它们不是很接近但是它们很接近)。实际上,这是使用正交相似变换而非高斯消除产生矩阵的SVD的一种方式。

问题在于,当您使用高斯消除删除第一列中的非零条目时,您将在其他列中引入其他非零条目。越进一步,你就越破坏矩阵的结构。高斯消除可能只是你试图解决的问题的错误方法,至少如果你试图利用矩阵的结构。