【问题标题】:Quickest distance computation between two large vectors in RR中两个大向量之间的最快距离计算
【发布时间】:2015-07-21 19:45:19
【问题描述】:

我希望在 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 的函数直接执行此过程,但也无法处理如此大的计算。

【问题讨论】:

  • 您是否需要最后的所有 4500 万(给予或接受)成对距离,还是需要基于这些距离进行其他计算?
  • 我需要确定这些距离中的哪些距离小于预先指定的数字/卡尺,用 1 替换小于某个距离的距离,用 0 代替。我将需要所有的距离,因为我希望最终研究不同的卡尺。我在 optmatch 包中尝试了一个名为 caliper 的函数,它直接执行此过程,但它也无法处理如此大的计算。
  • 您的问题中应该有该信息。
  • 好的,已编辑,谢谢。

标签: r matrix distance


【解决方案1】:

这是一个Rcpp 版本,它返回一个由 1 和 0 组成的整数矩阵,具体取决于每对宽比较是否

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)

【讨论】:

  • 看起来不错,但我以前从未使用过 Rcpp,所以我只是在阅读如何在 OS X 上使用 Rcpp。非常感谢;将尝试此解决方案。
  • 我终于想通了如何运行这段代码。它真的很快,在我的系统上花了大约 38 秒;绝对有助于我的情况。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多