【问题标题】:MATLAB - Vectorize a double loop containing a distance measureMATLAB - 向量化包含距离测量的双循环
【发布时间】:2012-12-10 13:23:16
【问题描述】:

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

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

【问题讨论】:

    标签: matlab optimization vectorization


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

    【讨论】:

    • 哇,感谢您的快速回复!我在每个单元格中创建了一个带有向量的单元格数组的原因是“N”变量是可调整的,所以我不知道需要多少个向量。如果这有意义吗?
    • @user1878019 没有问题。如果您认为我的回答令人满意,请随时用勾选标记将其标记为已回答。否则,如果有任何问题,请告诉我,我会尝试改进答案。 编辑:是的,这是有道理的,我会更新我的答案
    • @user1878019 嗯...你是说XY的长度是T,有时T等于N,但有时@ 987654329@ 可能大于N?另外,你知道N 在开始循环之前的值吗?
    • 是的,X、Y 和 N 都等于 T,但 'T' 会改变。使用数字矩阵,我猜我能够创建一个 T by T 矩阵?如果这是真的,那么我认为发布的解决方案是完美的,但我不熟悉 bsxfun 和减号函数?是的,在循环开始之前 N 的值是已知的
    • @user1878019 bsxfun 是一个非常有用的功能。但是要掌握它确实需要一段时间,所以一开始不要气馁。事实上,我一开始就觉得很困惑,所以我发布了a question dedicated entirely to the use of this function。另外,如果在循环开始之前知道N,那么我的解决方案就可以了。如果N 小于T,您可以只限制Xbsxfun 行中检查的索引。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 2013-02-18
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多