我有一个对称矩阵mat
:
A B C
A 1 . .
B . 1 .
C . . 1
我想计算它的两个最高要素。现在因为它是一个对称矩阵,所以我想用upper.tri
就像这样:
mat.tri<-upper.tri(mat) # convert to upper tri
mat.ord<-order(mat.tri,na.last=TRUE,decreasing=TRUE)[1:2] # order by largest
a.ind<-which(mat%in%mat.tri[mat.ord]) # get absolute indices
r.ind<-arrayInd(a.ind,dim(mat)) # get relative indices
# get row/colnames using these indices
所以上面是这样一种迂回的做事方式,即使这样,输出也有“重复”的行,因为它们只是换位了。
任何人都有更直观的方式来做这件事吗?
感谢。
答案 0 :(得分:1)
从@SimonO'Hanlon
和@lukeA
的优秀想法中借鉴,你可以构建一个双线函数来做你想要的。我用:
arrayInd()
返回数组索引order()
订购上三角元素NA
m[lower.tr(m)] <- NA
的其他技巧
试试这个:
whichArrayMax <- function(m, n=2){
m[lower.tri(m)] <- NA
arrayInd(order(m, decreasing=TRUE)[seq(n)], .dim=dim(m))
}
mat <- matrix( c(1,2,3,2,1,5,3,5,1) , 3 , byrow = TRUE )
mat
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 1 5
[3,] 3 5 1
whichArrayMax(mat, 2)
[,1] [,2]
[1,] 2 3
[2,] 1 3
答案 1 :(得分:0)
arrayInd(which.max(mat), .dim=dim(mat))
与@ SimonO'Hanlon的which( mat == max(mat) , arr.ind = TRUE )[1,]
基本相同,但效率更高。