在matlab中将一行中的嵌套for循环矢量化

时间:2015-02-10 21:07:33

标签: matlab matrix vectorization

我清楚地记得专家代码检查ij上的某些条件,如果评估为真,他们会在矩阵中标记。在下面显示的行上的东西。他们在一条线上做到了!有人能说出来吗?在Matlab中编写以下行的最有效方法是什么?

for i=1:nrows
    for j=1:ncolumns
        if (3*i+4*j>=2 && 6*i-j<=6)
            obstacle(i,j)=1;
        end
    end
end

修改

我在i,j上设置了非常简单的条件检查。如果上面编辑过的事情很复杂怎么办?

1 个答案:

答案 0 :(得分:2)

您可以在此处使用 logical indexing 并获取 bsxfun 的帮助,以获取类似的复杂条件语句 -

%// Define vectors instead of the scalar iterators used in original code
ii=1:nrows
jj=1:ncolumns

%// Look for logical masks to satisfy all partial conditional statements
condition1 = bsxfun(@plus,3*ii',4*jj)>=2  %//'
condition2 = bsxfun(@plus,6*ii',-1*jj)<=6 %//'

%// Form the complete conditional statement matching logical array
all_conditions = condition1 & condition2

%// Use logical indexing to set them to the prescribed scalar
obstacle(all_conditions) = 1

所以,课程 -

  1. 3*i+4*j>=2替换为bsxfun(@plus,3*ii',4*jj)>=2,将6*i-j<=6替换为bsxfun(@plus,6*ii',-1*jj)<=。为什么bsxfun?好吧,你有两个嵌套循环,ij作为迭代器,所以你需要形成一个二维掩码,每个掩码都有一个维度。

  2. 通过加入前两个条件来形成匹配逻辑数组的完整条件语句,就像在&&的循环代码中一样。您只需要将其更改为&

  3. 让逻辑索引处理故事的其余部分!

  4. 希望这必须使用条件语句为您提供更复杂的循环代码。


    旁注:您还可以在此处使用 ndgrid meshgrid 来构建2D条件/二进制数组这可能更直观 -

    %// Form the 2D matrix of iterators
    [I,J] = ndgrid(1:nrows,1:ncolumns)
    
    %// Form the 2D conditional array and use logical indexing to set all those
    obstacle(3*I+4*I>=2 & 6*I-J<=6) = 1