2015-07-21 4 views
2

Я хотел бы вычислить расстояние между каждым элементом в одном векторе и каждый элементом в другом векторе в самых быстрых из возможных путей в Р. небольшого примера является:Кикест расстояние вычисления между двумя большими векторами в R

distf<-function(a,b) abs(a-b) 
x<-c(1,2,3) 
y<-c(1,1,1) 
result<-outer(x,y, distf) 

Проблема в том, что мои x и y теперь имеют длину 30 000 каждый, а R сбой при попытке сделать это вычисление. И это делается только один раз, но я должен повторить процесс 1000 раз в симуляционном исследовании. Есть ли более быстрые функции, чтобы иметь возможность достичь этого?

В конечном итоге мне необходимо определить, какое из этих расстояний меньше фиксированного числа/суппорта. В конце концов, я буду изучать многие такие фиксированные суппорты, поэтому мне нужно сохранить все эти расстояния, особенно если вычисления настолько требовательны. Функция, называемая суппортом в пакете optmatch R, выполняет этот процесс напрямую, но также не может обрабатывать такие большие вычисления.

+0

вам нужно все 45 миллионов (давать или принимать) попарные расстояния в конце, или же вам нужны другие расчеты основаны на тех, расстояния? –

+0

Мне нужно определить, какое из этих расстояний меньше, чем заданное число/суппорт, заменяя единицы, меньшие определенного расстояния на 1, и отдыхайте с 0. Мне потребуются все расстояния, поскольку я хочу изучить различные суппорты в конце концов. Я попробовал функцию, называемую суппорт в пакете optmatch, который выполняет этот процесс напрямую, но он не может справиться с таким большим вычислением. – JennyP

+0

Эта информация, вероятно, должна быть в вашем вопросе. –

ответ

1

Вот версия Rcpp, которая возвращает целочисленную матрицу из 1s и 0s в зависимости от того, является ли каждое парное сравнение равным < = порог. На моей машине потребовалось 22,5 с, чтобы сделать 30 000 на 30 000. Однако выходная матрица немного меньше 7 ГБ.

fast_cal.cpp

#include <Rcpp.h> 

using namespace Rcpp; 

// [[Rcpp::export]] 
NumericMatrix fast_cal(NumericVector x, NumericVector y, double threshold) { 
    const long nr=x.length(); 
    const long nc=y.length(); 
    NumericMatrix output(nr, nc); 
    for (long i=0; i<nr; i++) { 
    for (long j=0; j<nc; j++) { 
     output(i, j) = (fabs(x(i) - y(j)) <= threshold) ? 1 : 0; 
    } 
    } 
    return output; 
} 

Тестирование

library("Rcpp") 
sourceCpp("fast_cal.cpp") 
x <- rnorm(30000) 
y <- rnorm(30000) 
out <- fast_cal(x, y, 0.5) 
+0

Это выглядит великолепно, но я никогда раньше не использовал Rcpp, поэтому я просто читаю, как использовать Rcpp для OS X. Большое спасибо; попробует это решение. – JennyP

+0

Я наконец понял, как запустить этот кусок кода. Это действительно быстро, заняло около 38 секунд в моей системе; определенно помогает моей ситуации. Благодаря! – JennyP