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

时间:2012-12-10 01:43:11

标签: matlab optimization vectorization

我正在尝试优化我的代码并且不确定如何以及如果我能够对这个特定部分进行矢量化?

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

1 个答案:

答案 0 :(得分:1)

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

%# 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)当我们可以将示例代码直接复制并粘贴到脚本中并运行它而不必进行任何更改或添加(再次在我的回答中)时,这是很好的。这使我们能够更快地收敛解决方案。