在matlab中有效地从球体上的许多圆圈中采样

时间:2013-07-24 16:20:11

标签: matlab rotation statistics transformation

我有一个3乘N矩阵X,其列是单位球面上的向量(即每个向量的欧几里德长度为1),我有一个1-by- N个向量Theta,其条目均为0pi之间的所有角度。对于每个i,球体上的圆圈以X(:,i)为中心,定义为角度Theta(i)X(:,i)的所有点的集合。我希望从每个i的圆圈中获取一个统一样本,避免for循环,因为它们在Matlab中可能很慢。我知道在矢量化的Matlab代码中,如果我假设所有圆的中心都是Theta,我可以轻松地从角度为[0,0,1]的所有圆中获得一个样本,然后我知道如何获得旋转矩阵(使用Rodrigues rotation formula)将[0,0,1]旋转到另一个所需的向量x,因此对于每个i,我可以将此旋转矩阵应用于我获得的采样点{{1} 1}}是中心。

我希望所有[0,0,1]没有for循环,即使用数组/矩阵/向量表示法。

1 个答案:

答案 0 :(得分:3)

如果您使用的是Rodrigues' rotation formula,则表示您尝试将axis-angle表示转换为rotation matrices。你很幸运。我碰巧编写了快速矢量化代码来完成我认为你所询问的内容。您可以在此处找到代码:axang2rotmat.m。使用非常简单(阅读帮助):

n = 1e3;                % Number of axis-angles and rotation matrices
th = pi*rand(1,n);      % Random rotation angles between 0 and pi
v  = normc(rand(3,n));  % Random rotation vectors, normalized across columns
R = axang2rotmat(v,th); % Generate n rotation matrices, R is 3-by-3-n

注意,上面的代码只是为了演示使用axang2rotmat不会为您提供统一采样的旋转矩阵(有关原因和解决方法的详细信息,请参阅Miles, Biometrika 1962 )。不过,我建议您直接计算随机旋转矩阵。您可以使用我的另一个功能:randrotmat.m

我还有代码从旋转矩阵转换回轴角度并检查特定矩阵是否为旋转矩阵here