高斯消除Matlab代码中的失败次数

时间:2013-10-12 23:19:00

标签: matlab linear-algebra linear flops linear-equation

我很难理解为什么这个Matlab代码执行高斯消除而不使用LU分解进行转动需要(2/3) * n^3个触发器。 (FLOP:浮点运算和 FLOPS:每秒浮点运算次数)

function x = GaussianElimination(A,b)

n = length(b);
for k = 1:n-1
    for i = k+1:n
        mult = A(i,k)/A(k,k);
        A(i,k+1:n) = A(i,k+1:n)-mult*A(k,k+1:n);
        b(i) = b(i) - mult*b(k);
    end
end

x = zeros(n,1);
x(n) = b(n)/A(n,n);

for k = n-1:-1:1
    x(k) = (b(k) - A(k,k+1:n)*x(k+1:n))/A(k,k);
end

end

如果有人能向我解释如何计算从k+1开始的那些嵌套循环的翻牌,我将不胜感激。

PS:我不是在谈论算法的复杂性。

1 个答案:

答案 0 :(得分:2)

我终于弄明白了。

FLOP与算法复杂度略有不同,因为低阶项仍然被忽略,但最高阶项前面的系数确实很重要。

在此特定示例中,由于我们忽略了低阶项,我们只查看三重嵌套循环中的+, -, *, /操作,并忽略算法其余部分中的其他浮点操作。即以下行

    A(i,k+1:n) = A(i,k+1:n)-mult*A(k,k+1:n);
  • 第一个循环从1到n
  • 第二个循环从k到n
  • 第三个循环从k运行到n(使用:隐含在Matlab代码中)

因此,当忽略低阶词时,这一行几乎n^3次,精确n*n + (n-1)*(n-1) + ... + 2*2 + 1*1次,相当于(1/3)*n^3次。

但是,此行有两个浮点操作:-操作和*操作。

因此,这会给(2/3)*n^3