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
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
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
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