主要内容

四元数

创建一个四元数的数组

自从R2020b

描述

四元数是四hyper-complex数量用于三维旋转和取向。

一个四元数数字形式表示 一个 + b + c j + d k ,在那里一个,b,c,d部分是实数,j和k的基础元素,满足方程:2j =2= k2= ijk =−1

四元数的集合,用H四维向量空间,定义在一个实数,R4。每个元素的H有独特的基于线性组合表示的基础元素,i, j, k。

所有旋转3 - d可以被描述为一个旋转轴和角轴。在旋转四元数矩阵的一个优势是,轴和转动角很容易解释。例如,考虑一个点R3。旋转点,你定义一个旋转轴和旋转一个角度。

旋转插图

四元数表示的旋转可以表示为 = 因为 ( θ 2 ) + ( θ 2 ) ( u b + u c j + u d k ) ,在那里θ是旋转的角度和ub,uc,ud转动轴。

创建

描述

例子

皮疹=四元数()创建一个空的四元数。

例子

皮疹=四元数(A, B, C, D)创建一个四元数的数组,四元数的四个部分从数组一个,B,C,D。所有的输入必须有相同的尺寸和相同的数据类型。

例子

皮疹=四元数(矩阵)创建一个N1四元数的数组N4矩阵,每一列变成了四元数的一个部分。

例子

皮疹=四元数(房车,' rotvec ')创建一个N1四元数的数组N3旋转矩阵向量,房车。每一行的房车代表一个旋转矢量的弧度。

例子

皮疹=四元数(房车,' rotvecd ')创建一个N1四元数的数组N3旋转矩阵向量,房车。每一行的房车代表一个旋转矢量在度。

例子

皮疹=四元数(RM“rotmat”,PF)创建一个N从3-by-3-by - 1四元数的数组N旋转矩阵的数组,RMPF可以是“点”如果欧拉角旋转或代表点“帧”坐标系旋转。

例子

皮疹=四元数(E“欧拉”,RS,PF)创建一个N1四元数的数组N3矩阵,E。每一行的E表示一组欧拉角的弧度。的角度E旋转的轴序列吗RS

例子

皮疹=四元数(E“eulerd”,RS,PF)创建一个N1四元数的数组N3矩阵,E。每一行的E表示一组欧拉角的度。的角度E旋转的轴序列吗RS

皮疹=四元数(转换)创建一个四元数的数组SE(3)变换转换

皮疹=四元数(旋转)创建一个四元数的数组(3)旋转旋转

输入参数

全部展开

四元数的部分,指定为四个逗号分隔标量、矩阵,或多维数组的大小相同。

例子:皮疹=四元数(1、2、3、4)创建一个表单的四元数j 1 + 2 + 3 + 4 k。

例子:皮疹=四元数([1,5],[2,6],[3、7],[4、8])创建一个1×2四元数在数组皮疹(1,1)j = 1 + 2 + 3 + 4 k皮疹(1、2)= 5 + 6 + 7 j + 8 k

数据类型:|

矩阵的四元数的部分,指定为一个N4矩阵。每一行代表一个单独的四元数。每一列表示一个单独的四元数的部分。

例子:皮疹=四元数(兰特(10,4))创建一个10-by-1四元数的数组。

数据类型:|

旋转矩阵向量,作为指定N3矩阵。每一行的房车代表了[X Y Z]旋转向量的元素。旋转矢量是一个单位向量代表旋转轴缩放旋转角的弧度或度。

要使用这个语法,第一个参数指定为一个矩阵旋转向量和第二个参数“rotvec”“rotvecd”

例子:皮疹=四元数(兰德(10,3),“rotvec”)创建一个10-by-1四元数的数组。

数据类型:|

旋转矩阵的数组,指定或3-by-3-by - 3 x3的矩阵N数组中。数组的每个页面代表一个单独的旋转矩阵。

例子:皮疹=四元数(兰德(3),“rotmat”,“点”)

例子:皮疹=四元数(兰德(3),“rotmat”,“框架”)

数据类型:|

类型的旋转矩阵,通过指定“点”“帧”

例子:皮疹=四元数(兰德(3),“rotmat”,“点”)

例子:皮疹=四元数(兰德(3),“rotmat”,“框架”)

数据类型:字符|字符串

矩阵的欧拉角,由一个指定N3矩阵。如果使用“欧拉”语法,指定E在弧度。如果使用“eulerd”语法,指定E在度。

例子:皮疹=四元数(E“欧拉”,“YZY”,“点”)

例子:皮疹=四元数(E“欧拉”,“XYZ”,“框架”)

数据类型:|

旋转序列,指定为一个三元素特征向量:

  • “YZY”

  • “YXY”

  • 之一的ZYZ”

  • “ZXZ”

  • “XYX”

  • “XZX”

  • “XYZ”

  • “YZX”

  • “ZXY”

  • “XZY”

  • “ZYX股票”

  • “YXZ”

假设你想要确定一个点的新坐标旋转坐标系旋转使用框架。关键是在原坐标系中定义为:

点= [sqrt (2) / 2,√(2) / 2, 0];
在此表示,第一列表示x设在,第二列表示y设在,第三列表示z设在。

你想旋转使用欧拉角表示的点(45岁,45岁,0)。使用两种不同的旋转序列旋转点:

  • 如果您创建一个旋转四元数和指定ZYX股票序列,周围的框架是第一旋转45°z设在,然后在新的45°y设在。

    quatRotator =四元数((45岁,45岁,0),“eulerd”,“ZYX股票”,“帧”);newPointCoordinate = rotateframe (quatRotator点)
    newPointCoordinate = 0.7071 -0.0000 0.7071

    ZYX股票连续三次旋转

  • 如果你创建一个旋转四元数和指定“YZX”序列,周围的框架是第一旋转45°y设在,然后在新的45°z设在。

    quatRotator =四元数((45岁,45岁,0),“eulerd”,“YZX”,“帧”);newPointCoordinate = rotateframe (quatRotator点)
    newPointCoordinate = 0.8536 0.1464 0.5000

    连续三次在YZX旋转

数据类型:字符|字符串

变换,指定为一个se3对象,或作为一个N元组se3对象。N转换的总数。

四元数对象忽略了平移组件的转换和转换转换的3×3的子矩阵旋转四元数。

正交旋转,指定为一个so3对象,或作为一个N元组so3对象。N旋转的总数。

对象的功能

angvel 角速度从四元数的数组
classUnderlying 类零件在四元数
紧凑的 四元数的数组转换为N4矩阵
连词 复共轭的四元数
复共轭转置矩阵的四元数的数组
经销 角距离的弧度
欧拉 四元数转换为欧拉角(弧度)
eulerd 四元数转换为欧拉角(度)
经验值 指数四元数的数组
,\ ldivide Element-wise四元数左部
日志 自然对数的四元数的数组
meanrot 四元数是指旋转
- - - - - - 四元数减法
* 四元数乘法
规范 四元数规范
正常化 四元数归一化
创建四元数与实际数组部分设置为一组和虚部为零
部分 提取零件四元数
^,权力 Element-wise四元数的力量
刺激 一个四元数的数组的产物
randrot 均匀分布随机旋转
,/ rdivide Element-wise四元数正确的部门
rotateframe 四元数帧旋转
rotatepoint 四元数角度旋转
rotmat 四元数转换为旋转矩阵
rotvec 四元数转换为旋转矢量(弧度)
rotvecd 四元数转换为旋转矢量(度)
slerp 球形线性插值
. * * Element-wise四元数乘法
置一个四元数的数组
- - - - - - 四元数一元-
0 创建四元数与所有数组部分设置为0

例子

全部折叠

皮疹=四元数()
皮疹= 0 x0空四元数的数组

默认情况下,底层类双四元数的。

classUnderlying(皮疹)
ans =“双”

您可以创建一个四元数的数组指定四个部分为逗号分隔的标量,矩阵,或多维数组的大小相同。

四元数的部分定义为标量。

一个= 1.1;B = 2.1;C = 3.1;D = 4.1;quatScalar =四元数(A, B, C, D)
quatScalar =四元数1.1 + 2.1 + 3.1 j + 4.1 k

四元数的部分定义为列向量。

一个= [1.1,1.2];B = [2.1, 2.2];C = [3.1, 3.2];D = [4.1, 4.2];quatVector =四元数(A, B, C, D)
quatVector =2 x1四元数的数组1.1 + 2.1 + 3.1 j + 4.1 j k我1.2 + 2.2 + 3.2 + 4.2 k

定义四元数矩阵部分。

一个= [1.1,1.3;1.2、1.4);B = [2.1, 2.3;2.2、2.4);C = [3.1, 3.3;3.2、3.4);D = [4.1, 4.3;4.2、4.4);quatMatrix =四元数(A, B, C, D)
quatMatrix =2 x2四元数的数组1.1 + 2.1 + 3.1 j + 4.1 j k我1.3 + 2.3 + 3.3 + 4.3 j k我1.2 + 2.2 + 3.2 + 4.2 j k我1.4 + 2.4 + 3.4 + 4.4 k

四元数的部分定义为三维数组。

一个= randn (2, 2, 2);B = 0 (2, 2, 2);C = 0 (2, 2, 2);D = 0 (2, 2, 2);quatMultiDimArray =四元数(A, B, C, D)
quatMultiDimArray =2 x2x2四元数的数组quatMultiDimArray (:: 1) = 0.53767 + 0 + 0 j + 0 k -2.2588 + 0 + 0 j + 0 k 1.8339 + 0 + 0 j + 0 k 0.86217 + 0 + 0 j + 0 k quatMultiDimArray (:,: 2) = 0.31877 + 0 + 0 j + 0 k -0.43359 + 0 + 0 j + 0 k -1.3077 + 0 + 0 j + 0 k 0.34262 + 0 + 0 j + 0 k

您可以创建一个标量或指定一个四元数的列向量N4矩阵的四元数部分,列对应于四元数的部分,B, C, D。

创建一个列向量随机四元数。

quatParts =兰特(3、4)
quatParts =3×40.8147 0.9134 0.2785 0.9649 0.9058 0.6324 0.5469 0.1576 0.1270 0.0975 0.9575 0.9706
皮疹=四元数(quatParts)
皮疹=3 x1四元数的数组0.81472 + 0.91338 + 0.2785 j + 0.96489 j k我0.90579 + 0.63236 + 0.54688 + 0.15761 j k我0.12699 + 0.09754 + 0.95751 + 0.97059 k

检索quatParts矩阵的四元数表示,使用紧凑的

retrievedquatParts =紧凑(皮疹)
retrievedquatParts =3×40.8147 0.9134 0.2785 0.9649 0.9058 0.6324 0.5469 0.1576 0.1270 0.0975 0.9575 0.9706

您可以创建一个N1通过指定一个四元数的数组N3成弧度或角度的旋转矩阵向量。旋转向量是紧凑的空间表征与规范化的四元数之间是一对一的关系。

旋转矢量的弧度

创建一个使用旋转矢量和标量四元数验证生成的四元数归一化。

rotationVector = (0.3491, 0.6283, 0.3491);皮疹=四元数(rotationVector,“rotvec”)
皮疹=四元数0.92124 + 0.16994 + 0.30586 j + 0.16994 k
规范(皮疹)
ans = 1.0000

你可以从四元数转换在弧度使用旋转向量rotvec函数。恢复rotationVector四元数,皮疹

rotvec(皮疹)
ans =1×30.3491 0.6283 0.3491

旋转向量度

创建一个使用旋转矢量和标量四元数验证生成的四元数归一化。

rotationVector =(20, 36岁,20);皮疹=四元数(rotationVector,“rotvecd”)
皮疹=四元数0.92125 + 0.16993 + 0.30587 j + 0.16993 k
规范(皮疹)
ans = 1

你可以从四元数转换为旋转向量度使用rotvecd函数。恢复rotationVector四元数,皮疹

rotvecd(皮疹)
ans =1×320.0000 36.0000 20.0000

您可以创建一个n×1四元数的数组通过指定3-by-3-by-N旋转矩阵的数组。每一页的旋转矩阵数组对应于四元数的数组的一个元素。

使用3 x3的旋转矩阵创建一个标量四元数。指定的旋转矩阵是否应被视为一个框架或旋转。

rotationMatrix = [1 0 0;0倍根号(3)/ 2 0.5;0 -0.5倍根号(3)/ 2);皮疹=四元数(rotationMatrix,“rotmat”,“帧”)
皮疹=四元数0.96593 + 0.25882 + 0 j + 0 k

你可以从四元数转换为旋转矩阵使用rotmat函数。恢复rotationMatrix四元数,皮疹

rotmat(皮疹,“帧”)
ans =3×31.0000 0 0 0 0.8660 0.5000 -0.5000 0.8660

您可以创建一个N1通过指定一个四元数的数组N3组欧拉角弧度或度。

欧拉角的弧度

使用欧拉使用1×3语法创建一个标量四元数向量欧拉角的弧度。指定序列的欧拉角和旋转角是否代表一个框架或旋转。

E =π/ 2,0,π/ 4];皮疹=四元数(E,“欧拉”,“ZYX股票”,“帧”)
皮疹=四元数0.65328 + 0.2706 + 0.2706 j + 0.65328 k

你可以从四元数与欧拉角转换使用欧拉函数。恢复欧拉角,E从四元数,皮疹

欧拉(皮疹,“ZYX股票”,“帧”)
ans =1×31.5708 0 0.7854

欧拉角的度

使用eulerd使用1×3语法创建一个标量四元数向量的欧拉角度。指定序列的欧拉角和旋转角是否代表一个框架或旋转。

E = (90 0, 45);皮疹=四元数(E,“eulerd”,“ZYX股票”,“帧”)
皮疹=四元数0.65328 + 0.2706 + 0.2706 j + 0.65328 k

你可以从四元数转换使用欧拉角的度eulerd函数。恢复欧拉角,E从四元数,皮疹

eulerd(皮疹,“ZYX股票”,“帧”)
ans =1×390.0000 0 45.0000

四元数形式的非交换关联代数实数。这个例子说明了四元数代数的规则。

加法和减法

四元数加法和减法逐项地发生,交换:

Q1 =四元数(1、2、3、4)
Q1 =四元数1 + 2 + 3 j + 4 k
Q2 =四元数(9、8、7、6)
Q2 =四元数9 + 8 + 7 j + 6 k
Q1plusQ2 = Q1 + Q2
Q1plusQ2 =四元数10 + 10 + 10 j + 10 k
Q2plusQ1 = Q2 + Q1
Q2plusQ1 =四元数10 + 10 + 10 j + 10 k
Q1minusQ2 = Q1 - Q2
Q1minusQ2 =四元数8 - 6 i - 4 j - 2 k
Q2minusQ1 = Q2 - Q1
Q2minusQ1 =四元数8 + 6 + 4 j + 2 k

您还可以执行加法和减法的实数和四元数。的第一部分称为四元数真正的一部分,而第二、第三和第四部分被称为向量。加法和减法与实数只影响真正的四元数的一部分。

Q1plusRealNumber = Q1 + 5
Q1plusRealNumber =四元数6 + 2 + 3 j + 4 k
Q1minusRealNumber = Q1 - 5所示
Q1minusRealNumber =四元数4 + 2 + 3 j + 4 k

乘法

四元数乘法是由产品决定的基础元素和分配法。下载188bet金宝搏回想一下,乘法的基础元素,,j,k不交换,因此四元数乘法不是交换。

Q1timesQ2 = Q1 * Q2
Q1timesQ2 =四元数-52 + 16 + 54 j + 32 k
Q2timesQ1 = Q2 * Q1
Q2timesQ1 =四元数-52 + 36我+ 14 j + 52 k
isequal (Q1timesQ2 Q2timesQ1)
ans =逻辑0

你也可以用一个四元数乘以一个实数。如果你把一个四元数乘以一个实数,四元数的每一部分分别乘以实数:

Q1times5 = Q1 * 5
Q1times5 =四元数5 + 10 + 15 j + 20 k

一个四元数乘以一个实数是交换。

isequal (Q1 * 5, 5 * Q1)
ans =逻辑1

动词的词形变化

四元数的定义是这样的复共轭向量的每个元素部分的四元数是否定的。

第一季度
Q1 =四元数1 + 2 + 3 j + 4 k
连词(Q1)
ans =四元数1 - 2 i - 3 j - 4 k

乘法四元数和它的共轭之间交换:

isequal (Q1 *连词(Q1)、连词(Q1) * Q1)
ans =逻辑1

你可以将四元数向量,矩阵和多维数组。内置的MATLAB®功能已被加强与四元数。

连接

四元数被视为单个对象在串联和MATLAB数组操作规则。

Q1 =四元数(1、2、3、4);Q2 =四元数(9、8、7、6);qVector = (Q1、Q2)
qVector =1 x2四元数的数组1 + 2 + 3 j + 4 k 9 + 8 + 7 j + 6 k
第三季度=四元数(1、2、3、4);第四季度=四元数(9、8、7、6);qMatrix = [qVector;第三、第四季度)
qMatrix =2 x2四元数的数组1 + 2 + 3 j + 4 k 9 + 8 + 7 j + 6 k 1 - 2 i - 3 j - 4 k 9 - 8 i - 7 j - 6 k
qMultiDimensionalArray (:,: 1) = qMatrix;qMultiDimensionalArray (:: 2) = qMatrix
qMultiDimensionalArray =2 x2x2四元数的数组qMultiDimensionalArray (:: 1) = 1 + 2 + 3 + 4 k 9 + 8我+ 7 j + 6 k 1 - 2 - 3 j - 4 k 9 - 8 i - 7 j - 6 k qMultiDimensionalArray (:,: 2) j = 1 + 2 + 3 + 4 k 9 + 8 + 7 j + 6 k 1 - 2 i - 3 j - 4 k 9 - 8 i - 7 j - 6 k

索引

访问或分配在一个四元数的数组元素,使用索引。

qLoc2 = qMultiDimensionalArray (2)
qLoc2 =四元数1 - 2 i - 3 j - 4 k

取代的四元数指数两个四元数的一个。

qMultiDimensionalArray (2) = (“四元数”)
qMultiDimensionalArray =2 x2x2四元数的数组qMultiDimensionalArray (:: 1) = 1 + 2 + 3 + 4 k 9 + 8我+ 7 j + 6 k 1 + 0 + 0 j + 0 k 9 - 8 i - 7 j - 6 k qMultiDimensionalArray (:,: 2) j = 1 + 2 + 3 + 4 k 9 + 8 + 7 j + 6 k 1 - 2 i - 3 j - 4 k 9 - 8 i - 7 j - 6 k

重塑

重塑四元数的数组,使用重塑函数。

qMatReshaped =重塑(qMatrix 4 1)
qMatReshaped =4 x1四元数的数组1 + 2 + 3 j + 4 k 1 - 2 i - 3 j - 4 k 9 + 8 + 7 j + 6 k 9 - 8 i - 7 j - 6 k

转置

四元数向量和矩阵转置,使用转置函数。

qMatTransposed = ' (qMatrix)
qMatTransposed =2 x2四元数的数组1 + 2 + 3 j + 4 k 1 - 2 i - 3 j - 4 k 9 + 8 + 7 j + 6 k 9 - 8 i - 7 j - 6 k

交换

来交换四元数向量,矩阵,和多维数组,使用交换函数。

qMultiDimensionalArray
qMultiDimensionalArray =2 x2x2四元数的数组qMultiDimensionalArray (:: 1) = 1 + 2 + 3 + 4 k 9 + 8我+ 7 j + 6 k 1 + 0 + 0 j + 0 k 9 - 8 i - 7 j - 6 k qMultiDimensionalArray (:,: 2) j = 1 + 2 + 3 + 4 k 9 + 8 + 7 j + 6 k 1 - 2 i - 3 j - 4 k 9 - 8 i - 7 j - 6 k
qMatPermute =排列(qMultiDimensionalArray [3 1 2])
qMatPermute =2 x2x2四元数的数组qMatPermute (:: 1) = 1 + 2 + 3 j + 4 k 1 + 0 + 0 j + 0 j k 1 + 2 + 3 + 4 k 1 - 2 i - 3 j - 4 k qMatPermute (:,: 2) = 9 + 8 + 7 j + 6 k 9 - 8 i - 7 j - 6 k 9 + 8 + 7 j + 6 k 9 - 8 i - 7 j - 6 k

扩展功能

C / c++代码生成
生成C和c++代码使用MATLAB®编码器™。

版本历史

介绍了R2020b

另请参阅

|