【问题标题】:Does converting vectors between Rcpp and C++ (using Rcpp::as or Rcpp::wrap) create a new vector and copy elements?在 Rcpp 和 C++ 之间转换向量(使用 Rcpp::as 或 Rcpp::wrap)是否会创建新向量并复制元素?
【发布时间】:2019-10-27 01:56:32
【问题描述】:

据我了解,在 Rcpp 和 C++ 之间转换向量会创建如下新向量。我的理解对吗?

在将 Rcpp 向量转换为 C++ 向量时,我们使用 Rcpp::as<T>()(例如,Rcpp::as<std::string> 用于 Rcpp::CharacterVector)。 std::vector<std::string> 被创建,原始 Rcpp 元素被复制到 C++ 向量中作为std::string。 这意味着修改新创建的 C++ 向量元素不会影响原始 Rcpp 向量元素。

将 C++ 向量转换为 Rcpp 向量时,我们使用Rcpp::wrap()。 创建相应类型的 Rcpp 向量,并将 C++ 元素作为 Rcpp 对象复制到 Rcpp 向量中。这意味着修改新创建的 Rcpp 向量元素不会影响原始 C++ 向量元素。

【问题讨论】:

  • “视情况而定”。在 R 端的类型上,在 C++ 端的类型上。
  • “视情况而定”......好吧......我想我需要以更具体的方式提问。谢谢。

标签: c++ r vector rcpp


【解决方案1】:

正确,以下函数执行转换:

// conversion from R to C++
Rcpp::as<T>();
// conversion from C++ to R
Rcpp::wrap();

简而言之,将数据从 Rcpp 对象移动到 C++ 向量(反之亦然)会导致生成副本。这已经在这里解释了一点:

Declare a variable as a reference in Rcpp

有关模板的更多信息,请参阅Rcpp Extending 小插图。

Rcpp::*Vectorstd::vector&lt;T&gt; 的费用详情可在此处找到:

Should I prefer Rcpp::NumericVector over std::vector?

避免复制的一种方法是尽可能重用内存。这里暗示了这一点:

Deciding between NumericVector and arma::vec in Rcpp

【讨论】:

  • 作为对这个问题的回答,Rcpp 的作者说“这取决于”。
  • 我有点困惑,但我需要用更具体的方式问。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多