[R] Taking all "complete" diagonals of a matrix

Nordlund, Dan (DSHS/RDA) NordlDJ at dshs.wa.gov
Wed Jul 20 01:34:15 CEST 2011


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Peter Lomas
> Sent: Tuesday, July 19, 2011 2:16 PM
> To: r-help at r-project.org
> Subject: [R] Taking all "complete" diagonals of a matrix
> 
> Hi R-Help!
> 
> I am trying to find a nicer way of extracting all the "complete"
> diagonals
> of a matrix.  I am working with very large matrices that have many more
> rows
> than columns.  I want to be able to extract each of the diagonals that
> are
> as long as the number of columns in the matrix.  I have written a
> rather
> ugly function that presently does the job.  It illustrates what I am
> trying
> to do, but I feel like there must be a cleaner (and faster) way.  Does
> anybody have any ideas?  Here is what I've done so far:
> 
> diagonals <- function(mat){
> output <- matrix(0,(dim(mat)[1]-dim(mat)[2]+1),NCOL(mat))
> for(i in 1:NROW(output)){
>    G <- c()
>    for(j in 1:NCOL(mat)){
>       G  <-  c(G,mat[(i+j-1),j])
>       }
>    output[i,]  <-  G
>   }
>  return(output)
> }
> 
> example <- rbind(rep(1,3),rep(2,3),rep(3,3),rep(4,3),rep(5,3))
> 
> example
>      [,1] [,2] [,3]
> [1,]    1    1    1
> [2,]    2    2    2
> [3,]    3    3    3
> [4,]    4    4    4
> [5,]    5    5    5
> 
>  diagonals(example)
>      [,1] [,2] [,3]
> [1,]    1    2    3
> [2,]    2    3    4
> [3,]    3    4    5
> 
> Many thanks,
> Peter
> 

Peter,

Here are two possibilities.  I leave it up to you to determine whether they are cleaner or faster.

diagonals1 <- function(mat){
  #setup
  R <- dim(mat)[1]
  C <- dim(mat)[2]
  output <- matrix(0,(R-C+1),C)
  #get diagonals
  for(i in 1:(R-C+1)) output[i,] <- diag(mat[i:(i+C-1),])
  return(output)
}

diagonals2 <- function(mat){
  #setup
  R <- dim(mat)[1]
  C <- dim(mat)[2]
  output <- matrix(0,(R-C+1),C)
  #get diagonals
  for(i in 1:(R-C+1)) output[,i] <- mat[i:(i+C-1),i]
  return(output)
}


Hope this is helpful,

Dan

Daniel J. Nordlund
Washington State Department of Social and Health Services
Planning, Performance, and Accountability
Research and Data Analysis Division
Olympia, WA 98504-5204



More information about the R-help mailing list