1

我有一个对称矩阵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

所以上面是这样一种迂回的做事方式,即使这样,输出也有“重复”的行,因为它们只是被转置了..

有人有更直观的方法吗?

谢谢。

4

2 回答 2

1

自由借鉴 and 的优秀思想@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
于 2014-01-23T10:02:20.657 回答
0
arrayInd(which.max(mat), .dim=dim(mat))

这与@SimonO'Hanlon 基本相同which( mat == max(mat) , arr.ind = TRUE )[1,],但效率更高。

于 2014-01-23T09:40:33.037 回答