Поверните матрицу в R

У меня есть matrix в R:

|1|2|3| |1|2|3| |1|2|3| 

Есть ли простой способ повернуть всю матрицу на 90 gradleусов по часовой стрелке, чтобы получить эти результаты?

 |1|1|1| |2|2|2| |3|3|3| 

и снова поворачивается на 90 gradleусов:

 |3|2|1| |3|2|1| |3|2|1| 

?

t не поворачивает записи, он переворачивается по диагонали:

 x <- matrix(1:9, 3) x ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9 t(x) ## [,1] [,2] [,3] ## [1,] 1 2 3 ## [2,] 4 5 6 ## [3,] 7 8 9 

90 gradleусов по часовой стрелке вращения матрицы R:

Вам необходимо также отменить столбцы перед транспозицией:

 rotate <- function(x) t(apply(x, 2, rev)) rotate(x) ## [,1] [,2] [,3] ## [1,] 3 2 1 ## [2,] 6 5 4 ## [3,] 9 8 7 rotate(rotate(x)) ## [,1] [,2] [,3] ## [1,] 9 6 3 ## [2,] 8 5 2 ## [3,] 7 4 1 rotate(rotate(rotate(x))) ## [,1] [,2] [,3] ## [1,] 7 8 9 ## [2,] 4 5 6 ## [3,] 1 2 3 rotate(rotate(rotate(rotate(x)))) ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9 

90 gradleусов против часовой стрелки вращения матрицы R:

Выполнение транспонирования перед обратным rotationм совпадает с поворотом против часовой стрелки:

 foo = matrix(1:9, 3) foo ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9 foo <- apply(t(foo),2,rev) foo ## [,1] [,2] [,3] ## [1,] 7 8 9 ## [2,] 4 5 6 ## [3,] 1 2 3 
 m <- matrix(rep(1:3,each=3),3) [,1] [,2] [,3] [1,] 1 2 3 [2,] 1 2 3 [3,] 1 2 3 t(m[nrow(m):1,]) [,1] [,2] [,3] [1,] 1 1 1 [2,] 2 2 2 [3,] 3 3 3 m[nrow(m):1,ncol(m):1] [,1] [,2] [,3] [1,] 3 2 1 [2,] 3 2 1 [3,] 3 2 1 t(m)[ncol(m):1,] [,1] [,2] [,3] [1,] 3 3 3 [2,] 2 2 2 [3,] 1 1 1 

Легкий способ поворота матрицы на 180 ° заключается в следующем:

 m <- matrix(1:8,ncol=4) # [,1] [,2] [,3] [,4] # [1,] 1 3 5 7 # [2,] 2 4 6 8 rot <- function(x) "[<-"(x, , rev(x)) rot(m) # [,1] [,2] [,3] [,4] # [1,] 8 6 4 2 # [2,] 7 5 3 1 rot(rot(m)) # [,1] [,2] [,3] [,4] # [1,] 1 3 5 7 # [2,] 2 4 6 8 

R для поворота матрицы на 90 gradleусов и -90 gradleусов

 #first reverse, then transpose, it's the same as rotate 90 degrees rotate_clockwise <- function(x) { t( apply(x, 2, rev))} #first transpose, then reverse, it's the same as rotate -90 degrees: rotate_counter_clockwise <- function(x) { apply( t(x),2, rev)} #or if you want a library to help make things easier to read: #install.packages("pracma") library(pracma) rotate_one_eighty <- function(x) { rot90(x, 2) } rotate_two_seventy <- function(x) { rot90(x, -1) } foo = matrix(1:9, 3) foo foo = rotate_clockwise(foo) foo foo = rotate_counter_clockwise(foo) foo foo = rotate_one_eighty(foo) foo 

Печать:

  [,1] [,2] [,3] [1,] 1 4 7 #original matrix [2,] 2 5 8 [3,] 3 6 9 [,1] [,2] [,3] [1,] 3 2 1 [2,] 6 5 4 #rotated 90 degrees [3,] 9 8 7 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 #rotated -90 degrees [3,] 3 6 9 [,1] [,2] [,3] [1,] 9 6 3 [2,] 8 5 2 #rotated 180 degrees [3,] 7 4 1 

Обратите внимание, что rotation матрицы по часовой стрелке, а затем против часовой стрелки возвращает числа в исходное положение, а поворот на 180 - на 90 раз.

Или объединены в одну функцию (на основе Эрика Лещински):

 rotate <- function(x, clockwise=T) { if (clockwise) { t( apply(x, 2, rev)) } else {apply( t(x),2, rev)} } 
  • Компактная запись индексирования матрицы MATLAB
  • Как искать строку в массиве ячеек в MATLAB?
  • Interesting Posts
    Давайте будем гением компьютера.