首页 文章

在找到索引时避免使用matlab中的循环

提问于
浏览
1

我有一个面部列表"faces",形式为n x 3 .
每行包含来自n×3顶点列表的3个不同行的3个索引 . (因此每个值是包含顶点的3个坐标的行的索引 .

在我的矢量“索引”中,形式为n x 1,我存储了我感兴趣的顶点索引 .

现在我想看看我的“面部列表”中的这些索引来自我的矢量“indices” .

目前我循环遍历我的面部列表以获得"vector s",其中包含"faces list"行的索引 .
为了提高性能,我预先将"vector 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 回答

  • 2

    这里的关键是使用ismember . 这为您提供了一个逻辑数组,即第一个数组的元素等于第二个数组中的任何元素,在这种情况下 facesindices .

    作为一个玩具的例子,

    >> 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
    

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

相关问题