【问题标题】:Avoid loops in matlab while finding indices查找索引时避免matlab中的循环
【发布时间】:2018-12-09 14:52:45
【问题描述】:

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

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

现在我想看看我的向量“索引”中的这些索引在我的“面孔列表”中的什么位置。

目前我正在遍历我的面孔列表以获取“向量 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 并不那么精通,并且仍然无法对我的代码进行矢量化。

【问题讨论】:

    标签: matlab for-loop vectorization


    【解决方案1】:

    这里的关键是使用ismember。这会为您提供一个逻辑数组,只要第一个数组的元素等于第二个数组中的任何元素,即为 1,在本例中为 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
    

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

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 2017-06-24
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2015-01-24
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多