Rotate a Matrix in R

前端 未结 5 1111
情歌与酒
情歌与酒 2020-11-27 12:08

I have a matrix in R like this:

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

Is there an easy way to rotate the entire matrix by 90 degrees clockwise to get the

相关标签:
5条回答
  • 2020-11-27 12:19

    An easy way to rotate a matrix by 180° is this:

    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
    
    0 讨论(0)
  • 2020-11-27 12:22

    Or combined in a single function (based on Eric Leschinski):

    rotate  <- function(x, clockwise=T) {
      if (clockwise) { t( apply(x, 2, rev))
      } else {apply( t(x),2, rev)} 
    }
    
    0 讨论(0)
  • 2020-11-27 12:23
    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
    
    0 讨论(0)
  • 2020-11-27 12:29

    t does not rotate the entries, it flips along the diagonal:

    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 degree clockwise rotation of R matrix:

    You need to also reverse the columns prior to the transpose:

    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 degree counter clockwise rotation of R matrix:

    Doing the transpose prior to the reverse is the same as rotate counter clockwise:

    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
    
    0 讨论(0)
  • 2020-11-27 12:45

    R methods to rotate a matrix 90 degrees and -90 degrees

    #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
    

    Prints:

         [,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
    

    Notice that rotating a matrix clockwise, then counterclockwise returns the numbers to their original position, then rotating by 180 is like rotating by 90 twice.

    0 讨论(0)
提交回复
热议问题