10

有没有一种方法可以一次从矩阵中选择一堆预先指定的元素?具体来说,假设我有以下矩阵:

      58        59        60       62        63        64
58  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
59  3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
60  6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
62  8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
63 12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
64 13.401126 11.664533 11.991269 6.762802  3.796884  0.000000

我想选择单元格 [1,2]、[2,3]、[3,4]、[4,5]、[5,6]。我意识到我可以通过索引引用它们,在这种情况下我可以运行:

mymatrix[c(2,9,16,23,30)]

不过这点后面看代码就不是很清楚了。有没有办法一次输入实际的(行、列)引用?

4

3 回答 3

17

可以使用 2 个列矩阵进行索引。将这些行号和列号转换为有效的 R 对象(而不是 Matlab 样式的表达式)后:

> 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

如果您的目标是索引可以更普遍地完成的超对角线:

> mat[col(mat)==row(mat)+1]
[1] 3.772139 3.755554 5.999409 3.810169 3.796884
于 2012-08-16T19:14:48.700 回答
9

针对您的具体情况的解决方案是选择子矩阵并使用diag函数:

R> diag(x[-ncol(x),-1])
[1] 3.772139 3.755554 5.999409 3.810169 3.796884
于 2012-08-16T19:10:38.393 回答
9

与上面发布的类似的解决方案,但处理具有行向量和列向量的情况(这是我遇到此线程时的问题)如下:

> 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
于 2016-02-25T03:50:36.223 回答