我在MATLAB中的变量x
中有100个坐标。如何确保两点的所有组合之间的距离大于1?
答案 0 :(得分:4)
您可以使用all
和pdist
函数在一个简单的行中执行此操作:
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。如果我们剖析最后一行代码,这是一个三步过程:
sum((source_points - end_points).^2, 2)
计算每对点的每个组件之间的成对差异,对差异求平方,然后将所有值加在一起。sqrt(...(1)...)
计算给出欧几里德距离的平方根。 all(...(2)... > 1)
检查步骤#2中计算的所有距离是否大于1,我们的结果如下。