我正在尝试优化我的代码,但不确定如何以及是否能够对这个特定部分进行矢量化?
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
我正在尝试优化我的代码,但不确定如何以及是否能够对这个特定部分进行矢量化?
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)当我们可以将示例代码直接复制并粘贴到脚本中并运行它而无需进行任何更改或添加(再次如我的回答中)时,这很好。这使我们能够更快地收敛到一个解决方案。