四元数

创建一个四元数组

描述

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

四元数在表单中表示 一个 + b + c j + d k ,其中一个,b,c,d各部分为实数,i、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。所有输入必须具有相同的大小,相同的数据类型。

例子

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

例子

皮疹=四元数(RV'rotvec')创建一个N的四元数数组N-乘3矩阵的旋转向量,RV。每一行的RV表示一个以弧度的旋转矢量。

例子

皮疹=四元数(RV'rotvecd')创建一个N的四元数数组N-乘3矩阵的旋转向量,RV。每一行的RV表示度的旋转矢量。

例子

皮疹=四元数(R M“rotmat”,PF)创建一个N×1从3×3副四元阵列N旋转矩阵的阵列,R MPF可以是'点'如果欧拉角代表点旋转“帧”坐标系旋转。

例子

皮疹=四元数(E'欧拉',RS,PF)创建一个N的四元数数组N-by-3矩阵,E。每一行的E表示以弧度为单位的一组欧拉角。的角度E绕轴的旋转是按顺序的吗RS

例子

皮疹=四元数(E“eulerd”,RS,PF)创建一个N的四元数数组N-by-3矩阵,E。每一行的E表示一组以度为单位的欧拉角。的角度E绕轴的旋转是按顺序的吗RS

输入参数

展开全部

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

例:季铵盐=四元数(1,2,3,4)创建一个形式为1 + 2i + 3j + 4k的四元数。

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

数据类型:|

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

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

数据类型:|

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

要使用该语法,指定第一个参数作为旋转矢量的矩阵和第二参数作为所述'rotvec'“rotvecd”

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

数据类型:|

旋转矩阵的阵列,通过指定一个3乘3矩阵或3×3逐N阵列。该数组的每个页面代表一个单独的旋转矩阵。

例:皮疹四元数=(RAND(3), 'rotmat', '点')

例:皮疹四元数=(RAND(3), 'rotmat', '帧')

数据类型:|

旋转矩阵的类型,由'点'“帧”

例:皮疹四元数=(RAND(3), 'rotmat', '点')

例:皮疹四元数=(RAND(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

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

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

数据类型:烧焦|

对象的功能

angvel 从四元阵列角速度
classUnderlying 四元数内零件的类别
紧凑 转换四元数组N4矩阵
连词 四元数的复共轭
ctranspose。” 四元阵列的复共轭转置
经销 以弧度表示的角距离
欧拉 将四元数转换为欧拉角(弧度)
eulerd 将四元数转换为欧拉角(度)
经验值 指数四元阵列的
ldivide。\ 元素四元数左除法
日志 四元数阵列的自然对数
meanrot 四元数是指旋转
- - - - - - - 四元数减法
mtimes,* 四元数乘法
规范 四元数规范
正常化 四元正常化
那些 创建具有设置为一个实部和虚部设定为零四元阵列
部分 提取零件四元数
功率。^ 元素方面的四元数电源
四元数数组的乘积
randrot 均匀分布的随机轮换
rdivide,./ 元素四元数的右除法
rotateframe 四元数帧旋转
rotatepoint 四元数旋转点
rotmat 将四元数转换为旋转矩阵
rotvec 将四元数转换为旋转矢量(弧度)
rotvecd 将四元数转换为旋转矢量(度)
球面线性插值 球面线性插值
次,. * 逐元素乘法四元数
转置,”。 转置一个四元数数组
uminus, 四元数一元-
0 创建四元数数组,所有部分设置为零

例子

全部折叠

季铵盐=四元数()
quat = 0x0空四元数数组

默认情况下,四元数的基础类是double。

classUnderlying(季)
ans =“双”

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

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

一个= 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]。quatVector =四元数(A,B,C,d)
quatVector =2×1四元阵列1.1 + 2.1i + 3.1j + 4.1k 1.2 + 2.2i + 3.2j + 4.2 2k

四元数定义为份基质。

一个= [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×2四元数的数组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 =零(2,2,2);C =零(2,2,2);d =零(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

可以通过指定an来创建四元数的标量或列向量N四元数部分的-4×4矩阵,其中列对应于四元数部分A、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×1阵列的四元数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 =紧凑(季)
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×1四元阵列通过指定一个N-by-3旋转向量的矩阵以弧度或度数。旋转向量是具有与标准化四元数一比一的关系紧凑的空间表示。

以弧度表示的旋转矢量

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

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

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

rotvec(季)
ans =1×30.3491 0.6283 0.3491

旋转向量的学位

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

rotationVector =(20, 36岁,20);皮疹=四元数(rotationVector,“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旋转矩阵创建一个标量四元数。指定旋转矩阵是否应当被解释为一帧或点转动。

旋转矩阵= [1 0 0;...0倍根号(3)/ 2 0.5;...0 -0.5倍根号(3)/ 2);皮疹=四元数(rotationMatrix,'rotmat',“帧”)
皮疹=四元数0.96593 + 0.25882i + 0J + 0K

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

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

您可以创建一个N×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
Q1minusQ2 = Q1 - Q2
Q1minusQ2 =四元数-8 - 6i - 4j - 2k
Q2minusQ1 = Q2  -  Q1
Q2minusQ1 =四元数8 + 6I + 4J + 2K

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

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

乘法

四元数乘法是由基元与分配律的乘积决定的。下载188bet金宝搏回想一下基本元素的乘法,,j,k,是不可交换的,因此四元数乘法是不可交换的。

Q1timesQ2 = Q1 * Q2
Q1timesQ2 =四元数-52 + 16 1 + 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®函数已得到增强,以使用四元数。

CONCATENATE

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

Q1 =四元数(1、2、3、4);Q2 =四元数(9、8、7、6);qVector = (Q1、Q2)
qVector =1×2四元阵列1 + 2I + 3J + 4K 9 + 8i的+ 7J + 6K
Q3 =四元数(-1,-2,-3,-4);Q4 =四元数(-9,-8,-7,-6);的QMatrix = [qVector; Q3,Q4]
qMatrix =2×2四元数的数组1 + 2I + 3J + 4K 9 + 8i的+ 7J + 6K -1  -  2I  -  3J  -  4K -9  -  8I  -  7J  -  6K
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 - 2i - 3j - 4k

与四元一个替换索引两个四元数。

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×1四元数的数组1 + 2I + 3J + 4K -1  -  2I  -  3J  -  4K 9 + 8i的+ 7J + 6K -9  -  8I  -  7J  -  6K

转置

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

qMatTransposed = ' (qMatrix)
qMatTransposed =2×2四元数的数组1 + 2I + 3J + 4K -1  -  2I  -  3J  -  4K 9 + 8i的+ 7J + 6K -9  -  8I  -  7J  -  6K

置换

若要对四元数向量、矩阵和多维数组进行置换,请使用置换函数。

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 + 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 -9  -  8I  -  7J  -  6K

扩展功能

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

介绍了R2020a