Rcpp:使用相等范围按键对多图值求和

Posted

技术标签:

【中文标题】Rcpp:使用相等范围按键对多图值求和【英文标题】:Rcpp: sum multimap values by key using equal range 【发布时间】:2018-06-24 02:55:02 【问题描述】:

下面我有一个代码 sn-p 封装了我遇到的问题。

我正在尝试做的事情在 R 中是微不足道的,但在 Rcpp 中要困难得多。我只是根据它们各自的键尝试聚合值。在这个例子中,我只是想得到与第一个键对应的值的总和。我在 C++ 中做了一些非常相似的事情,但出于某种原因,Rcpp 端口给了我一些问题。

另外,请注意,提供的代码仅代表我在处理更大的问题时遇到的问题。所以我明白尝试仅在 Rcpp 中实现这一点并不能很好地利用时间。

#include <Rcpp.h>
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]

int mmap(List x) 

std::multimap<int, int> out;

  for(int i = 0; i < x.size(); ++i) 
    int key_temp = as<List>(as<List>(x[i]))[0];
    int value_temp = as<List>(as<List>(x[i]))[1];
    out.insert(make_pair(key_temp, value_temp));  
  

 pair<multimap<int, int>::iterator, multimap<int, int>::iterator> range = out.equal_range(1);
 int total = accumulate(range.first, range.second,  0);

  return total;


/*
xList <- list()
xList[[1]] <- list()
xList[[1]][1] <- 1
xList[[1]][2] <- 1
xList[[2]] <- list()
xList[[2]][1] <- 1
xList[[2]][2] <- 2
xList[[3]] <- list()
xList[[3]][1] <- 2
xList[[3]][2] <- 2
xList[[4]] <- list()
xList[[4]][1] <- 1
xList[[4]][2] <- 2

mmap(xList)
 */

【问题讨论】:

有些事情看起来很奇怪:您的 outmultimap&lt;int, int&gt; 但后来您使用 multimapvector&lt;int&gt; 而不是 int 的迭代器。故意的? 不,不是故意的,谢谢你的收获。如果这不是 equal_range 的正确用法,你会说我该怎么做?我确信我可以写一个循环,我只是认为会有一个更简单的解决方案。虽然我离 C++ 专家最远,所以我可能是错的。 我用它搞砸了一两分钟,我把大部分东西都修好了,但我不知道 accumulate() 是否可以在迭代器的 pair 上工作。编译问题的页面。 拥有using namespace std 是个坏主意,尤其是当您已经拥有using namespace Rcpp 时。 【参考方案1】:

您收到的第一个错误消息具有指导意义:

/usr/include/c++/7/bits/stl_numeric.h:127:18: error: no match for ‘operator+’ (operand types are ‘int’ and ‘std::pair’)

编译器不知道如何将您的起始值(int)与来自迭代器的新值(代表键值对的pair)相加。幸运的是std::accumulate 带有一个可选参数,该参数带有一个要应用的函数。使用 C++11 我们可以使用一个简单的 lambda 函数:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
int mmap(List x) 

  std::multimap<int, int> out;

  for(int i = 0; i < x.size(); ++i) 
    int key_temp = as<List>(as<List>(x[i]))[0];
    int value_temp = as<List>(as<List>(x[i]))[1];
    out.insert(std::make_pair(key_temp, value_temp));  
  

  auto range = out.equal_range(1);
  int total = std::accumulate(range.first, range.second,  0,
                         [](int a, std::pair<const int, int> b)  return a + b.second; );

  return total;


/*** R
 xList <- list()
 xList[[1]] <- list()
 xList[[1]][1] <- 1
 xList[[1]][2] <- 1
 xList[[2]] <- list()
 xList[[2]][1] <- 1
 xList[[2]][2] <- 2
 xList[[3]] <- list()
 xList[[3]][1] <- 2
 xList[[3]][2] <- 2
 xList[[4]] <- list()
 xList[[4]][1] <- 1
 xList[[4]][2] <- 2

 mmap(xList)
 */

结果:

> mmap(xList)
[1] 5

【讨论】:

优秀。我也有同样的想法,但已经晚了,我没有尝试。很好的答案。

以上是关于Rcpp:使用相等范围按键对多图值求和的主要内容,如果未能解决你的问题,请参考以下文章

具有基于范围的循环遍历 equal_range 的 C++ 多图:错误消息 [重复]

KMP算法详解——多图,多例子(c语言)

多图计数排序竟如此简单!

如何优化多图像拼接?

iOS - (多图上传已封装)

求PHP多图上传代码