高效地将数值向量的每个元素与前一个元素进行比较

4

我想生成时间间隔值 - 给定一个向量,如20、30、69、89、200,每对之间的差异是多少?

数据集有2500万个元素,因此我研究了R和RCpp两种解决方案 - 速度很重要。 R的实现如下:

intertime <- function(x){

    output <- x[2:length(x)] - x[1:(length(x)-1)]
    return(output)
}

C++ 实现:

NumericVector intertime(NumericVector timestamps) {

  //Identify size of input object
  int input_size = timestamps.size();

  //Instantiate output object
  NumericVector output(input_size-1);

  //Loop over the data
  for(int i = 1; i < input_size;++i){

    //For each entry, the output value is [entry] minus [previous entry]
    output[i-1] = (timestamps[i] - timestamps[i-1]);

  }

  //Return
  return output;
}

C++实现比R实现快约一个数量级。我知道R在向量化操作方面进行了优化,所以速度差异如此之小不应该让我太惊讶,但是:有没有人能想到一种更有效的在Rcpp/C++中执行这些操作的方法?请注意,内容中保留了html标签。

3
我不确定我是否理解了,但 diff(x) 可能是你想要的吗? - Tyler Rinker
我并没有看到这两个函数之间有数量级的速度差异。在我的基准测试中,Rcpp实现比另一个函数快3到4倍,这被我认为是非常出色的(也让我感到相当惊讶)。你在R函数中执行的操作已经得到了强烈的优化(并且是用C实现的)。由于一些额外的检查,diff应该比你的R函数慢。 - Roland
Roland:哦,有趣!你使用的输入向量有多大? - Oliver Keyes
我尝试了长度为1e6和1e7的普通随机数。 - Roland
是的,使用微基准测试框架。Roland 关于 3/4 倍更快的位数是正确的 - 不确定我是怎么错过了那个。结果在这里 - Oliver Keyes
显示剩余3条评论
1个回答

3
在标准C ++中,有std::adjacent_difference函数来完成您想要的操作:
#include <iostream>
#include <numeric>

int main () {
  int val[] = {1,2,3,5,9,11,12};
  int result[7];

  std::adjacent_difference (val, val+7, result);
  for(auto i : result) std::cout << i << " ";
  std::cout << std::endl;
}

实时演示


不错!我会尝试将它与 RCpp 集成并回复你 :)。 - Oliver Keyes
嗯,看起来Rcpp有一个“diff”作为等效的语法糖。至少在我的机器上,这实际上略微,而不是更快。 - Oliver Keyes
1
@OliverKeyes дёҚеҮәжүҖж–ҷпјҢRcppдёӯзҡ„diffе®һзҺ°жңүзӮ№ж…ўгҖӮиҖҢеңЁRcpp11дёӯзҡ„е®һзҺ°еҲҷжӣҙеҘҪгҖӮ - Romain Francois

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接