代码之家  ›  专栏  ›  技术社区  ›  JennyP

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

  •  2
  • JennyP  · 技术社区  · 11 年前

    我希望以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现在的长度都是30000,而R在尝试进行计算时崩溃。这只是一次,但我必须在模拟研究中重复这个过程1000次。有什么更快的功能可以实现这一点吗?

    我最终需要确定这些距离中哪一个小于固定数量/卡尺。我最终会研究许多这样的固定卡尺,因此,我需要保存所有这些距离,特别是在计算要求如此高的情况下。R包optmatch中的一个称为caliper的函数直接执行这个过程,但它也不能处理这么大的计算。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Nick Kennedy    11 年前

    这是一个 Rcpp 版本,该版本返回1和0的整数矩阵,取决于每对宽度的比较是否<=阈值。在我的机器上,30000乘30000需要22.5秒。不过,输出矩阵的RAM略低于7 GB。

    快速_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)