user1775614
user1775614

Reputation: 451

Printing the sorted elements of a matrix in descending order with array indices in the fastest fashion

This seems like a simple problem but I am having trouble doing this in a fast manner.

Say I have a matrix and I want to sort this matrix and store the indices of the elements in descending order. Is there a quick way to do this? Right now, I am extracting the maximum, storing the result, changing it to -2, and then extracting the next maximum in a for loop. Which is probably the most inefficient way to do it.

My problem actually requires me to work on a 20,000 X 20,000 matrix. Memory is not an issue. Any ideas about the fastest way to do it would be great.

For example if I have a matrix

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

I want the result to indicate the numbers in descending order:

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

Upvotes: 3

Views: 345

Answers (1)

David Arenburg
David Arenburg

Reputation: 92310

Here's a possible data.table solution

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

Edit: a base R alternative

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

Upvotes: 4

Related Questions