【问题标题】:Rcpp: Returning C array as NumericMatrix to RRcpp:将 C 数组作为 NumericMatrix 返回到 R
【发布时间】:2014-10-04 15:25:07
【问题描述】:
#include <Rcpp.h>
#include <vector>
extern "C"
{
  #include "cheader.h"
}

using namespace Rcpp;

// [[Rcpp::export]]

NumericVector cppfunction(NumericVector inputR){

  double const* input = inputR.begin();
  size_t N = inputR.size();
  double output[10*N];
  cfunction(input, N, output);
  std::vector<double> outputR(output, output + sizeof(output) / sizeof(double));
  return wrap(outputR);
}

这可行,除了我必须手动将向量 outputR 转换为 R 中的矩阵。我当然也可以将 outputR 转换为 NumericMatrix(或者我可以吗?)然后返回,但我真正的问题是上述过程是否最优?我是否必须先将输出转换为 std::vector 再转换为 NumericVector/Matrix 或者我可以以某种方式避免这种情况?我尝试直接包装输出,但没有奏效。

【问题讨论】:

  • 什么是cfunctioncheader.h 中有什么内容?如果没有这些信息,您将不会获得太多帮助。
  • 不要使用运行时大小的数组:double output[10*N];
  • 是的,对不起,我可能应该删除该标题部分,因为这与此处无关,并为 cfunction 给出某种定义,尽管我认为该函数的确切作用也不相关。跨度>

标签: c++ c r rcpp


【解决方案1】:

将其放入文件cppfunction.cpp,并通过library(Rcpp); sourceCpp("cppfunction.cpp") 运行它。由于没有提供cfunction,我们提供了一个为每个输入元素加 1:

#include <Rcpp.h>

using namespace Rcpp;

void cfunction(double* x, int n, double* y) {
    for(int i = 0; i < n; i++) y[i] = x[i] + 1;
}

// [[Rcpp::export]]
NumericVector cppfunction(NumericVector x){
  NumericVector y(x.size());
  cfunction(REAL(x), x.size(), REAL(y));
  return y;
}

/*** R
x <- c(1, 2, 3, 4)
cppfunction(x)
## [1] 2 3 4 5
*/

如果你想返回一个NumericMatrix,那么假设x的长度是一个整数平方根:

#include <Rcpp.h>

using namespace Rcpp;

void cfunction(double* x, int n, double* y) {
    for(int i = 0; i < n; i++) y[i] = x[i] + 1;
}

// [[Rcpp::export]]
NumericMatrix cppfunctionM(NumericVector x){
  int n = sqrt(x.size());
  NumericMatrix y(n, n);
  cfunction(REAL(x), x.size(), REAL(y));
  return y;
}

/*** R
x <- c(1, 2, 3, 4)
cppfunctionM(x)
##      [,1] [,2]
## [1,]    2    4
## [2,]    3    5
*/

【讨论】:

  • 谢谢,这很好用。不知道那是真的。
  • 我们可以使用.begin()成员函数来代替REAL();这样上面的函数调用就变成了cfunction(x.begin(), x.size(), y.begin());
  • @Hemmo 你不应该知道 REAL 这是一个 C/R API 宏。 Dirk 使用 .begin() 的提示更像 C++y
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多