R中的diag()函数

R中的diag()函数,r,R,有没有办法在矩阵中使用diag()函数而不使用内置函数或迭代 M<-matrix(1:9, ncol=3) # make a matrix q5b<-function(M){ #function } M仅基于另一个矩阵的子集: > diag(M) [1] 1 5 9 > M[matrix(rep(sequence(ncol(M)), 2), ncol = 2)] [1] 1 5 9 上述问题在非方矩阵中会遇到,因此我们对其进行如下修改 作为

有没有办法在矩阵中使用
diag()
函数而不使用内置函数或迭代

   M<-matrix(1:9, ncol=3) # make a matrix 

    q5b<-function(M){ #function

    }

M仅基于另一个矩阵的子集:

> diag(M)
[1] 1 5 9
> M[matrix(rep(sequence(ncol(M)), 2), ncol = 2)]
[1] 1 5 9
上述问题在非方矩阵中会遇到,因此我们对其进行如下修改

作为您的职责,问题5b的一个答案可以是:

q5b <- function(M) { 
  A <- sequence(ncol(M))[sequence(min(nrow(M), ncol(M)))]
  M[cbind(A, A)]
}

q5b您可以使用函数
row
col
查找列号与行号相同的索引:

row(M) == col(M)
#       [,1]  [,2]  [,3]
# [1,]  TRUE FALSE FALSE
# [2,] FALSE  TRUE FALSE
# [3,] FALSE FALSE  TRUE

M[row(M) == col(M)]
# [1] 1 5 9

很好的解决方案,但你知道为什么它比
diag
或我的替代方案慢这么多吗?@AnandaMahto感谢测试。我假设我的解决方案较慢,因为必须创建两个整数矩阵,其大小与参考矩阵相同。在此之后,使用
=
比较这些矩阵中的所有值。因此,解决方案不是很有效。
row(M) == col(M)
#       [,1]  [,2]  [,3]
# [1,]  TRUE FALSE FALSE
# [2,] FALSE  TRUE FALSE
# [3,] FALSE FALSE  TRUE

M[row(M) == col(M)]
# [1] 1 5 9