我有一个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的了解还不够,仍然无法向量化我的代码。
答案 0 :(得分:2)
此处的关键是使用ismember
。这样,只要第一个数组的元素等于第二个数组中的任何元素(在这种情况下为faces
和indices
中的任何元素),逻辑数组就为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值的行。