Selecting specific elements from a matrix all at once

后端 未结 3 564
旧巷少年郎
旧巷少年郎 2021-02-05 23:53

Is there a way I can select a bunch of prespecified elements all at once from a matrix? Specifically, suppose I have the following matrix:

      58        59             


        
相关标签:
3条回答
  • 2021-02-06 00:38

    A similar solution to that posted above, but one that deals with the situation of having a vector for the rows and a vector for the columns (which was my question when I came upon this thread) is as follows:

    > rows <- c(1,2,3,4,5)
    > cols <- c(2,3,4,5,6)
    > call <- cbind(rows,cols)
    > 
    > mat[call]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    
    0 讨论(0)
  • 2021-02-06 00:41

    Indexing can be done with 2 column matrices. After converting those row and column numbers to a valid R object (rather than Matlab-style expressions):

    > idxs <- gsub("\\]",")", gsub("\\[", "c(",  "[1,2], [2,3], [3,4], [4,5] ,[5,6]") )
    # I edited the string value that idxs returned:
    > midx <- rbind( c(1,2), c(2,3), c(3,4), c(4,5) ,c(5,6) )
    > mat <-  matrix(scan(), nrow=6)  
    1:  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
    7:   3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
    13:   6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
    19:   8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
    25:  12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
    31:  13.401126 11.664533 11.991269 6.762802  3.796884  0.000000
    37: 
    Read 36 items
    > mat[midx]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    

    If your goal were to index the super-diagonal that could be accomplished more generally:

    > mat[col(mat)==row(mat)+1]
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    
    0 讨论(0)
  • 2021-02-06 00:48

    A solution to your specific situation would be to select the sub-matrix and use the diag function:

    R> diag(x[-ncol(x),-1])
    [1] 3.772139 3.755554 5.999409 3.810169 3.796884
    
    0 讨论(0)
提交回复
热议问题