我想在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次。有没有更快的功能才能实现这个目标?
我最终需要确定这些距离中的哪一个小于固定数量/卡尺。我最终将研究许多这样的固定卡钳,因此,我需要保存所有这些距离,特别是如果计算要求很高的话。 R包optmatch中的一个名为caliper的函数直接执行此过程,但是它也无法处理如此大的计算。
答案 0 :(得分:1)
这是一个Rcpp
版本,它返回1和0的整数矩阵,具体取决于每对宽对比是否<=阈值。在我的机器上花了22.5秒来完成30,000乘30,000。输出矩阵在RAM中略低于7 GB。
<强> 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)