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)
这里有几个问题混杂在一起.特别是,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)
根据您的需要,这可能会或可能不会更有用.
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |