如何生成一个随机方向的单位向量,并保证该方向具有各向同性分布?

21

我需要创建一个方法,使用随机数生成器在三维空间中生成一个随机方向的单位向量。该向量的方向分布必须是各向同性的。
以下是我正在尝试生成随机单位向量的方式:
v = randn(1,3);
v = v./sqrt(v*v');

但我不知道如何实现各向同性部分。有什么想法吗?


这里也有一些不错的答案:链接1链接2 - finnw
@finnw:这个问题是重复的,但回答不一样。也许我们可以合并这些问题? - Jonas
1个回答

22

你做得很好。随机的正态坐标分布给你一个方向上的均匀分布。

要在单位球面上生成10000个均匀分布的点,你可以运行:

v = randn(10000,3);
v = bsxfun(@rdivide,v,sqrt(sum(v.^2,2)));

plot3(v(:,1),v(:,2),v(:,3),'.')
axis equal

输入图像描述


哇,谢谢@Jonas!我不知道正态分布的那个知识点! - Aina
@Aina:2D正态分布具有旋转对称性。因此,3D正态分布具有球对称性。 - Jonas
3
@Andrey:你是指正态分布具有旋转对称性吗?三维正态分布与exp(- (x^2+y^2+z^2))成比例。如果你将其转换为球坐标系,那么该表达式就变成了exp(-(r^2))。换句话说,密度仅取决于半径而不是角度,这意味着点在所有角度上均匀分布。 - Jonas
@Jonas 就我所看到的,这是一种很好的方法。你能否为 R 制作一个版本?谢谢。 - JASC
1
@JASC:很遗憾,我对R语言只是略知一二。不过,这个算法的主要步骤是从三维正态分布中随机生成若干个点(即坐标列表,其中x、y和z分别从独立的均值为0、标准差为1的正态分布中抽取),然后将每个坐标三元组除以其范数,使得它们的x^2+y^2+z^2等于1。 - Jonas
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接