如何使用Python生成一个随机的N维旋转矩阵?

8

我能在Numpy或Scipy中找到特定的函数来生成一个随机的N维旋转矩阵(或正交矩阵)吗?我需要将一个向量从ND球体上的一个点移动到此球体上的另一个随机点。


1
你是在询问数学如何构建一个ND旋转矩阵,还是已经了解数学知识,只是需要编写程序? - Eular
1
我想问如何生成一个随机的nd旋转矩阵,因为我需要在一个nd球上进行重要性采样。 - 孙文趋
快速而简单的方法:生成一个一般的随机矩阵,其条目在[-1,1]之间,并应用QR分解。 Q因子是一个随机正交矩阵(要成为旋转矩阵,行列式必须为1,但det(Q)取决于维度)。然而,相对于Haar度量,没有统一性的保证。 - Lutz Lehmann
7
你要找的是 scipy.stats.special_ortho_group。我没有权限重新打开问题来回答,所以我在这里滥用评论功能。这不是一个及时的答案,你可能已经通过艰难的方式找到了它。希望未来的人们不需要再受苦了。 - user10892982
你需要使用 scipy.stats.special_ortho_group;它已经内置在scipy中,可以在任意维度下采样随机旋转矩阵。这不是 https://dev59.com/vloT5IYBdhLWcg3wkAI9 的重复,因为它要求旋转而不是正交,尽管这个答案 https://dev59.com/vloT5IYBdhLWcg3wkAI9#55289807 是正确的。 - MRule
1个回答

6

https://math.stackexchange.com/questions/442418/random-generation-of-rotation-matrices

这可能会解答您的问题,至少在策略方面是如此。据我所知,numpy没有标准或库函数可以精确地实现您需要的功能。那里提供了无数的计算策略,但我更喜欢四元数方法的扩展,因为它可以保持均匀分布,我假设这就是您想要的。
编辑:我的原始答案说“大致均匀”,但经过更多研究后,当从均匀分布中采样四元数方法时,实际上会保持旋转中的均匀分布。

2
在编程问题方面,现在最简单和最惯用的方法是使用 scipy.stats.special_ortho_group.rvs(NDIMS)(https://dev59.com/vloT5IYBdhLWcg3wkAI9#55289807)。为了保持 stack overflow 的当前和有用的知识库,我们可能需要更新这个答案(并重新打开这个问题,因为它很清晰,不应该被关闭)。 - MRule

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