[R] Taking all "complete" diagonals of a matrix
Dennis Murphy
djmuser at gmail.com
Wed Jul 20 02:10:46 CEST 2011
Hi:
Does this work for you?
mydiags <- function(mat) diag(mat[seq_len(ncol(mat)), ])
# Example:
set.seed(103)
u <- matrix(rpois(200, 10), ncol = 10)
# > dim(u)
# [1] 20 10
mydiags(u)
# [1] 7 12 6 13 12 6 5 6 14 6
u[1:10, ] # as a double check
HTH,
Dennis
On Tue, Jul 19, 2011 at 2:15 PM, Peter Lomas <peter.lomas at ucalgary.ca> wrote:
> 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
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at 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.
>
More information about the R-help
mailing list