Extracting off-diagonal slice of large matrix

后端 未结 3 1681
野性不改
野性不改 2020-12-09 05:09

I\'ve got a large nxn matrix and would like to take off-diagonal slices of varying sizes. For example:

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3          


        
相关标签:
3条回答
  • 2020-12-09 05:40

    you can do:

    matrix:

    m<-
    matrix(1:6,ncol = 6, nrow=6 ,byrow = T)
    

    function:

    n_diag <- function (x, n) {
        d <- dim(x)
        ndiag <- .row(d) - n >= .col(d)
        x[upper.tri(x) | ndiag] <- NA
        return(x)
    }
    

    call:

    n_diag(m,3)
    
    #     [,1] [,2] [,3] [,4] [,5] [,6]
    #[1,]    1   NA   NA   NA   NA   NA
    #[2,]    1    2   NA   NA   NA   NA
    #[3,]    1    2    3   NA   NA   NA
    #[4,]   NA    2    3    4   NA   NA
    #[5,]   NA   NA    3    4    5   NA
    #[6,]   NA   NA   NA    4    5    6
    

    just for fun:

    #lapply(1:6, n_diag, x = m)
    
    0 讨论(0)
  • 2020-12-09 05:46

    If you want to use upper.tri and lower.tri you could write functions like these:

    cormat <- mapply(rep, 1:6, 6)
    
    u.diags <- function(X, n) {
      X[n:nrow(X),][lower.tri(X[n:nrow(X),])] <- NA
      return(X)
    }
    

    or

    l.diags <- function(X, n) {
      X[,n:ncol(X)][upper.tri(X[,n:ncol(X)])] <- NA
      return(X)
    }
    

    or

    n.diags <- function(X, n.u, n.l) {
      X[n.u:nrow(X),][lower.tri(X[n.u:nrow(X),])] <- NA
      X[,n.l:ncol(X)][upper.tri(X[,n.l:ncol(X)])] <- NA
      return(X)
    }
    

    l.diags(cormat, 3)
    u.diags(cormat, 3)
    n.diags(cormat, 3, 1)
    
    0 讨论(0)
  • 2020-12-09 05:52
    size <- 6
    mat <- matrix(seq_len(size ^ 2), ncol = size)
    
    
    low <- 0
    high <- 3
    
    delta <- rep(seq_len(ncol(mat)), nrow(mat)) - 
        rep(seq_len(nrow(mat)), each = ncol(mat))
    #or Ben Bolker's better alternative
    delta <- row(mat) - col(mat)
    mat[delta < low | delta > high] <- NA
    mat
    

    this works with 5000 x 5000 matrices on my machine

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