MATLAB-矢量化包含距离测量的双循环



我正在尝试优化我的代码,但不确定如何以及是否能够向量化这个特定的部分??

for base_num = 1:base_length
for sub_num = 1:base_length
dist{base_num}(sub_num) = sqrt((x(base_num) - x(sub_num))^2 + (y(base_num) - y(sub_num))^2);
end
end

以下示例提供了一种矢量化方法:

%# Set example parameters
N = 10;
X = randn(N, 1);
Y = randn(N, 1);
%# Your loop based solution
Dist1 = cell(N, 1);    
for n = 1:N
for m = 1:N
Dist1{n}(m) = sqrt((X(n) - X(m))^2 + (Y(n) - Y(m))^2);
end
end
%# My vectorized solution
Dist2 = sqrt(bsxfun(@minus, X, X').^2 + bsxfun(@minus, Y, Y').^2);
Dist2Cell = num2cell(Dist2, 2);

N = 1000的快速速度测试使矢量化解决方案比循环解决方案快两个数量级。

注意:我在矢量化解决方案中使用了第二行来模拟您的单元阵列输出结构。取决于你是想把它包括在内还是两个组合成一行等等

顺便说一下,问题中的过帐代码为+1。然而,对未来有两个小建议:1)当发布到SO时,使用简单的变量名,尤其是循环下标,就像我在回答中所做的那样。2) 当我们可以将示例代码直接复制和粘贴到脚本中并运行它,而不必进行任何更改或添加时(同样是在我的回答中),这是很好的。这使我们能够更快地达成解决方案。

最新更新