以最快的方式使用数组索引以降序打印矩阵的已排序元素

时间:2015-06-03 21:35:25

标签: r sorting matrix

这似乎是一个简单的问题,但我很难以快速的方式做到这一点。

假设我有一个矩阵,我想对此矩阵进行排序,并按降序存储元素的索引。有快速的方法吗?现在,我正在提取最大值,存储结果,将其更改为-2,然后在for循环中提取下一个最大值。这可能是最低效的方式。

我的问题实际上要求我使用20,000 X 20,000矩阵。记忆不是问题。关于以最快的方式做任何想法都会很棒。

例如,如果我有一个矩阵

>m<-matrix(c(1,4,2,3),2,2)
>m
     [,1] [,2]
[1,]    1    2
[2,]    4    3

我希望结果以降序显示数字:

 row  col val
 2    1   4
 2    2   3
 1    2   2
 1    1   1

1 个答案:

答案 0 :(得分:4)

这是一个可能的data.table解决方案

library(data.table)
rows <- nrow(m) ; cols <- ncol(m)
res <- data.table(
                  row = rep(seq_len(rows), cols), 
                  col = rep(seq_len(cols), each = rows),
                  val = c(m)
)
setorder(res, -val)
res
#    row col val
# 1:   2   1   4
# 2:   2   2   3
# 3:   1   2   2
# 4:   1   1   1

修改:基础R替代

res <- cbind(
        row = rep(seq_len(rows), cols), 
        col = rep(seq_len(cols), each = rows),
        val = c(m)
)    
res[order(-res[, 3]),]
#      row col val
# [1,]   2   1   4
# [2,]   2   2   3
# [3,]   1   2   2
# [4,]   1   1   1