【问题标题】:avoiding for loop for matrix calculations避免用于矩阵计算的 for 循环
【发布时间】:2017-10-21 02:39:07
【问题描述】:

我在 matlab 中编码,由于 matlab 不适用于“for”循环,我需要避免它们,以便尽可能快地完成。这是我处理“for”的代码的一部分。

for i = 1:size(U,1)
    for j=1:size(U,2)        
        v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ...
               + U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j);
    end 
end

我的矩阵中有一个周期性边界条件,这就是我使用“mod”函数的原因。 这段代码其实和matlab中的“del2”函数类似,但是matlab版本不支持周期性边界条件。

【问题讨论】:

  • 请解释一下你所说的 matlab 不能很好地与“for”循环配合使用
  • @BradDay 如果你使用太多的“for”循环,它会增加模拟的运行时间,如果你用 C++ 等其他语言编写相同的代码,它会更快。无论如何,我正在寻找一种替代循环结构,如“for”,就是这样......
  • 嗯。我看不出没有迭代过程可以做到这一点,因为您需要查看拉普拉斯算子的 U(i,j) 的邻居。如果 matlab 执行代码太慢,我唯一可以建议的是尝试使用带有 parfor 的并行 for 循环

标签: matlab performance for-loop coding-efficiency


【解决方案1】:

使用meshgrid的矢量化版本:

[n,m] = meshgrid(1:size(U,2),1:size(U,1));
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ...
    + U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U;

您还可以通过preallocating memory 加快循环速度(可能提高多个数量级)。在这种情况下,只需放

v = zeros(size(U));

在循环前面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多