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

时间:2014-10-08 19:03:04

标签: c++ r rcpp

我试图生成时间值 - 给出一个20,30,69,89,200的矢量,每对之间的区别是什么?

数据集有25m元素,所以我查看了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实现快约1个数量级。我很欣赏R是针对矢量化操作进行优化的,因此速度差异很小,不应该让我感到非常震惊,但是:任何人都可以想到一种体面的方式来执行这些Rcpp / C ++中的操作效率更高?

1 个答案:

答案 0 :(得分: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;
}

LIVE DEMO