【问题标题】:How to generate random cartesian coordinates given distance constraint in Matlab如何在Matlab中给定距离约束生成随机笛卡尔坐标
【发布时间】:2012-05-22 20:47:30
【问题描述】:

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

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

【问题讨论】:

  • 那么,您基本上想在随机位置和旋转处绘制一个已知三角形?随机选择原点和旋转。然后使用 trig 确定实际的点位置。
  • @MattB。其实不仅仅是一个普通的三角形,而是一个Reuleaux triangle

标签: matlab


【解决方案1】:

详细说明 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多