Delaunay 三角形分割を表す2 つの行列 (tri1
と) があります。は新しい点を挿入する前の三角形分割、は新しい点を追加した後の結果です。各行には 4 つの列があります。行は四面体を表します。tri2
tri1
tri2
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++ を使用しています。私の質問: 2 つの行の比較を高速化するにはどうすればよいですか?
いくつかの追加情報 (念のため):
- の行数は
tri
約 10000 まで増加する可能性があります - この関数は、挿入された頂点 (約 1000) ごとに 1 回呼び出されます。