在R中定义一个矩阵,然后将其传递到C

Define a matrix in R and pass it to C++

本文关键字:然后 定义 一个      更新时间:2023-10-16

我在R中定义了一个矩阵。我需要将此矩阵传递给C 函数,并在C 中进行操作。示例:在R中定义一个矩阵,

A <- matrix(c(9,3,1,6),2,2,byrow=T)
PROTECT( A = AS_NUMERIC(A) );
double* p_A = NUMERIC_POINTER(A);

我需要将此矩阵传递到C 函数,其中将使用矩阵A。

初始化类型vector<vector<double>>的"数据"

我似乎无法弄清楚如何做到这一点。我想以更复杂的方式思考,我敢打赌,有一种简单的方法可以做到这一点。

正如保罗所说,我建议将Rcpp用于此类事情。但这也取决于您希望vector< vector<double> >的意思。假设您想存储列,则可以这样处理矩阵:

require(Rcpp)
require(inline)
fx <- cxxfunction( signature( x_ = "matrix" ), '
    NumericMatrix x(x_) ;
    int nr = x.nrow(), nc = x.ncol() ;
    std::vector< std::vector<double> > vec( nc ) ;
    for( int i=0; i<nc; i++){
        NumericMatrix::Column col = x(_,i) ;
        vec[i].assign( col.begin() , col.end() ) ;
    }
    // now do whatever with it
    // for show here is how Rcpp::wrap can wrap vector<vector<> >
    // back to R as a list of numeric vectors
    return wrap( vec ) ;
', plugin = "Rcpp" )
fx( A )
# [[1]]
# [1] 9 1
# 
# [[2]]
# [1] 3 6    

您可能要使用RCPP。该软件包允许轻松地集成R和C ,包括将对象从R到C 的传递。该包装可在Cran上找到。此外,Cran上的许多包装都使用RCPP,因此它们可以作为灵感。RCPP的网站在这里:

http://dirk.eddelbuettel.com/code/rcpp.html

包括一些教程。

相关文章: