主要内容

四元数

创建一个四元数数组

描述

四元数是用于三维旋转和方向的四部分超复数。

四元数用下面的形式表示 一个 + b + c j + d k ,在那里一个bc,d部分为实数,i、j、k为基元,满足式:2j =2= k2= ijk =−1

四元数的集合,用H,在实数上的四维向量空间中定义,R4.每一个元素H具有基于基本元素i、j和k的线性组合的唯一表示。

在三维空间中,所有的旋转都可以用一个旋转轴和围绕该轴的角度来描述。四元数相对于旋转矩阵的一个优点是旋转的轴和角度很容易解释。例如,考虑一个点R3..要旋转该点,需要定义一个旋转轴和一个旋转角。

旋转插图

旋转的四元数表示可以表示为 因为 θ 2 + θ 2 u b + u c j + u d k ,在那里θ为旋转角度,[ubuc,ud]是旋转轴。

创建

描述

例子

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

例子

皮疹=四元数(A, B, C, D创建一个四元数数组,其中四个四元数部分取自数组一个BC,D.所有输入必须具有相同的大小和相同的数据类型。

例子

皮疹=四元数(矩阵创建一个N的-by-1四元数数组N-by-4矩阵,其中每一列都成为四元数的一部分。

例子

皮疹=四元数(房车, ' rotvec ')创建一个N的-by-1四元数数组N旋转向量的-乘3矩阵,房车.每行房车表示以弧度为单位的旋转向量。

例子

皮疹=四元数(房车, ' rotvecd ')创建一个N的-by-1四元数数组N旋转向量的-乘3矩阵,房车.每行房车表示旋转向量,单位为度。

例子

皮疹=四元数(RM“rotmat”,PF创建一个N由3 × 3 × -的四元数数组N旋转矩阵数组,RMPF可以是任何一个“点”欧拉角是否表示点旋转“帧”对于坐标系旋转。

例子

皮疹=四元数(E“欧拉”,RSPF创建一个N的四元数数组N3矩阵,E.每行E表示一组以弧度为单位的欧拉角。里面的角度E围绕轴的旋转是顺序的吗RS

例子

皮疹=四元数(E“eulerd”,RSPF创建一个N的四元数数组N3矩阵,E.每行E表示一组以角度为单位的欧拉角。里面的角度E围绕轴的旋转是顺序的吗RS

输入参数

全部展开

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

例子:Quat =四元数(1,2,3,4)创建形式为1 + 2i + 3j + 4k的四元数。

例子:Quat =四元数([1,5],[2,6],[3,7],[4,8])创建一个1 × 2四元数数组,其中Quat (1,1) = 1 + 2i + 3j + 4k而且Quat (1,2) = 5 + 6i + 7j + 8k

数据类型:|

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

例子:四元数(兰特(10,4))创建一个10 × 1四元数数组。

数据类型:|

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

要使用此语法,请将第一个参数指定为旋转向量的矩阵,并将第二个参数指定为“rotvec”“rotvecd”

例子:Quat =四元数(rand(10,3),'rotvec')创建一个10 × 1四元数数组。

数据类型:|

旋转矩阵的数组,由3 × 3矩阵或3 × 3 × -指定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”

假设您想要确定一个点的新坐标,当它的坐标系使用坐标系旋转时。点在原坐标系中定义为:

点=[√(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,point)
    newPointCoordinate = 0.7071 -0.0000 0.7071

    ZYX连续三次旋转

  • 如果您创建了一个四元数旋转器并指定'YZX'序列,则帧首先围绕帧旋转45°y-轴,然后45°周围的新z设在。

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

    YZX连续三次旋转

数据类型:字符|字符串

对象的功能

angvel 角速度来自四元数数组
classUnderlying 四元数中部分的类别
紧凑的 转换四元数数组为N4矩阵
连词 四元数的复共轭
四元数阵的复共轭转置
经销 以弧度为单位的角距离
欧拉 将四元数转换为欧拉角(弧度)
eulerd 将四元数转换为欧拉角(度)
经验值 四元数数组的指数
, \ ldivide 按元素的四元数左除法
日志 四元数数组的自然对数
meanrot 四元数平均旋转
- 四元数减法
四元数乘法
规范 四元数规范
正常化 四元数归一化
创建四元数数组,实部设为1,虚部设为0
部分 提取四元数部分
^,权力 元素四元数幂
刺激 四元数数组的乘积
randrot 均匀分布的随机旋转
, / rdivide 按元素的四元数右除法
rotateframe 四元数帧旋转
rotatepoint 四元数旋转
rotmat 将四元数转换为旋转矩阵
rotvec 将四元数转换为旋转向量(弧度)
rotvecd 将四元数转换为旋转向量(度)
slerp 球面线性插值
. * * 元素四元数乘法
转置四元数数组
- 四元数一元减号
0 创建四元数数组,所有部分设置为零

例子

全部折叠

四元数()
Quat = 0x0空四元数数组

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

classUnderlying(皮疹)
Ans = 'double'

可以通过将四元数指定为相同大小的逗号分隔的标量、矩阵或多维数组来创建四元数数组。

定义四元数部分为标量。

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

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

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

将四元数部分定义为矩阵。

A = [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);四元数(A,B,C,D)
quatMatrix =2x2四元数数组1.1 + 2.1i + 3.1j + 4.1k 1.3 + 2.3i + 3.3j + 4.3k 1.2 + 2.2i + 3.2j + 4.2k 1.4 + 2.4i + 3.4j + 4.4k

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

A = 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 =2x2x2四元数数组quatMultiDimArray(:,:,1) = 0.53767 + 0i + 0j + 0k -2.2588 + 0i + 0j + 0k 1.8339 + 0i + 0j + 0k 0.86217 + 0i + 0j + 0k -0.43359 + 0i + 0j + 0k -1.3077 + 0i + 0j + 0k 0.34262 + 0i + 0j + 0k

类型可以创建四元数的标量或列向量N四元数部分的-by-4矩阵,其中列分别对应四元数部分A、B、C、D。

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

quatParts = rand(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
quat =四元数
皮疹=3x1四元数数组0.81472 + 0.91338i + 0.2785j + 0.96489k 0.90579 + 0.63236i + 0.54688j + 0.15761k 0.12699 + 0.09754i + 0.95751j + 0.97059k

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

retrievedquatParts = compact(quat)
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

您可以创建N-by-1四元数数组N-by-3的旋转矢量矩阵,单位为弧度或角度。旋转向量是紧凑的空间表示,与规范化四元数有一对一的关系。

以弧度为单位的旋转向量

使用旋转向量创建标量四元数,并验证得到的四元数是标准化的。

rotationVector = [0.3491,0.6283,0.3491];quat =四元数(旋转向量,“rotvec”
皮疹=四元数0.92124 + 0.16994i + 0.30586j + 0.16994 4k
规范(皮疹)
Ans = 1.0000

属性可以将四元数转换为弧度单位的旋转向量rotvec函数。恢复rotationVector从四元数来看,皮疹

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

旋转向量(度)

使用旋转向量创建标量四元数,并验证得到的四元数是标准化的。

rotationVector = [20,36,20];quat =四元数(旋转向量,“rotvecd”
皮疹=四元数0.92125 + 0.16993i + 0.30587j + 0.16993k
规范(皮疹)
Ans = 1

方法可以将四元数转换为以度为单位的旋转向量rotvecd函数。恢复rotationVector从四元数来看,皮疹

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

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

使用3 × 3旋转矩阵创建标量四元数。指定旋转矩阵应该解释为帧旋转还是点旋转。

rotationMatrix = [1 0 0;...0√(3)/2 0.5;...0 -0.5根号(3)/2];quat =四元数(旋转矩阵,“rotmat”“帧”
皮疹=四元数0.96593 + 0.25882i + 0j + 0k

属性可以将四元数转换为旋转矩阵rotmat函数。恢复rotationMatrix从四元数来看,皮疹

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

您可以创建N-by-1四元数数组N-by-3欧拉角数组,以弧度或角度表示。

以弧度表示的欧拉角

使用欧拉语法来创建一个标量四元数使用欧拉角的1 × 3矢量弧度。指定欧拉角的旋转顺序,以及这些角是否表示帧旋转或点旋转。

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

可以将四元数转换为欧拉角欧拉函数。求欧拉角,E,由四元数表示,皮疹

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

欧拉角(用角度表示

使用eulerd语法来创建一个标量四元数使用1 × 3向量的欧拉角,以度为单位。指定欧拉角的旋转顺序,以及这些角是否表示帧旋转或点旋转。

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

方法可以将四元数转换为以度为单位的欧拉角eulerd函数。求欧拉角,E,由四元数表示,皮疹

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

四元数在实数上形成非交换的结合代数。这个例子说明了四元数代数的规则。

加减法

四元数加法和减法逐项进行,并且是可交换的:

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

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

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

乘法

四元数乘法是由基元的乘积和分配律决定的。s manbetx 845回想一下基元素的乘法,j,k,是不可交换的,因此四元数乘法是不可交换的。

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

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

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

四元数乘以实数是可交换的。

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

动词的词形变化

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

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

四元数与其共轭数的乘法是可交换的:

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

您可以将四元数组织成向量、矩阵和多维数组。内置的MATLAB®函数已得到增强,可以使用四元数。

连接

四元数在连接过程中被视为单独的对象,并遵循MATLAB规则进行数组操作。

Q1 =四元数(1,2,3,4);Q2 =四元数(9,8,7,6);qVector = [Q1,Q2]
qVector =1x2四元数数组1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
Q3 =四元数(-1,-2,-3,-4);Q4 =四元数(-9,-8,-7,-6)qMatrix = [qVector;Q3,Q4]
qMatrix =2x2四元数数组1 + 2i + 3j + 4k 9 + 8i + 7j + 6k - 2 - 3j - 4k -9 - 8i - 7j - 6k
qMultiDimensionalArray(:,:,1) = qMatrix;qMultiDimensionalArray(:,:,2) = qMatrix
qMultiDimensionalArray =2x2x2四元数数组qMultiDimensionalArray(:,:,1) = 1 + 2i + 3j + 4k 9 + 8i + 7j + 6k -1 - 2i + 3j + 4k 9 + 8i + 7j + 6k -1 - 2i - 3j - 4k -9 - 8i - 7j - 6k

索引

要访问或分配四元数数组中的元素,请使用索引。

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

将索引2处的四元数替换为四元数1。

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

重塑

若要重塑四元数数组,请使用重塑函数。

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

转置

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

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

交换

若要排列四元数向量、矩阵和多维数组,请使用交换函数。

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

扩展功能

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

版本历史

R2020b中介绍