Main Content

quaternion

説明

四元数とは、3 次元の回転および方向に使用される、4 つの部分からなる多元数です。

四元数は、a+bi+cj+dk の形式で表現されます。ここで、a、b、c、d の各部分は実数であり、i、j、k は等式 i2 = j2 = k2 = ijk = −1 を満たす基底元です。

H で示される四元数の集合は、実数上の 4 次元ベクトル空間 R4 内で定義されます。H の要素にはそれぞれ、基本要素 i、j、および k の線形結合に基づいた一意な表現があります。

3 次元での回転はすべて、回転の軸と、その軸を中心とした角度によって表現できます。四元数が回転行列より優れている点は、回転の軸と角度が解釈しやすいことです。たとえば、R3 内の点について考えます。この点を回転するには、回転の軸と回転の角度を定義します。

Rotation Illustration

回転を四元数で表現すると、q=cos(θ2)+sin(θ2)(ubi+ucj+udk) として表すことができます。ここで θ は回転角度であり、[ub、uc、および ud] は回転軸です。

作成

説明

quat = quaternion() は、空の四元数を作成します。

quat = quaternion(A,B,C,D) は四元数配列を作成し、四元数の 4 つの部分は配列 ABC、および D から取得されます。すべての入力が、同じサイズ、同じデータ型でなければなりません。

quat = quaternion(matrix) は、N 行 4 列の行列から N 行 1 列の四元数配列を作成し、各列が四元数の 1 部分となります。

quat = quaternion(RV,'rotvec') は、回転ベクトル RV の N 行 3 列の行列から N 行 1 列の四元数配列を作成します。RV の各行がそれぞれ 1 つの回転ベクトル (ラジアン単位) を表します。

quat = quaternion(RV,'rotvecd') は、回転ベクトル RV の N 行 3 列の行列から N 行 1 列の四元数配列を作成します。RV の各行がそれぞれ 1 つの回転ベクトル (度単位) を表します。

quat = quaternion(RM,'rotmat',PF) は、回転行列 RM の 3 x 3 x N の配列から N 行 1 列の四元数配列を作成します。PF は、オイラー角が点の回転を表す場合は 'point' となり、座標系の回転を表す場合は 'frame' となります。

quat = quaternion(E,'euler',RS,PF) は、N 行 3 列の行列 E から N 行 1 列の四元数配列を作成します。E の各行は、それぞれ 1 セットのオイラー角 (ラジアン単位) を表します。E 内の角度は、シーケンス RS の座標軸を中心とした回転です。

quat = quaternion(E,'eulerd',RS,PF) は、N 行 3 列の行列 E から N 行 1 列の四元数配列を作成します。E の各行は、それぞれ 1 セットのオイラー角 (度単位) を表します。E 内の角度は、シーケンス RS の座標軸を中心とした回転です。

入力引数

すべて展開する

四元数の各部分。同じサイズの 4 つのコンマ区切りのスカラー、行列、または多次元配列として指定します。

例: quat = quaternion(1,2,3,4) は、1 + 2i + 3j + 4k の形式の四元数を作成します。

例: quat = quaternion([1,5],[2,6],[3,7],[4,8]) は、quat(1,1) = 1 + 2i + 3j + 4k および quat(1,2) = 5 + 6i + 7j + 8k である 1 行 2 列の四元数配列を作成します。

データ型: single | double

四元数の各部分の行列。N 行 4 列の行列として指定します。行はそれぞれ別々の四元数を表します。列はそれぞれ別々の四元数の部分を表します。

例: quat = quaternion(rand(10,4)) は、10 行 1 列の四元数配列を作成します。

データ型: single | double

回転ベクトルの行列。N 行 3 列の行列として指定します。RV の各行は、回転ベクトルの [X Y Z] 要素を表します。回転ベクトルは、回転の角度 (ラジアン単位または度単位) でスケーリングされた回転の軸を表す単位ベクトルです。

この構文を使用するには、1 つ目の引数を回転ベクトルの行列として、2 つ目の引数を 'rotvec' または 'rotvecd' として指定します。

例: quat = quaternion(rand(10,3),'rotvec') は、10 行 1 列の四元数配列を作成します。

データ型: single | double

回転行列の配列。3 行 3 列の行列または 3 x 3 x N の配列として指定します。配列の各ページはそれぞれ別々の回転行列を表します。

例: quat = quaternion(rand(3),'rotmat','point')

例: quat = quaternion(rand(3),'rotmat','frame')

データ型: single | double

回転行列のタイプ。'point' または 'frame' によって指定します。

例: quat = quaternion(rand(3),'rotmat','point')

例: quat = quaternion(rand(3),'rotmat','frame')

データ型: char | string

オイラー角の行列。N 行 3 列の行列として指定します。'euler' 構文を使用する場合は、E をラジアン単位で指定します。'eulerd' 構文を使用する場合は、E を度単位で指定します。

例: quat = quaternion(E,'euler','YZY','point')

例: quat = quaternion(E,'euler','XYZ','frame')

データ型: single | double

回転シーケンス。3 要素の文字ベクトルとして指定します。

  • 'YZY'

  • 'YXY'

  • 'ZYZ'

  • 'ZXZ'

  • 'XYX'

  • 'XZX'

  • 'XYZ'

  • 'YZX'

  • 'ZXY'

  • 'XZY'

  • 'ZYX'

  • 'YXZ'

ある点の座標系が、座標系の回転を使用して回転されたときに、新しい座標を特定すると仮定します。この点は、元の座標系では以下のように定義されています。

point = [sqrt(2)/2,sqrt(2)/2,0];
この表現では、最初の列が x 軸を表し、2 番目の列が y 軸を表し、3 番目の列が z 軸を表しています。

オイラー角表現 [45,45,0] を使用して、点を回転します。点を回転するには、次の 2 つの異なる回転シーケンスを使用します。

  • 四元数回転子を作成し、'ZYX' シーケンスを指定する場合、座標系はまず z 軸を中心に 45 度回転され、次に新しい y 軸を中心に 45 度回転されます。

    quatRotator = quaternion([45,45,0],'eulerd','ZYX','frame');
    newPointCoordinate = rotateframe(quatRotator,point)
    newPointCoordinate =
    
        0.7071   -0.0000    0.7071

    Three Consecutive Rotations in ZYX

  • 四元数回転子を作成し、'YZX' シーケンスを指定する場合、座標系はまず y 軸を中心に 45 度回転され、次に新しい z 軸を中心に 45 度回転されます。

    quatRotator = quaternion([45,45,0],'eulerd','YZX','frame');
    newPointCoordinate = rotateframe(quatRotator,point)
    newPointCoordinate =
    
        0.8536    0.1464    0.5000

    Three Consecutive Rotations in YZX

データ型: char | string

オブジェクト関数

angvelquaternion 配列による角速度
classUnderlyingquaternion の各部分のクラス
compactquaternion 配列を N 行 4 列の行列に変換
conj四元数の複素共役
'quaternion 配列の複素共役転置
dist角距離 (ラジアン)
euler四元数をオイラー角 (ラジアン) に変換
eulerd四元数をオイラー角 (度) に変換
expquaternion 配列の指数
.\,ldivide要素単位の四元数の左除算
logquaternion 配列の自然対数
meanrot四元数の平均回転
-四元数の減算
*四元数の乗算
norm四元数のノルム
normalize四元数正規化
ones実数部が 1 に設定され、虚数部が 0 に設定された quaternion 配列を作成
parts四元数の各部分の抽出
.^,power要素単位の四元数のべき乗
prodquaternion 配列の積
randrot一様分布のランダムな回転
./,rdivide要素単位の四元数の右除算
rotateframe四元数の座標系の回転
rotatepoint四元数の点の回転
rotmat四元数の回転行列への変換
rotvec四元数の回転ベクトルへの変換 (ラジアン単位)
rotvecd四元数の回転ベクトルへの変換 (度単位)
slerp球面線形内挿
.*,times要素単位の四元数の乗算
'quaternion 配列の転置
-四元数の単項マイナス
zerosすべての部分が 0 に設定された quaternion 配列を作成

すべて折りたたむ

quat = quaternion()
quat = 

  0x0 empty quaternion array

既定では、四元数の基となるクラスは double です。

classUnderlying(quat)
ans = 
'double'

四元数配列を作成するには、4 つの部分を、同じサイズのコンマ区切りのスカラー、行列、または多次元配列として指定します。

四元数の各部分をスカラーとして定義します。

A = 1.1;
B = 2.1;
C = 3.1;
D = 4.1;
quatScalar = quaternion(A,B,C,D)
quatScalar = quaternion
     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 = quaternion(A,B,C,D)
quatVector = 2x1 quaternion array
     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 = quaternion(A,B,C,D)
quatMatrix = 2x2 quaternion array
     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

四元数の各部分を 3 次元配列として定義します。

A = randn(2,2,2);
B = zeros(2,2,2);
C = zeros(2,2,2);
D = zeros(2,2,2);
quatMultiDimArray = quaternion(A,B,C,D)
quatMultiDimArray = 2x2x2 quaternion array
quatMultiDimArray(:,:,1) = 

     0.53767 +       0i +       0j +       0k     -2.2588 +       0i +       0j +       0k
      1.8339 +       0i +       0j +       0k     0.86217 +       0i +       0j +       0k


quatMultiDimArray(:,:,2) = 

     0.31877 +       0i +       0j +       0k    -0.43359 +       0i +       0j +       0k
     -1.3077 +       0i +       0j +       0k     0.34262 +       0i +       0j +       0k

四元数のスカラーまたは列ベクトルを作成するには、四元数の各部分の N 行 4 列の行列を指定します。列はそれぞれ、四元数の部分 A、B、C、D に対応します。

ランダムな四元数の列ベクトルを作成します。

quatParts = rand(3,4)
quatParts = 3×4

    0.8147    0.9134    0.2785    0.9649
    0.9058    0.6324    0.5469    0.1576
    0.1270    0.0975    0.9575    0.9706

quat = quaternion(quatParts)
quat = 3x1 quaternion array
     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 行列を取得するには、compact を使用します。

retrievedquatParts = compact(quat)
retrievedquatParts = 3×4

    0.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 行 3 列の行列をラジアンまたは度単位で指定します。回転ベクトルは、正規化された四元数と 1 対 1 の関係をもつ、コンパクトな空間的表現です。

ラジアン単位の回転ベクトル

回転ベクトルを使用してスカラー四元数を作成し、結果の四元数が正規化されていることを検証します。

rotationVector = [0.3491,0.6283,0.3491];
quat = quaternion(rotationVector,'rotvec')
quat = quaternion
     0.92124 + 0.16994i + 0.30586j + 0.16994k

norm(quat)
ans = 1.0000

四元数からラジアン単位の回転ベクトルに変換するには、関数 rotvec を使用します。四元数 quat から rotationVector を復元します。

rotvec(quat)
ans = 1×3

    0.3491    0.6283    0.3491

度単位の回転ベクトル

回転ベクトルを使用してスカラー四元数を作成し、結果の四元数が正規化されていることを検証します。

rotationVector = [20,36,20];
quat = quaternion(rotationVector,'rotvecd')
quat = quaternion
     0.92125 + 0.16993i + 0.30587j + 0.16993k

norm(quat)
ans = 1

四元数から度単位の回転ベクトルに変換するには、関数 rotvecd を使用します。四元数 quat から rotationVector を復元します。

rotvecd(quat)
ans = 1×3

   20.0000   36.0000   20.0000

回転行列の 3 x 3 x N の配列を指定することによって、N 行 1 列の四元数配列を作成できます。回転行列配列の各ページは、四元数配列の 1 つの要素に対応します。

3 行 3 列の回転行列を使用して、スカラー四元数を作成します。回転行列を、座標系か点のどちらの回転として解釈するかを指定します。

rotationMatrix = [1 0         0; ...
                  0 sqrt(3)/2 0.5; ...
                  0 -0.5      sqrt(3)/2];
quat = quaternion(rotationMatrix,'rotmat','frame')
quat = quaternion
     0.96593 + 0.25882i +       0j +       0k

四元数から回転行列に変換するには、関数 rotmat を使用します。四元数 quat から rotationMatrix を復元します。

rotmat(quat,'frame')
ans = 3×3

    1.0000         0         0
         0    0.8660    0.5000
         0   -0.5000    0.8660

N 行 3 列のオイラー角の配列をラジアンまたは度単位で指定することにより、N 行 1 列の四元数配列を作成できます。

ラジアン単位のオイラー角

euler 構文でラジアン単位のオイラー角の 1 行 3 列のベクトルを使用して、スカラー四元数を作成します。オイラー角の回転シーケンスと、角度が座標系か点のどちらの回転を表すかを指定します。

E = [pi/2,0,pi/4];
quat = quaternion(E,'euler','ZYX','frame')
quat = quaternion
     0.65328 +  0.2706i +  0.2706j + 0.65328k

四元数からオイラー角に変換するには、関数 euler を使用します。四元数 quat からオイラー角 E を復元します。

euler(quat,'ZYX','frame')
ans = 1×3

    1.5708         0    0.7854

度単位のオイラー角

eulerd 構文で度単位のオイラー角の 1 行 3 列のベクトルを使用して、スカラー四元数を作成します。オイラー角の回転シーケンスと、角度が座標系か点のどちらの回転を表すかを指定します。

E = [90,0,45];
quat = quaternion(E,'eulerd','ZYX','frame')
quat = quaternion
     0.65328 +  0.2706i +  0.2706j + 0.65328k

四元数から度単位のオイラー角に変換するには、関数 eulerd を使用します。四元数 quat からオイラー角 E を復元します。

eulerd(quat,'ZYX','frame')
ans = 1×3

   90.0000         0   45.0000

四元数は、実数上の非可換結合代数を形成します。この例は、四元数代数の規則を説明しています。

加算と減算

四元数の加算と減算は部分ごとに発生し、可換です。

Q1 = quaternion(1,2,3,4)
Q1 = quaternion
     1 + 2i + 3j + 4k

Q2 = quaternion(9,8,7,6)
Q2 = quaternion
     9 + 8i + 7j + 6k

Q1plusQ2 = Q1 + Q2
Q1plusQ2 = quaternion
     10 + 10i + 10j + 10k

Q2plusQ1 = Q2 + Q1
Q2plusQ1 = quaternion
     10 + 10i + 10j + 10k

Q1minusQ2 = Q1 - Q2
Q1minusQ2 = quaternion
    -8 - 6i - 4j - 2k

Q2minusQ1 = Q2 - Q1
Q2minusQ1 = quaternion
     8 + 6i + 4j + 2k

実数と四元数の加算や減算も実行できます。四元数の最初の部分は "実数" 部と呼ばれ、2 番目、3 番目、4 番目の部分は "ベクトル" と呼ばれます。実数を使用した加算および減算は、四元数の実数部のみに影響します。

Q1plusRealNumber = Q1 + 5
Q1plusRealNumber = quaternion
     6 + 2i + 3j + 4k

Q1minusRealNumber = Q1 - 5
Q1minusRealNumber = quaternion
    -4 + 2i + 3j + 4k

乗算

四元数の乗算は、基本要素の積と分配法則によって決まります。前述したように、基本要素 ijk の乗算は可換ではないため、四元数の乗算は可換ではありません。

Q1timesQ2 = Q1 * Q2
Q1timesQ2 = quaternion
    -52 + 16i + 54j + 32k

Q2timesQ1 = Q2 * Q1
Q2timesQ1 = quaternion
    -52 + 36i + 14j + 52k

isequal(Q1timesQ2,Q2timesQ1)
ans = logical
   0

四元数は実数で乗算することもできます。四元数を実数で乗算する場合、四元数の各部分が個別に実数で乗算されます。

Q1times5 = Q1*5
Q1times5 = quaternion
      5 + 10i + 15j + 20k

四元数の実数による乗算は可換です。

isequal(Q1*5,5*Q1)
ans = logical
   1

共役

四元数の複素共役は、四元数のベクトル部分の各要素の符号を反転して定義されます。

Q1
Q1 = quaternion
     1 + 2i + 3j + 4k

conj(Q1)
ans = quaternion
     1 - 2i - 3j - 4k

四元数とその共役の間の乗算は可換です。

isequal(Q1*conj(Q1),conj(Q1)*Q1)
ans = logical
   1

四元数を整理して、ベクトル、行列、多次元配列にまとめることができます。組み込みの MATLAB® 関数が、四元数に対応するように強化されています。

連結

四元数は、連結中は個々のオブジェクトとして処理され、配列の操作に関しては MATLAB の規則に従います。

Q1 = quaternion(1,2,3,4);
Q2 = quaternion(9,8,7,6);

qVector = [Q1,Q2]
qVector = 1x2 quaternion array
     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k

Q3 = quaternion(-1,-2,-3,-4);
Q4 = quaternion(-9,-8,-7,-6);

qMatrix = [qVector;Q3,Q4]
qMatrix = 2x2 quaternion array
     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

qMultiDimensionalArray(:,:,1) = qMatrix;
qMultiDimensionalArray(:,:,2) = qMatrix
qMultiDimensionalArray = 2x2x2 quaternion array
qMultiDimensionalArray(:,:,1) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k


qMultiDimensionalArray(:,:,2) = 

     1 + 2i + 3j + 4k     9 + 8i + 7j + 6k
    -1 - 2i - 3j - 4k    -9 - 8i - 7j - 6k

インデックス

四元数配列で要素にアクセスしたり要素を割り当てたりするには、インデックスを使用します。

qLoc2 = qMultiDimensionalArray(2)
qLoc2 = quaternion
    -1 - 2i - 3j - 4k

インデックス 2 の四元数を四元数 1 に置き換えます。

qMultiDimensionalArray(2) = ones('quaternion')
qMultiDimensionalArray = 2x2x2 quaternion array
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

形状変更

四元数配列の形状を変更するには、関数 reshape を使用します。

qMatReshaped = reshape(qMatrix,4,1)
qMatReshaped = 4x1 quaternion array
     1 + 2i + 3j + 4k
    -1 - 2i - 3j - 4k
     9 + 8i + 7j + 6k
    -9 - 8i - 7j - 6k

転置

四元数のベクトルおよび行列を転置するには、関数 transpose を使用します。

qMatTransposed = transpose(qMatrix)
qMatTransposed = 2x2 quaternion array
     1 + 2i + 3j + 4k    -1 - 2i - 3j - 4k
     9 + 8i + 7j + 6k    -9 - 8i - 7j - 6k

並べ替え

四元数のベクトル、行列および多次元配列を並べ替えるには、関数 permute を使用します。

qMultiDimensionalArray
qMultiDimensionalArray = 2x2x2 quaternion array
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 = permute(qMultiDimensionalArray,[3,1,2])
qMatPermute = 2x2x2 quaternion array
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® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2018a で導入