四元

创建一个四元数数组

描述

四元数是在三维旋转和取向中使用的四部分组成的超复数。

四元数在表单中表示 一种 + b 一世 + C Ĵ + d ķ ,在那里一种bC,d份是实数,且i,j和k分别是基础元件,满足方程:一世2j =2= k2= IJK = -1

四元数的集合,用表示H中,在实数四维向量空间中定义,其[R4。每个元素的H具有基于所述基础元件,I,J,和K的线性组合的唯一表示。

在3-d的所有旋转可以通过绕该轴线的旋转和角度的轴进行说明。在旋转矩阵四元数的优点在于,旋转轴和角度是容易理解。例如,考虑在一个点[R3。要旋转该点,需要定义旋转轴和旋转角度。

旋转的四元数表示可以被表示为 q = 因为 θ 2 + θ 2 ü b 一世 + ü C Ĵ + ü d ķ ,在那里θ为旋转角度,[übüC,üd是旋转轴。

创建

描述

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

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

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

皮疹四元数=(房车'rotvec')创建ñ×1从四元阵列ñ-by-3旋转向量的矩阵,房车。每行房车表示以弧度表示的旋转矢量。

皮疹四元数=(房车,' rotvecd ')创建ñ×1从四元阵列ñ-by-3旋转向量的矩阵,房车。每行房车表示以度为单位的旋转向量。

皮疹四元数=(RM'rotmat',PF创建ñ×1从3×3副四元阵列ñ旋转矩阵的阵列,RMPF可以是“点”如果欧拉角表示点旋转或'帧'对于框架旋转。

皮疹四元数=(Ë'欧拉',RSPF创建ñ的四元数数组ñ-by-3矩阵,Ë。每行Ë表示以弧度为单位的一组欧拉角。在角Ë大约在序列中的轴的旋转RS

皮疹四元数=(Ë'eulerd',RSPF创建ñ的四元数数组ñ-by-3矩阵,Ë。每行Ë表示度的一组欧拉角。在角Ë大约在序列中的轴的旋转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 + 4k季铵化合物(1,2)= 5 + 6I + 7J + 8k的

数据类型:|

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

例:季铵盐=四元数(RAND(10,4))创建了一个10×1四元阵列。

数据类型:|

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

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

例:季铵盐=四元数(RAND(10,3), 'rotvec')创建了一个10×1四元阵列。

数据类型:|

旋转矩阵的数组,由3×3矩阵或3×3×-矩阵指定ñ阵列。该数组的每个页面代表一个单独的旋转矩阵。

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

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

数据类型:|

旋转矩阵的输入时,通过指定“点”'帧'

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

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

数据类型:烧焦|字符串

欧拉角矩阵,由an表示ñ3矩阵。如果使用“欧拉”语法,指定Ë在弧度。如果使用'eulerd'语法,指定Ë度。

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

例:皮疹四元数=(Ë, '欧拉', 'XYZ', '帧')

数据类型:|

旋转序列,指定为三元素字符向量:

  • 'YZY'

  • 'YXY'

  • 之一的ZYZ”

  • “ZXZ”

  • “新亚芯”

  • 'XZX'

  • 'XYZ'

  • 'YZX'

  • “ZXY”

  • 'XZY'

  • 'ZYX'

  • “YXZ”

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

点= [SQRT(2)/ 2,SQRT(2)/ 2,0];
在此表示形式中,第一列表示X-轴,第二列表示ÿ- 轴,第三列表示ž设在。

你想使用欧拉角表示来旋转这个点[45,45,0]。使用两个不同的旋转序列旋转点:

  • 如果创建一个四元数旋转器和指定“ZYX”序列,该帧首先被旋转45°的周围ž轴,然后45围绕新°ÿ设在。

    quatRotator =四元数([45,45,0],'eulerd''ZYX''帧');newPointCoordinate = rotateframe(quatRotator,点)
    newPointCoordinate = 0.7071 -0.0000 0.7071

  • 如果创建一个四元数旋转器和指定“YZX”序列,该帧首先被旋转45°的周围ÿ轴,然后45围绕新°ž设在。

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

数据类型:烧焦|字符串

对象函数

angvel 从四元阵列角速度
classUnderlying 四元数内零件的类别
紧凑 转换四元数组ñ-by-4矩阵
连词 四元数的复共轭
ctranspose“ 四元阵列的复共轭转置
经销 以弧度表示的角距离
欧拉 将四元数转换为欧拉角(弧度)
eulerd 四元数转换到欧拉角(度)
经验值 四元数阵列的指数
ldivide。\ 元素方面的四元左师
日志 四元阵列的自然对数
meanrot 四元数是指旋转
- - - - - - - 四元数减法
mtimes, * 四元数乘法
规范 四元数规范
正常化 四元数归一化
创建四元数数组,实部设置为1,虚部设置为0
部分 四元数提取零件
权力,。^ Element-wise四元数的力量
四元数数组的乘积
randrot 均匀分布随机旋转
rdivide。/ 元素方面的四元数师权
rotateframe 四元数帧旋转
rotatepoint 四元数角度旋转
rotmat 将四元数转换为旋转矩阵
rotvec 转换到四元数旋转矢量(弧度)
rotvecd 将四元数转换为旋转矢量(度)
slerp 球面线性插值
次,. * 逐元素乘法四元数
转置,”。 移调四元阵列
UMINUS, - 四元元减号
创建四元数数组,所有部分设置为零

例子

全部折叠

皮疹=四元数()
季铵化合物为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

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

一个= [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.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);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

定义的四元数份作为三维阵列。

一个= 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

可以通过指定an来创建四元数的标量或列向量ñ四元数部分的-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

您可以创建一个ñ×1四元阵列通过指定一个ñ以弧度或角度为单位的旋转向量的-3×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旋转矩阵创建一个标量四元数。指定旋转矩阵是否应当被解释为一帧或点转动。

rotationMatrix = [1 0 0;0倍根号(3)/ 2 0.5;0 -0.5 SQRT(3)/ 2];季铵盐=四元数(rotationMatrix,“rotmat”'帧'
季=四元0.96593 + 0.25882i + 0j + 0k

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

rotmat(皮疹,'帧'
ans =3×31.0000 0 0 0 0.8660 0.5000 0 -0.5000 0.8660

您可以创建一个ñ×1四元阵列通过指定一个ñ以弧度或角度表示的-3×3欧拉角阵列。

以弧度表示的欧拉角

使用欧拉使用欧拉角的1×3向量(以弧度为单位)创建标量四元数的语法。指定欧拉角的旋转顺序,以及这些角是表示框架旋转还是表示点旋转。

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

您可以从四元数转换为欧拉角使用欧拉函数。恢复欧拉角,Ë,从四元数,皮疹

欧拉(皮疹,'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函数。恢复欧拉角,Ë,从四元数,皮疹

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

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

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

乘法

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

Q1timesQ2 = Q1 * Q2
Q1timesQ2 =四元-52 + 16i + 54j + 32k
Q2timesQ1 = Q2 * Q1
Q2timesQ1 =四元-52 + 36 1 + 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 =1×2四元阵列1 + 2i + 3j + 4k 9 + 8i + 7j + 6k
第三季度=四元数(1、2、3、4);第四季度=四元数(9、8、7、6);qMatrix = [qVector;第三、第四季度)
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

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

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

重塑

为了重塑四元阵列,使用重塑函数。

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 + 2I + 3J + 4K 9 + 8i的+ 7J + 6K 1 + 0I + 0j的+ 0K -9  -  8I  -  7J  -  6K qMultiDimensionalArray(:,:,2)= 1 + 2I+ 3J + 4K 9 + 8i的+ 7J + 6K -1  -  2I  -  3J  -  4K -9  -  8I  -  7J  -  6K
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++代码。

介绍了在R2019b