我有两个矩阵(tri1
和tri2
)代表Delaunay三角剖分。 tri1
是插入新点之前的三角测量,tri2
是添加新点后的结果。每行有4列。行代表四面体。
我想计算从tri1
到tri2
的行之间的关系。结果可能如下所示:
result =
1 1
2 2
3 3
4 4
0 0 % tri1(5, :) was not found in tri2 (a lot more lines could be missing)
6 5
7 6
8 7
9 8
10 9
目前我的源代码如下所示:
% sort the arrays
[~, idx1] = sort(tri1(:, 1), 'ascend');
[~, idx2] = sort(tri2(:, 1), 'ascend');
stri1 = tri1(idx1, :);
stri2 = tri2(idx2, :);
result = zeros(size(tri1, 1), 2);
% find old cells in new triangulation
deleted = 0;
for ii = 1:size(tri1, 1)
found = false;
for jj = ii-deleted:size(tri2, 1)
if sum(stri1(ii, :) == stri2(jj, :)) == 4 % hot spot according to the profiler
found = true;
break;
end
if (stri1(ii, 1) < stri2(jj, 1)), break, end;
end
if found == false
deleted = deleted + 1;
else
result(idx1(ii), 1) = idx1(ii);
result(idx1(ii), 2) = idx2(jj);
end
end
上面的源代码给了我想要的结果,但速度不够快。我对MATLAB不是很熟悉,我通常使用C ++。 我的问题:如何加快两行的比较?
一些其他信息(以防万一):
tri
中的行数可以增长到大约10000 答案 0 :(得分:3)
我无法完全按照您的示例代码进行操作,但根据您的解释,您希望查看矩阵A
中是否出现矩阵B
中的行。
在这种情况下,可以实现非常有效的实施:
[Lia, Locb] = ismember(A,B,'rows');
检查doc以获取有关此功能的更多信息,并查看它是否是您需要的。