将嵌套的for循环和if语句向量化

5
我正在尝试向量化以下嵌套循环,以便无需使用循环来绘制数值:
for i=1:size(validMaskX,1)
   for j=1:size(validMaskX,2)
      if( validMaskX(i,j) )
         plot(ah, [dataX(i,j) dataX(i,j+1)], [dataY(i,j) dataY(i,j+1)], 'g-')               
      end
    end
 end
  • validMaskX的尺寸为45x44
  • dataX和dataY的尺寸均为45x45

有关如何执行此操作的任何建议?


未经测试,但是 vind=find(validMaskX); vindn = vind + size(validMaskX, 1); plot(ah, [dataX(vind), dataX(vindn)], [dataY(vind), dataY(vindn)] ); 能够正常工作吗?这是在假设 validMaskXdataXdataY 具有相同的行数的情况下。 - zeeMonkeez
你想要把所有的线都放在同一个坐标轴上吗?因为你的代码是逐条绘制一条线,所以你需要用一个循环来处理时间项。 - Adiel
3个回答

2

使用

vind=find(validMaskX);
vindn = vind + size(validMaskX, 1);

您可以找到有效点和第二个索引。然后,您可以使用绘图。

plot(ah, [dataX(vind), dataX(vindn)], [dataY(vind), dataY(vindn)], 'g-'); 

如果您只需要一个绘图对象(这样可以使渲染速度更快),请考虑:
dx = [dataX(vind), dataX(vindn), nan(numel(vind), 1)]';
dy = [dataY(vind), dataY(vindn), nan(numel(vind), 1)]';
plot(ah, dx(:), dy(:), 'g-');

这正是我所需要的!谢谢! - K. Grouleff
至少你改了变量名... :) - Adiel
嘿,我早在你之前就把这个作为评论发布了! - zeeMonkeez
但话说回来,这是相当标准的东西 :) - zeeMonkeez
嗨zeeMokeez, 昨天我以为我理解了你的解决方案,但显然我没有,因为当我尝试修改以下代码时,它与我昨天发布的问题更或多或少相同,但它不起作用: - K. Grouleff
显示剩余3条评论

1

如果你想让图表中的所有线条在一起,你可以这样做:

ind=find(validMask);
X=[dataX(ind) dataX(ind+45) nan(length(ind),1)];
Y=[dataY(ind) dataY(ind+45) nan(length(ind),1)];
plot(ah,X',Y','g-')

0

昨天我以为我理解了你的解决方案,但显然我没有,因为当我尝试根据你的答案修改以下代码时,它不起作用:你会如何根据你之前的答案进行修改?

for i=1:size(validMaskY,1)
   for j=1:size(validMaskY,2)
      if( validMaskY(i,j) )
      plot(ah, [dataX(i,j) dataX(i+1,j)], [dataY(i,j) dataY(i+1,j)], 'r-')
      end
   end
end

size(dataX)=size(dataY)


尝试更改这一行代码:vindn = vind + 1; - Adiel
我会尝试解释得更清楚:当我尝试将双重循环向量化时,得到的图形与运行双重循环(即正确的循环)时不同。我发表的第一个问题在点之间绘制连接线,而我最新发表的帖子在其他线的垂直方向上绘制线条。结果是一个网格,其中所有满足validMaskX、validMaskY的点都连接在一起。 我可以沿一个方向绘制线条,但无法沿另一个方向绘制。 - K. Grouleff
我正在遍历大量图像,因此dataX和dataY的大小将会变化,但它们始终相等。Size(validMaskX)=[m,n],其中size(validMaskY)=[n,m],希望这可以帮助您。 - K. Grouleff
如果 [r, c] == size(dataX),那么 size(validMaskY) 应该是 [r-1, c],而 size(validMaskX) 应该是 [r, c-1]。另外,请确保在解决第二个问题时使用 dx = [dataX(vindn), dataX(vind), nan(numel(vind), 1)]'; dy = [dataY(vindn), dataY(vind), nan(numel(vind), 1)]'; - zeeMonkeez
也许附上一些图表会更好吗? - Adiel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接