我很难理解为什么这个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:我不是在谈论算法的复杂性。
答案 0 :(得分:2)
我终于弄明白了。
FLOP与算法复杂度略有不同,因为低阶项仍然被忽略,但最高阶项前面的系数确实很重要。
在此特定示例中,由于我们忽略了低阶项,我们只查看三重嵌套循环中的+, -, *, /
操作,并忽略算法其余部分中的其他浮点操作。即以下行
A(i,k+1:n) = A(i,k+1:n)-mult*A(k,k+1:n);
:
隐含在Matlab代码中)因此,当忽略低阶词时,这一行几乎n^3
次,精确n*n + (n-1)*(n-1) + ... + 2*2 + 1*1
次,相当于(1/3)*n^3
次。
但是,此行有两个浮点操作:-
操作和*
操作。
因此,这会给(2/3)*n^3
。