如何在matlab中旋转矢量数据

时间:2015-05-20 15:59:33

标签: matlab vector rotation

我正在尝试使用矢量数据来计算两个矢量之间的角度。我正在使用atan2,它在x平面上运行,但我想从y平面上移除点。

如何旋转数据以便我的y平面是我的x平面,进行分析,然后再旋转?我已经为我的分析进行了计算,只是不知道如何在保留每个位置的同时旋转矢量数据。

3 个答案:

答案 0 :(得分:6)

假设您的数据点位于N x 3矩阵中,其中N是您拥有的总点数,只需将rotation matrix应用于每个点。

您可以通过执行非常简单的矩阵乘法来旋转点。给定一个点作为3元素列向量X,输出点X'就是:

X' = R*X

R是一个旋转矩阵。根据您想要相对于哪个轴旋转,有三个旋转矩阵。在您的情况下,您希望绕x - 轴顺时针旋转90度。这里给出了围绕逆时针方向围绕每个轴旋转的一般形式:

来源:Wikipedia

在您的情况下,您需要第一个矩阵。因为您想要顺时针旋转90度,您可以指定角度为-90度。因此,为x - 轴构造旋转矩阵,如下所示:

R = [1 0 0; 0 cosd(-90) -sind(-90); 0 sind(-90) cosd(-90)];

此外,cos(90) = 0sin(-90) = -1假定为度数,因此这实际上简化为:

R =

     1     0     0
     0     0     1
     0    -1     0

要撤消您所做的旋转,只需应用90度逆时针旋转,因此将90度替换为上述表达式。这样做可以让我们:

R =

     1     0     0
     0     0    -1
     0     1     0

但是,您的积分位于N x 3矩阵中。我们希望将每个表示为一个点,因此您需要做的是转置您的矩阵,然后进行乘法,然后转置回(如果需要)。假设您的积分存储在X中,请执行以下操作:

R = [1 0 0; 0 cosd(-90) -sind(-90); 0 sind(-90) cosd(-90)];
Xrotate = (R*X.').';

Xrotate将包含一个N x 3矩阵,其中包含您的旋转点数。给定原始X矩阵中的源点,每列将是一个旋转点。应该注意的是X的每一行都会被旋转并放入Xrotate中的一列中,我们需要调整此结果以使其恢复为X的形状。进行处理,当你准备就绪时,你可以回转你的积分。假设XrotateN x 3,只需执行以下操作:

R2 = [1 0 0; 0 cosd(90); -sind(90); 0 sind(90); cosd(90)];
Xout = (R2*Xrotate.').';

Xout包含旋转并重新转换回来,以便每行都是一个点,每列都是一个维度。

答案 1 :(得分:-1)

无论如何,计算2个向量之间角度的最佳方法是使用点积:u·v = norm(u,2)* norm(v,2)* cos(angle)

你可以用这种方式快速计算它。你是2次和3次乘法,并且norm函数有3次乘法,2次求和和一个平方根,以及acos()之前的2个除法。将它们计算为20次操作以获得角度,比将矩阵乘以向量,改变坐标系统,应用您正在尝试的操作要好得多......

答案 2 :(得分:-1)

引自the manual

  

语法

rotate(h,direction,alpha)
rotate(...,origin)
     

描述

     

旋转功能以三维方式旋转图形对象   空间。

     

rotate(h,direction,alpha)将图形对象h旋转alpha   度。 direction是描述的两元素或三元素向量   旋转轴与轴的原点一起   回转。旋转轴的默认原点是   情节框。这一点不一定是轴的起源。

     

正面alpha被定义为右边的规则角度   方向矢量,因为它从旋转原点延伸。

     

如果h是句柄数组,则所有对象都必须是子句的子句   相同的轴。

     

rotate(...,origin)指定旋转轴的原点为a   三元素向量[x0,y0,z0]。