计算它们之间所有等距的坐标
Calculate coordinates all equidistant among them
有一个通用的 m 维 space 我需要计算 它们之间的所有等距的 m+1 坐标。
假设一个 2D space 可以处理最多 3 个等距点(由 3 个等距顶点创建的等边三角形)等等。一般来说,我们可以在 m- 中表示 m 个等距顶点1 维 space.
顶点之间的距离是单位距离(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;
}
你需要正则单纯形。
Wiki page 包含有关正则单纯形顶点坐标的信息。
主要技巧是基于这样一个事实,即从单纯形中心到顶点的任何一对向量之间的角度是 arrcos(-1/d),其中 d 是 space 维度(2d、3d、4d 等)
二维案例示例:
先设顶点坐标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)
有一个通用的 m 维 space 我需要计算 它们之间的所有等距的 m+1 坐标。
假设一个 2D space 可以处理最多 3 个等距点(由 3 个等距顶点创建的等边三角形)等等。一般来说,我们可以在 m- 中表示 m 个等距顶点1 维 space.
顶点之间的距离是单位距离(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;
}
你需要正则单纯形。
Wiki page 包含有关正则单纯形顶点坐标的信息。
主要技巧是基于这样一个事实,即从单纯形中心到顶点的任何一对向量之间的角度是 arrcos(-1/d),其中 d 是 space 维度(2d、3d、4d 等)
二维案例示例:
先设顶点坐标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)