1

Delaunay 三角形分割を表す2 つの行列 (tri1と) があります。は新しい点を挿入する前の三角形分割、は新しい点を追加した後の結果です。各行には 4 つの列があります。行は四面体を表します。tri2tri1tri2

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 回呼び出されます。
4

1 に答える 1