【问题标题】:Number of flops in Gaussian Elimination Matlab code高斯消除 Matlab 代码中的失败次数
【发布时间】:2013-10-12 23:19:00
【问题描述】:

我很难理解为什么这个 Matlab 代码在不使用 LU 分解进行旋转的情况下执行高斯消除需要(2/3) * n^3 flops。 (FLOPs:浮点运算和not 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:这里我不是在谈论算法复杂度。

【问题讨论】:

  • 你说的是算法复杂度吗?我对“flops”一词的理解是“Floating point Operations Per Second”的首字母缩写词,通常用megaflops、gigaflops、teraflops等表示。但在这里你似乎在询问算法的复杂性我从未见过用“翻牌”表达。 ???
  • 不,触发器 = 浮点运算。这就是为什么它让我感到困惑,因为它与算法复杂度不同。
  • 很明显,计算机科学指令已经过去了,我的知识不再有用。祝你好运。
  • 经过一些额外的搜索,结果发现 FLOPs 和 FLOPS 是两个不同的首字母缩写词,所以我更新了我的问题。
  • 是的,FLOPS 是浮点运算的次数。请参阅 MathWorks 创始人 Cleve Moler 的 this old post 底部。在 JIT 加速下,今天所说的更加真实。问题是您是否要计算计算机执行的真实失败次数,或人类手动执行算法(如高斯消元法)所使用的次数

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


【解决方案1】:

我终于自己弄明白了。

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

在这个具体的例子中,由于我们忽略了低阶项,所以我们只查看三重嵌套循环中的+, -, *, / 操作,而忽略算法其余部分中的其他浮点操作。即以下行

    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 flops。

但是,该行有两个浮点运算:- 运算和 * 运算。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多