代码运行速度很慢

时间:2016-06-07 12:00:54

标签: performance matlab loops

我的代码似乎运行得很慢,我想不出任何方法可以让它更快。我的所有阵列都已预先分配好。 S是大量元素(例如10000个元素)。我知道我的代码运行缓慢,因为“for k = 1:S”但我想不出另一种方法以相对较快的速度执行这个循环。我可以请求帮助,因为它需要几个小时才能运行。

[M,~] = size(Sample2000_X);
[N,~] = size(Sample2000_Y);
[S,~] = size(Prediction_Point);

% Speed Preallocation
Distance = zeros(M,N);
Distance_Prediction = zeros(M,1);

for k=1:S
    for i=1:M
        for j=1:N
            Distance(i,j) = sqrt(power((Sample2000_X(i)-Sample2000_X(j)),2)+power((Sample2000_Y(i)-Sample2000_Y(j)),2));
        end
        Distance_Prediction(i,1) = sqrt(power((Prediction_Point(k,1)-Sample2000_X(i)),2)+power((Prediction_Point(k,2)-Sample2000_Y(i)),2));
    end
end

感谢。

2 个答案:

答案 0 :(得分:0)

您的矩阵Distance不依赖于k,因此您可以在主for循环之外轻松计算它,例如使用:

    d = sqrt((repmat(Sample2000_X, [1,M]) - repmat(Sample2000_X', [M,1])).^2 + (repmat(Sample2000_Y, [1,N]) - repmat(Sample2000_Y', [N,1])).^2);

我假设M=N,因为否则您的代码无法正常工作。接下来,您可以计算Distance_Prediction矩阵。你在for循环k内计算它是很奇怪的,因为矩阵将在每次迭代中改变而不使用它。无论如何,这将与您的代码完全相同:

    for k=1:S
        Distance_Prediction = sqrt((Sample2000_X - Prediction_Point(k,1)).^2 + (Sample2000_Y - Prediction_Point(k,1)).^2);
    end

答案 1 :(得分:0)

我意识到主要问题是组织我的代码。我在循环中执行计算,绝对没有必要。所以我将代码分成两个块,它的工作速度要快得多。

for i=1:M
    for j=1:N
        Distance(i,j) = sqrt(power((Sample2000_X(i)-Sample2000_X(j)),2)+power((Sample2000_Y(i)-Sample2000_Y(j)),2));
    end
end

for k=1:S
    for i=1:M
    Distance_Prediction(i,1) = sqrt(power((Prediction_Point(k,1)-Sample2000_X(i)),2)+power((Prediction_Point(k,2)-Sample2000_Y(i)),2));
    end
end

感谢社区的帮助。

相关问题