R中两个大向量之间最快的距离计算

Quickest distance computation between two large vectors in R

我希望在 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 次。有没有更快的函数可以实现这个?

我最终需要确定哪些距离小于固定值 number/calliper。我最终会研究许多这样的固定卡尺,因此,我需要保存所有这些距离,尤其是在计算要求如此之高的情况下。 R 包 optmatch 中称为 caliper 的函数直接执行此过程,但也无法处理如此大的计算。

这是一个 Rcpp 版本,其中 returns 一个由 1 和 0 组成的整数矩阵,具体取决于每对宽度比较是否 <= 阈值。在我的机器上,30,000 x 30,000 需要 22.5 秒。不过,输出矩阵在 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)