RCPP中的模板矩阵

Coa*_*oat 1 c++ r vector matrix rcpp

我正在使用Rcpp来创建一个带矩阵和向量的函数,我希望它们都是相同的模板类型.反正有没有这样做?看来你必须在使用之前将矩阵声明为数字或其他东西.

//[[Rcpp::export]]
void MyFunc(Matrix<T> templated_matrix, std::vector<T> set_row)
{
    templated_matrix(0, _) = row;
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*hey 6

这里有几个问题混杂在一起.特别是,Rcpp属性不处理模板函数的导出,因此您无法编写:

// [[Rcpp::export]]
template <typename T>
void MyFunc(T object) { ... }
Run Code Online (Sandbox Code Playgroud)

这是因为在R中键入是动态的(在运行时完成并存储),C++键入是静态的(在编译时必须知道所有内容).您需要在动态和静态世界之间手动生成桥梁.

一种常见的方法是制作模板功能和"调度"功能,例如

template <typename T>
void MyFuncImpl(T object) { .... }

// [[Rcpp::export]]
void MyFunc(SEXP object)
{
    switch (TYPEOF(object))
    {
    case INTSXP: return MyFuncImpl<IntegerVector>(object);
    case REALSXP: return MyFuncImpl<NumericVector>(object);
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可能需要根据传入的对象是否为矩阵来分离调度,例如if (Rf_isMatrix(object)) { ... } else { .... }.

您可能会在Rcpp图库上找到这些文章有用:

顺便说一句 - 如果你想直接在R对象的底层类型上模板,你也可以写:

template <int RTYPE>
void MyFuncImpl(Vector<RTYPE> object) { .... }
Run Code Online (Sandbox Code Playgroud)

根据您的需要,这可能会或可能不会更有用.