最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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 内の点について考えます。この点を回転するには、回転の軸と回転の角度を定義します。

回転を四元数で表現すると、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

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

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

データ型: char | string

オブジェクト関数

classUnderlyingClass of parts within quaternion
compactConvert quaternion array to N-by-4 matrix
conjComplex conjugate of quaternion
ctransposeComplex conjugate transpose of quaternion array
distAngular distance in radians
eulerConvert quaternion to Euler angles (radians)
eulerdConvert quaternion to Euler angles (degrees)
meanrotQuaternion mean rotation
minus, -Quaternion subtraction
mtimes, *Quaternion multiplication
normQuaternion norm
normalizeQuaternion normalization
onesCreate quaternion array with real parts set to one and imaginary parts set to zero
partsExtract quaternion parts
prodProduct of a quaternion array
rotateframeQuaternion frame rotation
rotatepointQuaternion point rotation
rotmat四元数の回転行列への変換
rotvecConvert quaternion to rotation vector (radians)
rotvecdConvert quaternion to rotation vector (degrees)
slerpSpherical linear interpolation
times, .*Element-wise quaternion multiplication
ldivide, .\Element-wise quaternion left division
rdivide, ./Element-wise quaternion right division
power, .^Element-wise quaternion power
expExponential of quaternion array
logNatural logarithm of quaternion array
transposeTranspose a quaternion array
uminus, -Quaternion unary minus
zerosCreate quaternion array with all parts set to zero
randrotUniformly distributed random rotations

すべて折りたたむ

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=2×1 object
     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=2×2 object
     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=3×1 object
     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=1×2 object
     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=2×2 object
     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=4×1 object
     1 + 2i + 3j + 4k
    -1 - 2i - 3j - 4k
     9 + 8i + 7j + 6k
    -9 - 8i - 7j - 6k

転置

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

qMatTransposed = transpose(qMatrix)
qMatTransposed=2×2 object
     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 で導入