两个数据集的交集

时间:2016-06-14 17:58:24

标签: matlab

BillBokey给了我一个很好的答案: Find intersection between two data sets

[x,y,z] = sphere;
A=[x(:),y(:),z(:)];
B=[x(:)+0.5,y(:)+0.5,z(:)+0.5];

tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B

Tmp=[A;B];

% Point location searches for the triangles in the given delaunay     
% triangulation that contain the points specified in Tmp, here Tmp is 
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));

% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);


plot3(A(:,1),A(:,2),A(:,3),'+b'); hold on
plot3(B(:,1),B(:,2),B(:,3),'+g');
plot3(IntersectPoints(:,1),IntersectPoints(:,2),IntersectPoints(:,3),'*r')

接下来,我试图从A中提取与B相交的数据点,反之亦然。以下代码似乎不起作用。

Aint=Tmp(ids1,:);
Bint=Tmp(ids2,:);

我觉得它并不那么困难,但我一直在尝试解决方案无济于事。非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

很高兴看到我的最后一个答案帮助了你!

  1. 您正在寻找属于两个数据集的交叉点A(分别位于B)中的点,这意味着您将拥有再次使用ids1&ids2

  2. 您知道Tmp由2个区块构成,Tmp的上半部分size(A,1)行包含属于A的点,并且Tmp行的size(B,1)行的下半部分包含属于B的点

  3. 鉴于以下信息:

    IntersectIdsInA=logical([ids1(1:size(A,1))&ids2(1:size(A,1));zeros(size(B,1),1)]);
    
    IntersectIdsInB=logical([zeros(size(A,1),1);ids1(size(A,1)+1:end)&ids2(size(A,1)+1:end)]);
    
    Aint=Tmp(IntersectIdsInA,:);
    Bint=Tmp(IntersectIdsInB,:);
    
    plot3(Aint(:,1),Aint(:,2),Aint(:,3),'pb','markersize',14); 
    plot3(Bint(:,1),Bint(:,2),Bint(:,3),'pg','markersize',14);
    

    输出:

    enter image description here

    编辑:旁注

    完全清理:

    ids1(resp ids2)是一个包含1的逻辑数组,其中Tmp中的一个点位于{{1}的三角剖分中的一个四面体内(分别为A)。这意味着B会对ids1的重合以及A形成的卷中包含的B中的点进行索引。与A相同的推理。

    因此,为了获得属于交叉点的ids2中的点,您还可以在B中删除属于ids1的点,反之亦然:< / p>

    A