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