2

我需要为 2D 平面生成N个随机坐标。给定任意两点之间的距离(距离数为N(N - 1) / 2)。例如,假设我需要生成 3 个点,即 A、B、C。我有它们之间的距离,distABdistACdistBC
MATLAB中是否有任何内置函数可以做到这一点?基本上,我正在寻找与pdist()功能相反的东西。

我最初的想法是选择一个点(比如 A 是原点)。然后,我可以随机找到 B 和 C 在半径为distAB和的两个不同圆上distAC。但是 B 和 C 之间的距离可能无法满足distBC,如果发生这种情况,我不确定如何进行。而且我认为如果N很大,这种方法会变得非常复杂。

4

2 回答 2

5

详细说明 Ansaris 的答案,我制作了以下内容。它假设提供了一个有效的距离矩阵,根据 cmdscale 计算 2D 中的位置,进行随机旋转(也可以添加随机平移),并将结果可视化:

%Distance matrix
D = [0 2 3; ...
     2 0 4; ...
     3 4 0];

%Generate point coordinates based on distance matrix
Y = cmdscale(D);

[nPoints dim] = size(Y);

%Add random rotation
randTheta = 2*pi*rand(1);
Rot = [cos(randTheta) -sin(randTheta); sin(randTheta) cos(randTheta) ];
Y = Y*Rot;

%Visualization
figure(1);clf;
plot(Y(:,1),Y(:,2),'.','markersize',20)
hold on;t=0:.01:2*pi;
for r = 1 : nPoints - 1 
    for c = r+1 : nPoints
        plot(Y(r,1)+D(r,c)*sin(t),Y(r,2)+D(r,c)*cos(t));
        plot(Y(c,1)+D(r,c)*sin(t),Y(c,2)+D(r,c)*cos(t));
    end
end

在此处输入图像描述

于 2012-05-22T22:58:22.993 回答
3

您想使用一种称为经典多维缩放的技术。如果您拥有的距离对应于二维中有效点之间的距离,它将正常工作且无损。幸运的是,MATLAB 中有一个函数可以做到这一点:cmdscale. 在距离矩阵上运行此函数后,您可以将第一个输出参数中的前两列视为您需要的点。

于 2012-05-22T21:24:56.470 回答