两点的任意组合之间的距离

时间:2015-05-18 04:15:58

标签: matlab

我在MATLAB中的变量x中有100个坐标。如何确保两点的所有组合之间的距离大于1?

2 个答案:

答案 0 :(得分:4)

您可以使用allpdist函数在一个简单的行中执行此操作:

if all(pdist(x)>1)
    ...
end

最佳,

答案 1 :(得分:1)

首先,您需要生成一个矩阵,为您提供所有可能的坐标对。这篇文章可以作为灵感:

Generate a matrix containing all combinations of elements taken from n vectors

我将假设您的坐标被存储,以便列表示维度,行表示您有多少点。因此,对于2D,您将拥有100 x 2矩阵,而在3D中,您将拥有100 x 3矩阵,依此类推。

一旦你生成了所有可能的组合,你只需计算距离......我将在这里假设它是欧几里德......所有点都确保它们都大于1。

因此:

%// Taken from the linked post
vectors = { 1:100, 1:100 }; %// input data: cell array of vectors

n = numel(vectors); %// number of vectors
combs = cell(1,n); %// pre-define to generate comma-separated list
[combs{end:-1:1}] = ndgrid(vectors{end:-1:1}); %// the reverse order in these two
%// comma-separated lists is needed to produce the rows of the result matrix in
%// lexicographical order 
combs = cat(n+1, combs{:}); %// concat the n n-dim arrays along dimension n+1
combs = reshape(combs,[],n); %// reshape to obtain desired matrix

%// Index into your coordinates array
source_points = x(combs(:,1), :);
end_points = x(combs(:,2), :);

%// Checks to see if all distances are greater than 1
is_separated = all(sqrt(sum((source_points - end_points).^2, 2)) > 1);
如果所有点之间的距离均为1或更大,则

is_separated将包含1,否则为0。如果我们剖析最后一行代码,这是一个三步过程:

  1. sum((source_points - end_points).^2, 2)计算每对点的每个组件之间的成对差异,对差异求平方,然后将所有值加在一起。
  2. sqrt(...(1)...)计算给出欧几里德距离的平方根。
  3. 然后
  4. all(...(2)... > 1)检查步骤#2中计算的所有距离是否大于1,我们的结果如下。