Matlab 如何用距离阈值连接三维点

Matlab 如何用距离阈值连接三维点,matlab,Matlab,我有一个3D点的向量,比如a,如下所示 A=[ -0.240265581092000 0.0500598627544876 1.20715641293013 -0.344503191645519 0.390376667574812 1.15887540716612 -0.0931248606994074 0.267137193112796 1.24244644549763 -0.183530493218807 0.38424918631257

我有一个3D点的向量,比如a,如下所示

   A=[
    -0.240265581092000  0.0500598627544876  1.20715641293013
    -0.344503191645519  0.390376667574812   1.15887540716612
    -0.0931248606994074 0.267137193112796   1.24244644549763
    -0.183530493218807  0.384249186312578   1.14512014134276
    -0.0201358671977785 0.404732019283683   1.21816745283019
    -0.242108038906952  0.229873488902244   1.24229940627651
    -0.391349107031230  0.262170158259873   1.23856838565023
    ]
我想做的是将3D点与距离仅小于特定阈值的线连接起来
T
。我想得到需要连接的点对的列表。比如,

[ 
( -0.240265581092000    0.0500598627544876  1.20715641293013), (-0.344503191645519  0.390376667574812   1.15887540716612); 
(-0.0931248606994074    0.267137193112796   1.24244644549763),(-0.183530493218807   0.384249186312578   1.14512014134276),.....
]

如图所示,我有一个需要连接的点对向量。因此,如果有人可以建议如何在Matlab中实现这一点。

下面的示例演示了如何实现这一点

%# Build an example matrix
A = [1 2 3; 0 0 0; 3 1 3; 2 0 2; 0 1 0];
Threshold = 3;

%# Calculate distance between all points
D = pdist2(A, A);

%# Discard any points with distance greater than threshold 
D(D > Threshold) = nan;
如果您希望提取由小于(或等于)
阈值
的距离链接的所有观察对的索引,以及相应的距离(您的问题没有指定您希望输出采用的形式,因此我在这里基本上是猜测),请改为使用以下方法:

%# Obtain a list of linear indices of observations less than or equal to TH
I1 = find(D <= Threshold);

%#Extract the actual distances, as well as the corresponding observation indices from A
[Obs1Index, Obs2Index] = ind2sub(size(D), I1);
DList = [Obs1Index, Obs2Index, D(I1)];

第二次更新:我在回答中没有对距离测量做出任何假设。也就是说,我故意使用了
pdist2
,以防距离测量不对称。但是,如果您使用的是对称距离度量,那么您可能可以使用
pdist
来加快运行时间,尽管我的索引代码需要相应地调整。

Plot3
pdist2
可以用来实现您想要的功能

D=pdist2(A,A);
T=0.2;
for i=1:7
  for j=i+1:7
    if D(i,j)<T & D(i,j)~=0
       i
       j
       plot3(A([i j],1),A([i j],2),A([i j],3));
       hold on;
       fprintf('line is plotted\n');
       pause;
    end
  end
end
D=pdist2(A,A);
T=0.2;
对于i=1:7
对于j=i+1:7

如果D(i,j),当已经绘制了
(i,j)
时,您可以通过忽略
(j,i)
来进一步优化它。我把这件事留给你。为什么不使用
pdist
——这样你就不必担心每个值都会得到两次。顺便说一句,在您的示例中,使用
i=1:7
j=i+1:7
来避免双重打印的问题。@Floris我不确定OP是否明确指定了距离度量。也许短语“有一条线”意味着欧几里德距离,在这种情况下,
pdist
就足够了。但是为了完全通用,可以选择使用
pdist2
,以防指定的距离度量值不对称。这就是我在回答中使用的假设。谢谢科林的回答,我想得到的是需要连接的成对点的列表。例如,[(1,2,3),(0,0,0);(3,1,3),(2,0,2),…]如图所示,我将有一个需要连接的点对向量,如果你能建议的话。谢谢alot@user1460166这就是我在下面的答案中所展示的,不是吗?@user1460166如果我理解正确,那么
DList2=[A(Obs1Index,:),A(obs2 index,:)]将为您提供所需内容。此外,我更新了我的答案以反映这一点。
D=pdist2(A,A);
T=0.2;
for i=1:7
  for j=i+1:7
    if D(i,j)<T & D(i,j)~=0
       i
       j
       plot3(A([i j],1),A([i j],2),A([i j],3));
       hold on;
       fprintf('line is plotted\n');
       pause;
    end
  end
end