我清楚地记得专家代码检查i
,j
上的某些条件,如果评估为真,他们会在矩阵中标记。在下面显示的行上的东西。他们在一条线上做到了!有人能说出来吗?在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
上设置了非常简单的条件检查。如果上面编辑过的事情很复杂怎么办?
答案 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
所以,课程 -
将3*i+4*j>=2
替换为bsxfun(@plus,3*ii',4*jj)>=2
,将6*i-j<=6
替换为bsxfun(@plus,6*ii',-1*jj)<=
。为什么bsxfun
?好吧,你有两个嵌套循环,i
和j
作为迭代器,所以你需要形成一个二维掩码,每个掩码都有一个维度。
通过加入前两个条件来形成匹配逻辑数组的完整条件语句,就像在&&
的循环代码中一样。您只需要将其更改为&
。
让逻辑索引处理故事的其余部分!
希望这必须使用条件语句为您提供更复杂的循环代码。
旁注:您还可以在此处使用 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