2013-10-23 70 views
1

我有两个矩阵(tri1tri2),它们代表了Delaunay三角剖分。 tri1是插入新点之前的三角剖分,tri2是添加新点之后的结果。每行有4列。这些行代表四面体。如何快速计算两个n乘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)
一度被称为

回答

3

我无法完全按照您的示例代码,但从您的解释中判断是否要检查矩阵A中是否有矩阵B

在这种情况下,一个非常高效软件实现可用:

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

检查doc有关此功能的更多信息,看看是否是你所需要的。

+0

谢谢,那正是我需要的! – bjoernz