如何在8维球体上生成网

时间:2010-07-19 04:17:34

标签: matlab random geometry

使用Matlab,如何生成在8维单位球上均匀定位(或分布)的3 ^ 10个网络?

3 个答案:

答案 0 :(得分:3)

在n-d单位球体上获得点的一种简单方法是创建一个n-d立方体,切掉角落,并将剩余半径标准化为1.请注意,如果没有切割,分布将不均匀。

然而,由于超球面相对于封闭盒的体积随着维数的增加而减小,这不是一种特别有效的方式。

更好的方法是生成nd正态分布点(半径)的数组,并将它们标准化为球体的半径 - nd正态分布是径向对称的,因此表面上的分布将是均匀的< / p>

%# set-up
nPoints = 3^10;
nDim = 8;

%# create normally distributed variables
points = randn(nPoints,nDim);

%# normalize by dividing by the norm (=square root of sum(points.^2,2) )
points = bsxfun(@rdivide,points,sqrt(sum(points.^2,2)));

答案 1 :(得分:0)

好的,on Wikipedia我们读到了

半径为n的n球被定义为(n + 1)维欧氏空间中与中心点距离为r的点的集合,其中半径r可以是任何正实数

所以你的问题变成了在7空间中生成3 ^ 10个向量的问题。在不丢失任何内容的情况下,我们可以r = 1。方法是在7空间中生成随机向量,然后以通常的方式将它们标准化为单位长度

这里有一些我匆忙敲门的代码,我知道我应该有矢量化的东西而不是写入循环,我会把它留给OP。代码不需要任何解释。

pointset = rand(3^10,7);
normset = zeros(3^10,1);
for ix = 1:3^10
  normset(ix) = norm(pointset(ix,:));
end
for ix = 1:3^10
  pointset(ix,:) = pointset(ix,:)/normset(ix);
end

当然,这依赖于Matlab的PRNG生成均匀分布的数字,以在8球上创建均匀分布的网络。

答案 2 :(得分:0)

来自维基百科n-sphere

  

生成均匀分布   (n - 1) - 球上的随机点   (即,n球的表面),   Marsaglia(1972)给出了以下内容   算法

     

生成n维向量   正常偏差(足以使用   N(0,1),实际上是选择   方差是任意的),   \ mathbf {X} =(X_1,X_2,\ ldots,x_n)。

     

现在计算出它的“半径”   点,   R = \ SQRT {X_1 ^ 2 + X_2 ^ 2 + \ cdots + x_n ^ 2}。

     

vector \ frac {1} {r} \ mathbf {x}是   均匀分布在表面上   单位n球。

完成此任务的matlab代码片段是:

numdims = 8;
numpts = 3^10;
x = randn([numdims numpts]);
lx = repmat(sqrt(sum(x.^2,1)), [numdims 1]);
x = x./lx;
%x(:,j) is the jth point on the circle)