On Jul 17, 2013, at 3:04 PM, Witold E Wolski <wewol...@gmail.com> wrote:

> How can id do this efficiently in R ?
> 
> 1 0 0
> 0 2 0
> 0 0 3
> 
> 
> rotate right
> 0 0 1
> 0 2 0
> 3 0 0
> rotate left
> 0 0 3
> 0 2 0
> 1 0 0
> 
> What I want to do is described here:
> http://stackoverflow.com/questions/13049575/r-min-max-and-mean-of-off-diagonal-elements-in-a-matrix
> 
> but I want do to it for all off-anti-diagonals.
> 
> I am also concerned that the method described on stackoverflow isn't
> necessarily efficient.
> I work with matrices of size 3k * 3k.
> 


I did not take the time to review in detail the solutions on SO, but here is 
one approach for rotation, albeit, not fully tested:

> mat
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3


# Rotate right
> t(mat)[, ncol(mat):1]
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    0    2    0
[3,]    3    0    0


# Rotate left
> t(mat)[nrow(mat):1, ]
     [,1] [,2] [,3]
[1,]    0    0    3
[2,]    0    2    0
[3,]    1    0    0




big.mat <- matrix(rep(0, 3000 * 3000), ncol = 3000)

> str(big.mat)
 num [1:3000, 1:3000] 0 0 0 0 0 0 0 0 0 0 ...


> system.time(mat.right <- t(big.mat)[, ncol(big.mat):1])
   user  system elapsed 
  0.273   0.000   0.273 


> system.time(mat.left <- t(big.mat)[nrow(big.mat):1], )
   user  system elapsed 
  0.094   0.000   0.099 


Regards,

Marc Schwartz

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to