2015-06-03 54 views
3

這似乎是一個簡單的問題降序排列與數組的索引,但我無法以快速的方式這樣做。打印矩陣的排序元素在最快的時尚

說我有一個矩陣,我想這個排序矩陣和元素的索引存儲在降序排列。有沒有快速的方法來做到這一點?現在,我提取最大值,存儲結果,將其更改爲-2,然後提取for循環中的下一個最大值。這可能是最低效的方式。

我的問題實際上是要求我在2萬2萬倍矩陣工作。內存不是問題。任何關於最快捷方式的想法都會很棒。

例如,如果我有一個矩陣

>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 
+0

矩陣僅僅是一個以'dim'屬性向量。你不能只是做'命令(m)'或'排序(m)'嗎?我不確定所需的輸出。另外,還可以減少的問題,只是米<' - 基質(runif(100),10,10)'爲了方便和優選使用提供例如當使用''set.seed' runif' –

+0

編輯的問題關於期望的結果。我只需要按矩陣降序排列元素的索引。如果我做'排序(m)',我會失去索引信息,因爲它被轉換爲矢量。 – user1775614

回答

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 
+0

在我的集羣中安裝軟件包接近不可能,我希望基於默認軟件包的解決方案,但這絕對有用。謝謝。 – user1775614

+0

與base R一樣也很容易實現,請參閱我的編輯。我想知道這是如何擴展或你的龐大數據。 –

+0

這太奇怪了。當我嘗試基礎版本的例子,我沒有得到正確的結果,所以我嘗試了一個例子。 '淨< - 矩陣(runif(600 * 600),600600) 行< - nrow(淨值) COLS < - NcoI位(淨值) RES < - cbind( 行=代表(seq_len(行),COLS ), COL =代表(seq_len(COLS),每個=行), VAL = C(淨) ) RES [順序(-res [1,3]),]' 顯然可以在res參見[ 1:10,]它沒有任何順序。我嘗試了不同的種子與runif()。我不知道爲什麼這不起作用。 – user1775614