Saltar al contenido

Cómo rotar las posiciones de una matriz en 90 grados

Verificamos completamente cada tutorial de nuestra web con la meta de enseñarte siempre la información veraz y actualizada.

Solución:

La idea aquí es averiguar hacia dónde se desplazan los valores. Una ubicación viene dada por dos índices $ (i, j) $. ¿Cómo transformar los índices?

Primero intentemos rotar los índices alrededor del elemento central:

Matrix Elements   Coordinates
01 02 03 04 05    (1,5) (2,5) (3,5) (4,5) (5,5)
06 07 08 09 10    (1,4) (2,4) (3,4) (4,4) (5,4)
11 12(13)14 15    (1,3) (2,3)((3,3))(4,3) (5,3)
16 17 18 19 20    (1,2) (2,2) (3,2) (4,2) (5,2)
21 22 23 24 25    (1,1) (2,1) (3,1) (4,1) (5,1)

La rotación de $ theta = -90 ^ circ $ alrededor del origen se realiza mediante $$ R = left ( begin array rr cos theta & – sin theta \ sin theta & cos theta end array right) = left ( begin array rr 0 y 1 \ -1 y 0 end array derecha) $$

Además, necesitamos traslaciones de coordenadas antes y después de la rotación, porque nuestro centro de índice es $ (3,3) $ y no $ (0,0) $, por lo que necesitamos coordenadas homogéneas para expresar traslaciones por $ ( Delta x, Delta y) $ en forma de matriz. Primero extendemos la rotación a coordenadas homogéneas $$ R = left ( begin array rr 0 & 1 & 0 \ -1 & 0 & 0 \ 0 & 0 & 1 end array right) $$ y la traducción es $$ T = left ( begin array rr 1 & 0 & Delta x \ 0 & 1 & Delta y \ 0 & 0 & 1 end array right) $$ Actúa en coordenadas como esta: $$ left ( begin array c x ‘\ y’ \ 1 end array right) = left ( begin array ccc 1 & 0 & Delta x \ 0 & 1 & Delta y \ 0 & 0 & 1 end array right) left ( begin array c x \ y \ 1 end array right) = left ( begin array c x + Delta x \ y + Delta y \ 1 end array right) $$ Combinando estas operaciones obtenemos: begin align A & = T ^ – 1 RT \ & = left ( begin array rrr 1 & 0 & 3 \ 0 & 1 & 3 \ 0 & 0 & 1 end array right) left ( begin array rrr 0 & 1 & 0 \ -1 & 0 & 0 \ 0 & 0 & 1 end array right) left ( begin array rrr 1 & 0 & -3 \ 0 & 1 & -3 \ 0 & 0 & 1 end array right) \ & = left ( begin array rrr 1 & 0 & 3 \ 0 & 1 & 3 \ 0 & 0 & 1 end array right) left ( begin array rrr 0 & 1 & -3 \ -1 & 0 & 3 \ 0 & 0 & 1 end array right) \ & = left ( begin array rrr 0 & 1 & 0 \ -1 & 0 & 6 \ 0 & 0 & 1 end array right) end align El paso final es cambiar el orden $ y $: $ y ‘= 6 – y $:

Matrix Elements   Coordinates
01 02 03 04 05    (1,1) (2,1) (3,1) (4,1) (5,1)
06 07 08 09 10    (1,2) (2,2) (3,2) (4,2) (5,2)
11 12(13)14 15    (1,3) (2,3)((3,3))(4,3) (5,3)
16 17 18 19 20    (1,4) (2,4) (3,4) (4,4) (5,4)
21 22 23 24 25    (1,5) (2,5) (3,5) (4,5) (5,5)

Esta transformación afín se puede escribir en forma de matriz como $$ Y = left ( begin array rrr 1 & 0 & 0 \ 0 & -1 & 6 \ 0 & 0 & 1 end array right) = Y ^ – 1 $$ Esto conduce a begin align B & = YT ^ – 1 RTY \ & = left ( begin array rrr 1 & 0 & 0 \ 0 & -1 & 6 \ 0 & 0 & 1 end array right) left ( begin array rrr 0 & 1 & 0 \ -1 & 0 & 6 \ 0 & 0 & 1 end array right) left ( begin array rrr 1 & 0 & 0 \ 0 & -1 & 6 \ 0 & 0 & 1 end array right) \ & = left ( begin array rrr 1 & 0 & 0 \ 0 & -1 & 6 \ 0 & 0 & 1 end array right) left ( begin array rrr 0 & -1 & 6 \ -1 & 0 & 6 \ 0 & 0 & 1 end array right) \ & = left ( begin array rrr 0 & -1 & 6 \ 1 & 0 & 0 \ 0 & 0 & 1 end array right) end align Un elemento de matriz en los índices $ (i, j) $ ($ i $ -ésima fila, $ j $ -ésima columna) tiene coordenadas $ (j, i) $. Por lo tanto, la transformación de índice $ (i, j) a (i ‘, j’) $ es $$ left ( begin array r j ‘\ i’ \ 1 end array right) = left ( begin array rrr 0 & -1 & 6 \ 1 & 0 & 0 \ 0 & 0 & 1 end array right) left ( begin array r j \ i \ 1 end array right) $$ o $$ begin align i ‘& = j \ j’ & = 6 – i end align $$

Un posible algoritmo para calcular la matriz rotada b de una matriz dada a es:

(1,5).each do |i| 
  (1,5).each do |j| 
    b[j, 6-i] = a[i, j]
  end
end

Aquí hay un código de prueba en línea: (enlace) Haga clic en la pestaña marcada “Ejecutar” para ejecutarlo.

Ejemplo:

Hagamos el cálculo para el elemento 18:

Matrix Elements   Matrix Indices
01 02 03 04 05    (1,1) (1,2) (1,3) (1,4) (1,5)
06 07 08 09 10    (2,1) (2,2) (2,3) (2,4) (2,5)
11 12 13 14 15    (3,1) (3,2) (3,3) (3,4) (3,5)
16 17(18)19 20    (4,1) (4,2)((4,3))(4,4) (4,5)
21 22 23 24 25    (5,1) (5,2) (5,3) (5,4) (5,5)

Esta entrada es el elemento de matriz $ a_ 4 3 $. Los índices son $ (i, j) = (4,3) $.

La matriz rotada es

21 16 11 06 01
22 17 12 07 02
23(18)13 08 03
24 19 14 09 04
25 20 15 10 05

El valor ahora es $ b_ 3 2 $, entonces $ (i ‘, j’) = (3,2) $. Esto concuerda con la transformación encontrada.

¿Qué hizo la transformación? Primero, si el elemento inferior izquierdo de la matriz original (el que contiene el valor $ 21 $) está en las coordenadas $ (x, y) = (1,1) $, queremos tener el elemento $ 18 $ en las coordenadas $ (x, y ) = (3,2) $. Entonces, el $ (i, j) = (4,3) $ original se interpreta como coordenadas $ (x, y) = (3,4) $ y se voltea $ Y $ a las coordenadas $ (3,2) $. Luego $ T $ lo traduce a las coordenadas $ (0, -1) $, lo cual está bien ya que se encuentra debajo del elemento central (el centro ahora está en $ (0,0) $). $ R $ lo rota a $ (- 1,0) $, que queda del elemento central (centro ahora en $ (0,0) $), bien de nuevo. $ T ^ – 1 $ lo traduce de nuevo a $ (x’.y ‘) = (2,3) $ que aún queda en el centro. El $ Y ^ – 1 = Y $ final no cambia nada, ya que estamos en la fila del medio. La traducción final a índices matriciales da $ (i ‘, j’) = (3,2) $.

Transponga la matriz, luego invierta el orden de las columnas. Entonces $$ M mapsto M ^ T begin bmatrix 0 & 0 & cdots & 0 & 1 \ 0 & 0 & cdots & 1 & 0 \ vdots & vdots && vdots & vdots \ 0 & 1 & cdots & 0 & 0 \ 1 & 0 & cdots & 0 & 0 end $$ bmatrix instancia $$ begin bmatrix a & b & c \ d & e & f \ g & h & i end bmatrix mapsto begin bmatrix a & b & c \ d & e & f \ g & h & i end bmatrix ^ T begin bmatrix 0 & 0 & 1 \ 0 & 1 & 0 \ 1 & 0 & 0 end bmatrix = begin bmatrix a & d & g \ b & e & h \ c & f & i end bmatrix begin bmatrix 0 & 0 & 1 \ 0 & 1 & 0 \ 1 & 0 & 0 end bmatrix = begin bmatrix g \ h & e & b \ i & f & c end bmatrix $$

Una rotación de 90 grados se puede lograr mediante dos reflexiones en un ángulo de 45 grados, por lo que si toma la transposición de la matriz y luego la multiplica por la matriz de permutación con todos los unos en la diagonal menor y todos los ceros en todas partes, obtendrá un sentido de las agujas del reloj. Rotación de 90 grados. Para una matriz de 2×2, esto se vería así:

A B
C D

Transponer:

A C
B D

Permutar, orden inverso de columnas:

C A
D B

Sin embargo, en un contexto de programación, probablemente sería mejor resolver este problema moviendo los datos.

valoraciones y reseñas

Puedes confirmar nuestra labor poniendo un comentario y puntuándolo te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *