查找索引时避免在Matlab中循环

时间:2018-12-09 14:52:45

标签: matlab for-loop vectorization

我有一个n x 3形式的面孔列表“面孔”。
每行包含来自n x 3顶点列表的3个不同行的3个索引。 (因此,每个值都是到包含3个顶点坐标的行的索引。

在我的向量“索引”中,我以n x 1的形式存储了我感兴趣的顶点索引。

现在,我想查看矢量“索引”中这些索引在“面孔列表”中的何处。

目前,im遍历我的面孔列表以获取“向量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的了解还不够,仍然无法向量化我的代码。

1 个答案:

答案 0 :(得分:2)

此处的关键是使用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值的行。