加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Rcpp:将C数组作为NumericMatrix返回到R

发布时间:2020-12-16 09:54:35 所属栏目:百科 来源:网络整理
导读:#include Rcpp.h#include vectorextern "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]; cf
#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,还是可以以某种方式避免这种情况?我试着直接包装输出但是没有用.

解决方法

把它放在一个文件cppfunction.cpp中,然后通过库(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,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),4)
cppfunctionM(x)
##      [,1] [,2]
## [1,]    2    4
## [2,]    3    5
*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读