gpt4 book ai didi

c++ - RCPP 中的模板化矩阵

转载 作者:行者123 更新时间:2023-11-30 00:35:30 24 4
gpt4 key购买 nike

我正在使用 Rcpp 创建一个接受矩阵和 vector 的函数,我希望它们都是相同的模板类型。有没有办法做到这一点?似乎你必须在使用矩阵之前将其声明为数字或其他东西。

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

最佳答案

这里有几个问题交织在一起。特别是,Rcpp 属性不处理模板函数的导出,因此您不能这样写:

// [[Rcpp::export]]
template <typename T>
void MyFunc(T object) { ... }

这是因为 R 中的输入是动态的(在运行时完成和存储),而 C++ 中的输入是静态的(一切都必须在编译时知道)。您需要在动态世界和静态世界之间手动生成一座桥梁。

一种常见的方法是创建一个模板函数和一个"dispatch"函数,例如

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

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

您可能会在 Rcpp gallery 上找到这些文章有帮助:

顺便说一句——如果你想直接在 R 对象的基础类型上进行模板化,你也可以这样写:

template <int RTYPE>
void MyFuncImpl(Vector<RTYPE> object) { .... }

这可能更有用,也可能没有,这取决于您的需要。

关于c++ - RCPP 中的模板化矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27466319/

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