首页 > 解决方案 > 嵌套 for 循环在所有情况下都太慢?

问题描述

我在 Matlab 中编写本科课程的数字方法,我发现使用大量嵌套循环的代码太慢了,而不是使用大量浮点运算(加法、乘法等)的代码。有谁知道是否存在关于这个事实的论文或研究(嵌套循环很慢)。我不明白,在大多数情况下,这取决于代码的优化程度,但一般来说是真的吗?在谷歌,我找不到任何关于这个事实的论文。

我在matlab中有这段代码

function [L,operaciones]=CholeskyInc(A)
tic
[n,m]=size(A);
operaciones = 0;
if n~= m; error('A no es cuadrada');
else
    L=speye(n,n);
    for k=1:n
       L(k,k)=sqrt(A(k,k));
       for i=k+1:n
           if A(i,k)~=0
               L(i,k)=A(i,k)/A(k,k);
           end
       end
       for j=k+1:n
           for i=j:n
               if (A(i,j))~=0
                   L(i,j)=A(i,j)-A(i,k)*A(j,k);
               end
           end
       end
    end
    L = tril(A);
toc
end

对于大型矩阵(例如 625x625),此代码需要 2 分钟以上来计算矩阵,但它似乎是一个简单的代码

标签: matlaboptimizationfloating-pointtime-complexitynumeric

解决方案


有谁知道是否存在关于这个事实的论文或研究(嵌套循环很慢)。

嵌套循环太慢没有一般原则。

您可能已经看到一些建议,即按列访问数组(当它们以行优先顺序存储时)很慢。这是由于硬件设计可以快速访问相邻元素(因为它们是从内存中分组获取并保存在高速缓存中),而访问多个相隔很远的元素却很慢。我将此作为与您的问题的模糊匹配提出来。还有许多其他关于算法和硬件的问题会导致效率低下或效率低下。


推荐阅读