查找索引时避免在matlab中出现循环

nmpmafwu  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(117)

我有一个n x 3形式的Faces列表“Faces”。
每行包含来自n×3顶点列表的3个不同行的3个索引。(因此,每个值都是一行的索引,该行包含顶点的3个坐标。
在n x 1形式的向量“index”中,我存储了我感兴趣的顶点的索引。
现在,我想看看在我的“Faces List”中,这些来自向量“index”的索引包含在哪里。
目前,我正在遍历我的Faces列表,以获得具有指向“Faces List”行的索引的“向量s”。
为了提高性能,我用零预先分配了“向量s”。
有没有更快的方法来得到同样的结果?

s = zeros(9000000,1);
aa = 0;
for a = 1:size(indices,1)
    [i,j] = find (faces == indices(a));
    
    s(aa+1:aa + size(i,1),1) = i;
    aa = aa + size(i,1);
end

ss = s(any(s,2),:);
faces = faces(ss(:,1),:);

谢谢你的帮助。不幸的是,我不是那么精通matlab,在向量化我的代码方面仍然有困难。

tjrkku2a

tjrkku2a1#

这里的关键是使用ismember。当第一个数组的元素等于第二个数组中的任何元素(在本例中为facesindices)时,就会得到一个逻辑数组为1。
举个玩具的例子,

>> faces = randi(10, 10, 3)
faces =

    5    3    9
    8    4    4
   10    7   10
    6    6    3
    8   10    1
    9    2    2
    4    7    9
    5    8    3
    7    8    4
    2    4    9

>> indices = [1, 2, 3].'
indices =

   1
   2
   3    

>> s = ismember(faces, indices)
s =

  0  1  0
  0  0  0
  0  0  0
  0  0  1
  0  0  1
  0  1  1
  0  0  0
  0  0  1
  0  0  0
  1  0  0

从那里,您可以像以前一样继续查找其中包含任意1值的行。

相关问题