如何快速计算两个n×4矩阵的变化?

时间:2013-10-23 13:02:07

标签: performance matlab

我有两个矩阵(tri1tri2)代表Delaunay三角剖分。 tri1是插入新点之前的三角测量,tri2是添加新点后的结果。每行有4列。行代表四面体。

我想计算从tri1tri2的行之间的关系。结果可能如下所示:

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
  • 每个插入的顶点(大约1000)
  • 将调用此函数一次

1 个答案:

答案 0 :(得分:3)

我无法完全按照您的示例代码进行操作,但根据您的解释,您希望查看矩阵A中是否出现矩阵B中的行。

在这种情况下,可以实现非常有效的实施:

[Lia, Locb] = ismember(A,B,'rows');

检查doc以获取有关此功能的更多信息,并查看它是否是您需要的。