3
mat <- matrix(c(1,2,3,4,5,6,7,8,9), ncol=3)

mat[1:2, 1:2] 

返回新的matrix(c(1,2,4,5), ncol=2)

无论如何可以访问矩阵元素,如绘图的 x,y 位置?

一些function(mat, 1:2, 1:2)回报c(1,5),因为mat[1,1]mat[2,2]是 1,5。

一些function(mat, c(1,1,2), c(2,1,1)回报

c(4, 1, 2)

因为mat[1,2], mat[1,1], mat[2,1]是 4,1,2。

4

3 回答 3

6

您可以使用以下方式访问它cbind

mat[cbind(1:2, 1:2)]
# [1] 1 5
mat[cbind(c(1, 1, 2), c(2, 1, 1))]
# [1] 4 1 2
于 2013-05-06T14:36:19.613 回答
2

您可以使用这些从矩阵“坐标”转换为元素编号和子集:

xy2elem <- function(m,x,y) x + nrow(m)*(y-1)

mat[xy2elem(mat,1:2,1:2)]
[1] 1 5
> mat[xy2elem(mat,c(1,1,2),c(2,1,1))]
[1] 4 1 2
于 2013-05-06T14:48:26.323 回答
0

I came up with another looking-ugly answer myself.

mapply(function(x,y){'['(mat,x,y)} , c(1,2), c(2,3) )

I compared "mat[cbind" and "mapply(function(x,y){'['(mat,x,y)} ,",

and the first one was about 100 times faster! ;-p

using the function xy2elem is as fast as using cbind! Impressive!

于 2013-05-06T14:56:13.867 回答