2013-04-18 7 views
7

Я пытаюсь упорядочить каждую строку в матрице с несколькими столбцами и множеством строк. Существует ли в R? Более конкретно, давайте установим наше семя 10 и сделать пример матрицы:Векторизация в R

set.seed(10) 
example.matrix = replicate(12,runif(500000)) 

Чтобы заказать example.matrix, я бы,

ordered.example = apply(example.matrix,1,order) 

Но это очень медленно, и я хотел что-то быстрее. В качестве аналогии,

rowSums(example.matrix) 

предпочтительнее,

apply(example.matrix,1,sum) 

Очень высокую оценку.

+0

занимает 8 секунд для меня, я не сказал бы, что это очень медленно :) –

+0

Справа. Это был игрушечный пример меньшего размера, чем у меня, и мне нужно делать это много раз. –

+0

Я понимаю это, но точка остается. Существует несколько других опций для оптимизации скорости, например. написав код на C++, используя параллельные вычисления. Они могут дать лучший эффект. –

ответ

3

Вот способ ускорить его в 10 раз. Это специально адаптировано к вашему примеру и в зависимости от того, каковы ваши реальные данные, как этот метод может работать или не работать.

Идея заключается в том, чтобы добавить 0 в первом ряду, от 1 до второй и так далее, а затем свернуть его в вектор, вид, который затем рекомбинируют в матрицу:

N = 12; M = 500000; d = replicate(N,runif(M)) 

system.time(d1<-t(apply(d, 1, order))) 
# user system elapsed 
# 11.26 0.06 11.34 

system.time(d2<-matrix(order(as.vector(t(matrix(as.vector(d) + 0:(M-1), nrow = M)))) - 
         rep(0:(M-1), each = N)*N, nrow = M, byrow = T)) 
# user system elapsed 
# 1.39 0.14 1.53 

# Note: for some reason identical() fails, but the two are in fact the same 
sum(abs(d1-d2)) 
# 0 
3

Это немного быстрее (ключ немного быть order(row(em), em)):

set.seed(10) 
em <- replicate(12,runif(500000)) 
system.time(a <- matrix(em[order(row(em), em)], nrow=nrow(em), byrow=TRUE)) 
# user system elapsed 
# 5.36 0.12 5.80 

set.seed(10) 
example.matrix <- replicate(12,runif(500000)) 
system.time(ordered.example <- apply(example.matrix,1,order)) 
# user system elapsed 
# 13.36 0.09 15.52 

identical(a, ordered.example) 
# [1] FALSE 
Смежные вопросы