gpt4 book ai didi

c++ - Rcpp:将 C 数组作为 NumericMatrix 返回给 R

转载 作者:太空狗 更新时间:2023-10-29 20:12:42 25 4
gpt4 key购买 nike

#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);
}

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

最佳答案

将其放入文件 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
*/

关于c++ - Rcpp:将 C 数组作为 NumericMatrix 返回给 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26194225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com