我的代码似乎运行得很慢,我想不出任何方法可以让它更快。我的所有阵列都已预先分配好。 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
感谢。
答案 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
感谢社区的帮助。