图片缩略图

n维超球中的随机点

version 1.0.0.0 (542 Bytes) by 罗杰·斯塔福德
在超球中随机均匀地分布点。
4.8
27日评级

6下载

更新2005年12月28日

没有许可

这创建了一组由笛卡尔坐标定义的随机点,均匀分布在半径为r、中心位于原点的n维超球内部。

“randn”函数首先用于创建n个随机变量的独立多元正态分布集合,每个随机变量代表n维空间中的点。然后用不完全伽马函数'gammainc'将这些点径向映射到有限半径r的n维超球内部,使其在空间上均匀分布。

引用作为

罗杰·斯塔福德(2021)。n维超球中的随机点(//www.tatmou.com/matlabcentral/fileexchange/9443-random-points-in-an-n-dimensional-hypersphere), MATLAB中央文件交换。检索

意见及评分(30.

Sarafa Iyaniwura

cheulhee kwon

Ondrej潘尼克

谢谢!

shdotcom shdotcom

S2是什么意思?
如何使点围绕中心点分布?

伊丽莎白侯

不要紧。我的错是我有个绘图错误。

伊丽莎白侯

这些数据似乎位于n维空间中的一个磁盘上。有办法把它变成一个真实的球体吗?

Fjedor Gaede

Sreejita Ghosh

雯女makhoul

谢谢你:)

田刘

不错的功能

Erfan

非常感谢您的分享!

P.-O。

工作

%超级优雅!
%然而,对于特定的3D情况,有一个快4倍的解决方案:

半径= r *兰德(n, 1)。^ (1/3);
φ= 2 *π*兰德(n, 1);
cos = 1 - 2*rand(n,1);
radsintheta =半径。* sin(这些“可信赖医疗组织”(costheta));

X =[…
radsintheta。* cos(φ),……
radsintheta。* sin(φ),……
半径。* costheta];

工作

Kuan-Sung

你好,

在AMB的代码中,我们应该在执行Laurent方法之前再次生成X。两种方法的结果是相似的。

谢谢,
Kuan-Sung

AMB

嗨-这篇文章是参考Laurent的评论。

使用这个示例代码,我们可以看到Laurent的代码替换更快,但结果与原始代码不同。劳伦特的修改似乎产生的数据跨越了与原始数据不同的半径,这些数据在屏幕上以2D投影的形式显示时显得更集中。原始代码产生了更明确的边界。

根据应用情况,这两种想法都有各自的优点。

M = 3;n = 2;r = 2;
X = randn (m, n);
s2 = (x ^ 2, 2)之和;
抽搐
X = X * repmat (r * (gammainc (s2/2, n / 2) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、1);情节(X(: 1),(:, 2),‘r。’,‘markersize’,1);
轴平等;缩放;变焦,drawnow;宋惠乔;
ax =轴;

抽搐
X = X * repmat (r *(兰德(m, 1) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、2),图(X(: 1),(:, 2),‘r。’,‘markersize’,1);
轴平等;缩放;变焦,drawnow;宋惠乔;
轴(ax);

暂停

M = 3; n = 3;r = 2;
X = randn (m, n);
s2 = (x ^ 2, 2)之和;
抽搐
X = X * repmat (r * (gammainc (s2/2, n / 2) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、1);plot3 (X (: 1), (:, 2), X(:, 3),‘r。’,‘markersize’,1);
轴平等;rotate3d掉;rotate3d; drawnow;宋惠乔;
ax =轴;

抽搐
X = X * repmat (r *(兰德(m, 1) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、2);plot3 (X (: 1), (:, 2), X(:, 3),‘r。’,‘markersize’,1);
轴平等;rotate3d掉;rotate3d; drawnow;宋惠乔;
轴(ax);

暂停

M = 30000;n = 20;r = 2;
X = randn (m, n);
s2 = (x ^ 2, 2)之和;
抽搐
X = X * repmat (r * (gammainc (s2/2, n / 2) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、1);plot3 (X (: 1), (:, 2), X(:, 3),‘r。’,‘markersize’,1);
轴平等;rotate3d掉;rotate3d; drawnow;宋惠乔;
ax =轴;

抽搐
X = X * repmat (r *(兰德(m, 1) ^ (1 / n))。/√(s2), 1, n);
toc
次要情节(1、2、2);plot3 (X (: 1), (:, 2), X(:, 3),‘r。’,‘markersize’,1);
轴平等;rotate3d掉;rotate3d; drawnow;宋惠乔;
轴(ax);

文森特Dubourg

你好再次,

我又用谷歌搜索了一下,最后在鲁宾斯坦的书里找到了一个简短的解释。我把链接留在这里,以防它值得别人…
http://books.google.com/books?id=1-ffZVmazvwC&pg=PA69&lpg=PA69&dq=random+hypersphere+rubinstein&source=bl&ots=-q859Ytx3q&sig=q-PtG2P62_kTCgzi-J7QuqvPOZA&hl=fr&ei=zZ25TcfUJ4SChQeIzY3_Dg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBwQ6AEwAA

欢呼,
文森特

文森特Dubourg

这就跟你问声好!

谢谢分享这个简洁的功能!我想知道你是否能给我一些参考来解释这个脚本背后的理论概念?

谢谢,
文森特

劳伦特

可以避免使用Matlab提供的不完全函数,从而使函数可能更快、更优雅、更可靠。这里不需要非初等函数。

在最后一行,简单地替换
gammainc (s2/2 n / 2)
通过
兰特(m, 1)

这相当于对半径进行随机采样,与球面上均匀的点X/根号(s2)无关。的确,我们可以检验,如果u在[0,1]上是均匀的,那么r*u^(1/n)与n维空间中球B(0,r)内均匀选择的向量范数具有相同的分布。

我这里没有matlab来检查与使用gammainc相比的速度,但在任何情况下,这个方法不依赖于一些黑箱近似积分,这使它,对我来说,更优雅。它也更易于移植到其他编程语言中。

陈?

谢谢!
我还有一个问题。如果我想在超球表面得到均匀分布(半径为1),是否将生成的向量归一化为长度为1。非常感谢!

嘉奇

弗洛里安

优雅得令人窒息!我希望你能发布更多的功能!

molc morloc

MathMoose

Aree维

非常感谢优雅的代码!我在生成这个分布时遇到了麻烦。在此之前,我的解决方案是取样和拒绝;但对于高维空间来说,它太粗糙和消耗。

史蒂夫的主

非常好的代码。对于M-file帮助的增强,我只有两个小建议:

1)在帮助中尽早包含调用语法。我承认我有时会忘记不经常使用的函数的调用语法;我的第一个方法是输入“help ”,要么刷新我的记忆,要么复制并粘贴语法到我的代码中。在这种情况下,我可以看到用户可能忘记了参数的顺序。

2)包括一个例子。在帮助中提供一个用户可以复制和粘贴的示例,给那些可能不知道如何使用你的功能的人一个“已知良好”的状态——从那里,他们可以调整。对于这样一个简单的函数,似乎没有必要这样做,但我认为这是一个好习惯。它可以像生成示例图像的两行代码一样简单。

李·琼斯

优雅的过程,令人惊讶的是

彼得殿

代码的紧凑性是惊人的。

约翰D 'Errico

我承认我花了一分钟左右来验证这个代码。它的
数学上优雅。它的效率。它甚至在
n = 1的特殊情况。

彼得博丹(PB)

简单,但非常聪明的解决方案。

MATLAB版本兼容性
创建R10
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!