如何使用内部循环中的一个复杂条件向量化 2 个嵌套 for 循环?

计算科学 八度 矢量化
2021-12-03 19:17:37

当您处理可以跨越一个非常大的矩阵的科学计算时,八度计算太慢了,甚至只是迭代。我必须对其进行矢量化以加快计算速度。

通过以下操作对 1xn 矩阵进行矢量化很容易

for i = 1:n
  if (a(i) > 5)
    a(i) -= 20
  endif
endfor

https://octave.org/doc/v4.0.1/Basic-Vectorization.html

但是当矩阵变为 nxm 时,我没有任何线索。我的示例代码如下所示。

segs = 1000000;
r_int = 100;
r_ot = 2000;
x = linspace (0, 1000, segs);
y = linspace (0, -1000, segs);
[xx, yy] = meshgrid (x, y);
circ = xx.*yy;
circ_matrix = zeros(segs,segs);

#this needs vectorization
for j = 1:segs
  for i = 1:segs
    if((r_int<=circ(i,j)) &&(circ(i,j)<=r_ot))
      circ_matrix(i,j)=1;
    endif;
  endfor;
endfor;

我已经标记了需要向量化的代码

尝试了一些事情:

circ_matrix((r_int<=circ) &&(circ<=r_ot))=1;

但没有工作

2个回答

true另一种方法是使用等于的事实1并且false等于0. 如果满足if语句中的两个条件,则结果为1, 否则就是0.

segs = 1000000;
r_int = 100;
r_ot = 2000;
x = linspace (0, 1000, segs);
y = linspace (0, -1000, segs);
[xx, yy] = meshgrid (x, y);
circ = xx.*yy;

circ_matrix = ( r_int<=circ ) .* ( circ <=r_ot );
```
rmid = 0.5*(r_int + r_ot); 
rlen = 0.5*(r_ot - r_int);
cc = double(abs(circ - rmid) <= rlen);