计算它们之间所有等距的坐标

时间:2016-09-14 14:31:19

标签: math multidimensional-array machine-learning vertex dimensionality-reduction

具有通用的m维空间我需要计算m + 1个坐标,它们之间的距离都是等距的。

假设2D空间可以处理最多3个等距点(由3个顶点在它们之间等距离创建的等边三角形)等等。一般来说,我们可以在m-1维空间中表示m个等距顶点。

顶点之间的距离是单位距离(1),对于简单2D情况,3个顶点之间的距离是1.

我读到了这个Equidistant points across a cube,但我的要求不同,只有一个(大)约束而不是两个。

每种编程语言都足够好,我需要一个建议来概括逻辑。

谢谢大家。

编辑----------- 解决方案如下(n是维度):

static double[] simplex_coordinates2 ( int n )
{
  double a;
  double c;
  int i;
  int j;
  double s;
  double[] x;

  x = r8mat_zero_new ( n, n + 1 );

  for ( i = 0; i < n; i++ )
  {
    x[i+i*n] = 1.0;
  }

  a = ( 1.0 - Math.sqrt ( 1.0 + ( double ) ( n ) ) ) / ( double ) ( n );

  for ( i = 0; i < n; i++ )
  {
    x[i+n*n] = a;
  }
//
//  Now adjust coordinates so the centroid is at zero.
//
  for ( i = 0; i < n; i++ )
  {
    c = 0.0;
    for ( j = 0; j < n + 1; j++ )
    {
      c = c + x[i+j*n];
    }
    c = c / ( double ) ( n + 1 );
    for ( j = 0; j < n + 1; j++ )
    {
      x[i+j*n] = x[i+j*n] - c;
    }
  }
//
//  Now scale so each column has norm 1.
//
  s = 0.0;
  for ( i = 0; i < n; i++ )
  {
    s = s + x[i+0*n] * x[i+0*n];
  }
  s = Math.sqrt ( s );

  for ( j = 0; j < n + 1; j++ )
  {
    for ( i = 0; i < n; i++ )
    {
      x[i+j*n] = x[i+j*n] / s;
    }
  }
  return x;
}

static double[] r8mat_zero_new ( int m, int n )
{
  double[] a;
  int i;
  int j;

  a = new double[m*n];

  for ( j = 0; j < n; j++ )
  {
    for ( i = 0; i < m; i++ )
    {
      a[i+j*m] = 0.0;
    }
  }
  return a;
}

1 个答案:

答案 0 :(得分:0)

你需要定期的单纯性 Wiki page包含有关常规单纯形顶点坐标的信息。

主要技巧是基于以下事实:从单形中心到顶点的任何一对向量之间的角度是arrcos(-1 / d),其中d是空间维度(2d,3d,4d等)

2D案例:
设第一个顶点坐标V2 = (x1,y1) = (0,1)
(x2,y2)和(x3,y3)与V1的点积必须为-1/2,因此x2和x3均等于-1/2 y2和y3是Sqrt(3)/2-Sqrt(3)/2 - 从距离= 1到坐标原点

最后一步 - 标准化坐标以获得顶点之间的距离1 - 只需将所有坐标乘以系数C=Sqrt(d/(2*(d+1)))
(来自余弦定理c^2+c^2+2*c*c/d=1

对于2d案例C=Sqrt(3)/3,所以单纯形顶点是

(Sqrt(3)/3, 0)
(-Sqrt(3)/6, 1/2)
(-Sqrt(3)/6, -1/2)