Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Cuaternión

Crear una matriz de cuaternión

Descripción

Un cuaternión es un número hipercomplejo de cuatro partes utilizado en rotaciones y orientaciones tridimensionales.

Un número de cuaternión se representa en la forma a+bi+cj+dk, donde , , , y las partes son números reales, e i, j y k son los elementos básicos, satisfaciendo la ecuación:abcd i2 = j2 = k2 = ijk = −1.

El conjunto de cuaterniones, denotado por , se define dentro de un espacio vectorial de cuatro dimensiones sobre los números reales,HR4. Cada elemento de tiene una representación única basada en una combinación lineal de los elementos base, i, j, y k.H

Todas las rotaciones en 3-D se pueden describir mediante un eje de rotación y un ángulo alrededor de ese eje. Una ventaja de los cuaterniones sobre las matrices de rotación es que el eje y el ángulo de rotación son fáciles de interpretar. Por ejemplo, considere un punto enR3. Para girar el punto, defina un eje de rotación y un ángulo de rotación.

La representación cuaternión de la rotación puede expresarse como q=cos(θ2)+sin(θ2)(ubi+ucj+udk), donde está el ángulo de rotación y [θub, ucY ud] es el eje de rotación.

Creación

Descripción

ejemplo

quat = quaternion() crea un cuaternión vacío.

ejemplo

quat = quaternion(A,B,C,D) crea una matriz de cuaternión donde las cuatro partes del cuaternión se toman de las matrices , , , y .ABCD Todas las entradas deben tener el mismo tamaño y ser del mismo tipo de datos.

ejemplo

quat = quaternion(matrix) crea una matriz de cuaternión -by-1 a partir de una matriz -by-4, donde cada columna se convierte en una parte del cuaternión.NN

ejemplo

quat = quaternion(RV,'rotvec') crea una matriz de cuaternión -by-1 a partir de una matriz -by-3 de vectores de rotación, .NNRV Cada fila de representa un vector de rotación en radianes.RV

ejemplo

quat = quaternion(RV,'rotvecd') crea una matriz de cuaternión -by-1 a partir de una matriz -by-3 de vectores de rotación, .NNRV Cada fila de representa un vector de rotación en grados.RV

ejemplo

quat = quaternion(RM,'rotmat',PF) crea una matriz de cuaternión -by-1 a partir de la matriz de matrices de rotación 3 por 3 por , . puede ser si los ángulos de Euler representan rotaciones de puntos o para rotaciones de fotogramas.NNRMPF'point''frame'

ejemplo

quat = quaternion(E,'euler',RS,PF) crea una matriz de cuaternión -by-1 a partir de la matriz -by-3, .NNE Cada fila de representa un conjunto de ángulos Euler en radianes.E Los ángulos en son rotaciones sobre los ejes en secuencia.ERS

ejemplo

quat = quaternion(E,'eulerd',RS,PF) crea una matriz de cuaternión -by-1 a partir de la matriz -by-3, .NNE Cada fila de representa un conjunto de ángulos Euler en grados.E Los ángulos en son rotaciones sobre los ejes en secuencia.ERS

Argumentos de entrada

expandir todo

Partes de un cuaternión, especificadas como cuatro escalares separados por comas, matrices o matrices multidimensionales del mismo tamaño.

Ejemplo: crea un cuaternión de la forma 1 + 2i + 3j + 4k.quat = quaternion(1,2,3,4)

Ejemplo: crea una matriz de cuaterniones de 1 por 2 donde yquat = quaternion([1,5],[2,6],[3,7],[4,8])quat(1,1) = 1 + 2i + 3j + 4kquat(1,2) = 5 + 6i + 7j + 8k

Tipos de datos: single | double

Matriz de partes de cuaternión, especificada como una matriz -by-4.N Cada fila representa un cuaternión independiente. Cada columna representa una parte de cuaternión independiente.

Ejemplo: crea una matriz de cuaternión 10 por 1.quat = quaternion(rand(10,4))

Tipos de datos: single | double

Matriz de vectores de rotación, especificada como una matriz -by-3.N Cada fila de representa los elementos [X Y Z] de un vector de rotación.RV Un vector de rotación es un vector de unidad que representa el eje de rotación escalado por el ángulo de rotación en radianes o grados.

Para utilizar esta sintaxis, especifique el primer argumento como una matriz de vectores de rotación y el segundo argumento como el o .'rotvec''rotvecd'

Ejemplo: crea una matriz de cuaternión 10 por 1.quat = quaternion(rand(10,3),'rotvec')

Tipos de datos: single | double

Matriz de matrices de rotación, especificada por una matriz de 3 por 3 o una matriz 3 por 3 por.N Cada página de la matriz representa una matriz de rotación independiente.

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

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

Tipos de datos: single | double

Tipo de matriz de rotación, especificada por o .'point''frame'

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

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

Tipos de datos: char | string

Matriz de ángulos Euler, especificada por una matriz -by-3.N Si utiliza la sintaxis, especifique en radianes.'euler'E Si utiliza la sintaxis, especifique en grados.'eulerd'E

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

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

Tipos de datos: single | double

Secuencia de rotación, especificada como un vector de caracteres de tres elementos:

  • 'YZY'

  • 'YXY'

  • 'ZYZ'

  • 'ZXZ'

  • 'XYX'

  • 'XZX'

  • 'XYZ'

  • 'YZX'

  • 'ZXY'

  • 'XZY'

  • 'ZYX'

  • 'YXZ'

Supongamos que desea determinar las nuevas coordenadas de un punto cuando su sistema de coordenadas se gira mediante la rotación de fotogramas. El punto se define en el sistema de coordenadas original como: En esta representación, la primera columna representa el eje - , la segunda columna representa el -eje y la tercera columna representa el -eje.

point = [sqrt(2)/2,sqrt(2)/2,0];
xyz

Desea girar el punto utilizando la representación de ángulo Euler [45,45,0]. Gire el punto utilizando dos secuencias de rotación diferentes:

  • Si crea un rotador de cuaternión y especifica la secuencia 'ZYX', el fotograma se gira primero 45o alrededor del eje -axis y, a continuación, 45o alrededor del nuevo eje.zy

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

  • Si crea un rotador de cuaternión y especifica la secuencia 'YZX', el fotograma se gira primero 45o alrededor del eje -axis y, a continuación, 45o alrededor del nuevo eje.yz

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

Tipos de datos: char | string

Funciones del objeto

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)
expExponential of quaternion array
logNatural logarithm of quaternion array
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
power, .^Element-wise quaternion power
prodProduct of a quaternion array
randrotUniformly distributed random rotations
rotateframeQuaternion frame rotation
rotatepointQuaternion point rotation
rotmatConvertir cuaternión en matriz de rotación
rotvecConvert quaternion to rotation vector (radians)
rotvecdConvert quaternion to rotation vector (degrees)
slerpSpherical linear interpolation
times, .*Element-wise quaternion multiplication
rdivide, ./Element-wise quaternion right division
ldivide, .\Element-wise quaternion left division
transposeTranspose a quaternion array
uminus, -Quaternion unary minus
zerosCreate quaternion array with all parts set to zero

Ejemplos

contraer todo

quat = quaternion()
quat =     0x0 empty quaternion array 

De forma predeterminada, la clase subyacente del cuaternión es un double.

classUnderlying(quat)
ans =  'double' 

Puede crear una matriz de cuaternión especificando las cuatro partes como escalares separados por comas, matrices o matrices multidimensionales del mismo tamaño.

Defina las piezas de cuaternión como escalares.

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

Defina las partes del cuaternión como vectores de columna.

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

Defina las piezas de cuaternión como matrices.

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

Defina las partes del cuaternión como matrices tridimensionales.

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

Puede crear un vector escalar o de columna de cuaterniones especificando una matriz -by-4 de partes de cuaternión, donde las columnas corresponden a las partes de cuaternión A, B, C y D.N

Cree un vector de columna de cuaterniones aleatorios.

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

Para recuperar la matriz de la representación de cuaternión, utilice .quatPartscompact

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

Puede crear una matriz de cuaternión -by-1 especificando una matriz -by-3 de vectores de rotación en radianes o grados.NN Los vectores de rotación son representaciones espaciales compactas que tienen una relación uno a uno con cuaterniones normalizados.

Vectores de rotación en radianes

Cree un cuaternión escalar utilizando un vector de rotación y compruebe que el cuaternión resultante está normalizado.

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 

Puede convertir de cuaterniones a vectores de rotación en radianes utilizando la función.rotvec Recuperar el del cuaternión, .rotationVectorquat

rotvec(quat)
ans = 1×3

    0.3491    0.6283    0.3491

Vectores de rotación en grados

Cree un cuaternión escalar utilizando un vector de rotación y compruebe que el cuaternión resultante está normalizado.

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

norm(quat)
ans = 1 

Puede convertir de cuaterniones a vectores de rotación en grados utilizando la función.rotvecd Recuperar el del cuaternión, .rotationVectorquat

rotvecd(quat)
ans = 1×3

   20.0000   36.0000   20.0000

Puede crear una matriz de cuaternión N por 1 especificando una matriz de matrices de rotación 3 por 3 por N. Cada página de la matriz de matriz de rotación corresponde a un elemento de la matriz quaternion.

Cree un cuaternión escalar utilizando una matriz de rotación de 3 por 3. Especifique si la matriz de rotación debe interpretarse como una rotación de fotogramas o puntos.

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

Puede convertir de cuaterniones a matrices de rotación utilizando la función.rotmat Recuperar el del cuaternión, .rotationMatrixquat

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

    1.0000         0         0
         0    0.8660    0.5000
         0   -0.5000    0.8660

Puede crear una matriz de cuaternión -by-1 especificando una matriz -by-3 de ángulos Euler en radianes o grados.NN

Euler Angles en Radians

Utilice la sintaxis para crear un cuaternión escalar utilizando un vector 1 por 3 de ángulos Euler en radianes.euler Especifique la secuencia de rotación de los ángulos de Euler y si los ángulos representan una rotación de fotogramas o puntos.

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

Puede convertir de cuaterniones a ángulos Euler utilizando la función.euler Recuperar los ángulos de Euler, , desde el cuaternión, .Equat

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

    1.5708         0    0.7854

Euler Angles en Grados

Utilice la sintaxis para crear un cuaternión escalar utilizando un vector 1 por 3 de ángulos de Euler en grados.eulerd Especifique la secuencia de rotación de los ángulos de Euler y si los ángulos representan una rotación de fotogramas o puntos.

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

Puede convertir de cuaterniones a ángulos Euler en grados utilizando la función.eulerd Recuperar los ángulos de Euler, , desde el cuaternión, .Equat

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

   90.0000         0   45.0000

Los cuaterniones forman un álgebra asociativa no conmutativa sobre los números reales. Este ejemplo ilustra las reglas del álgebra cuaternión.

Suma y resta

La suma y resta de Quaternion se producen parte por parte, y son conmutativas:

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

También puede realizar sumas y resta de números reales y cuaterniones. La primera parte de un cuaternión se conoce como la parte, mientras que las partes segunda, tercera y cuarta se conocen como el .RealVector La suma y la resta con números reales afectan sólo a la parte real del cuaternión.

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

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

Multiplicación

La multiplicación de cuaternión está determinada por los productos de los elementos básicos y la ley distributiva. Recuerde que la multiplicación de los elementos básicos, , , y , no son conmutativas y, por lo tanto, la multiplicación cuaternión no es conmutativa.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

También puede multiplicar un cuaternión por un número real. Si multiplicas un cuaternión por un número real, cada parte del cuaternión se multiplica por el número real individualmente:

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

Multiplicar un cuaternión por un número real es conmutativo.

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

Conjugación

El conjugado complejo de un cuaternión se define de tal forma que cada elemento de la parte vectorial del cuaternión sea negado.

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

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

La multiplicación entre un cuaternión y su conjugado es conmutativa:

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

Puede organizar cuaterniones en vectores, matrices y matrices multidimensionales. Las funciones matlab® integradas se han mejorado para trabajar con cuaterniones.

Concatenar

Los cuaterniones se tratan como objetos individuales durante la concatenación y siguen las reglas de MATLAB para la manipulación de matrices.

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

Indexación

Para acceder o asignar elementos en una matriz quaternion, utilice la indexación.

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

Sustituya el cuaternión en el índice dos por un cuaternión uno.

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

Remodelar

Para cambiar la forma de las matrices de cuaternión, utilice la función.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

Transpuesta

Para transponer vectores y matrices de cuaternión, utilice la función.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

Para permutar vectores de cuaternión, matrices y matrices multidimensionales, utilice la función.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

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Introducido en R2018a