我想知道是否有可能制作一个infix函数,例如A %o% B
使用Rcpp。
我知道使用该inline
包是可行的,但是在使用时仍无法找到一种方法来执行此操作sourceCpp()
。
当参数肯定是使用和的向量时,我已经完成了%o%
/的以下infix实现:outer()
RcppEigen
inline
`%op%` <- cxxfunction(signature(v1="NumericVector",
v2="NumericVector"),
plugin = "RcppEigen",
body = c("
NumericVector xx(v1);
NumericVector yy(v2);
const Eigen::Map<Eigen::VectorXd> x(as<Eigen::Map<Eigen::VectorXd> >(xx));
const Eigen::Map<Eigen::VectorXd> y(as<Eigen::Map<Eigen::VectorXd> >(yy));
Eigen::MatrixXd op = x * y.transpose();
return Rcpp::wrap(op);
"))
可以很容易地使用导入它sourceCpp()
,但是不能将其作为infix函数。
我目前的尝试如下:
#include <Rcpp.h>
using namespace Rcpp;
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
NumericMatrix outerProd(NumericVector v1, NumericVector v2) {
NumericVector xx(v1);
NumericVector yy(v2);
const Eigen::Map<Eigen::VectorXd> x(as<Eigen::Map<Eigen::VectorXd> >(xx));
const Eigen::Map<Eigen::VectorXd> y(as<Eigen::Map<Eigen::VectorXd> >(yy));
Eigen::MatrixXd op = x * y.transpose();
return Rcpp::wrap(op);
}
因此,总结一下我的问题。是否可以通过提供infix函数sourceCpp
?
是否可以通过提供infix函数
sourceCpp
?
是的。
一如往常,应该阅读Rcpp
小插图!特别是在这里,如果您查看Rcpp属性小插图的第1.6节,您会发现可以使用的name参数来修改函数的名称Rcpp::export
。例如,我们可以这样做:
#include <Rcpp.h>
// [[Rcpp::export(name = `%+%`)]]
Rcpp::NumericVector add(Rcpp::NumericVector x, Rcpp::NumericVector y) {
return x + y;
}
/*** R
1:3 %+% 4:6
*/
然后我们得到:
Rcpp::sourceCpp("~/infix-test.cpp")
> 1:3 %+% 4:6
[1] 5 7 9
因此,您仍然必须在代码中命名有效的C ++名称的C ++函数,但是您可以通过name参数将其导出到R,Rcpp::export
而无需在R端做任何进一步的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句