这个问题可能太简单了,但是我找不到功能性的答案。我们如何提取R中任何方阵的对角线元素?在下面的示例中为:7, 2, 8
。
r <- matrix(c(1, 5, 8, 1:3, 7:9), 3)
答案 0 :(得分:4)
diag(r[,rev(sequence(NCOL(r)))])
#OR
rev(r[row(r) == NCOL(r) - col(r) + 1])
#OR
rev(r[(row(r) + col(r)) == (nrow(r) + 1)])
#[1] 7 2 8
答案 1 :(得分:4)
一种方法可能是
r[(n<-nrow(r))^2-(1:n)*(n-1)]
# [1] 7 2 8
## microbenchmark (matrix(1:1e6,1000))
# Unit: microseconds
# expr min lq mean median uq max neval
# r[(n<-nr... 26.897 39.0075 65.36835 47.309 85.9345 316.97 100
# diag(r[,... 18070.388 18905.3475 20237.09599 19956.615 20423.4695 27798.88 100
# rev(r[ro... 14220.609 21206.7220 21238.59515 22036.275 22599.4490 33252.58 100
答案 2 :(得分:1)
我们还可以生成索引以提取这些元素
n <- nrow(r)
r[seq(n, by = n-1, length = n)]
#[1] 8 2 7
如果顺序很重要,我们可以反转提取的元素。
rev(r[seq(n, by = n-1, length = n)])
#[1] 7 2 8
答案 3 :(得分:0)
您可以使用矩阵子集,例如:
r[matrix(c(1:nrow(r), ncol(r):1), ncol=2)]
#[1] 7 2 8
或向量子集,例如
r[1:nrow(r) + (ncol(r):1-1)*nrow(r)]
#[1] 7 2 8