以前一直纠结R物件与RcppEigen、RcppArmadillo物件的转换,原帖:http://cos.name/cn/topic/153762/,在那里各位大神都了解疑。近来Eigen(RcppEigen)版本更新了好几次,想作者会不会这个转换上前进一步。今天偶尔拿出以前的如下代码:
// [[Rcpp::export]]
Eigen::MatrixXd trans1(Eigen::Map<Eigen::MatrixXd> M) {
return M;
}
// [[Rcpp::export]]
NumericMatrix trans2(SEXP x,SEXP y) {
Eigen::MatrixXd new_x(as<Eigen::MatrixXd>(x));
Eigen::MatrixXd new_y(as<Eigen::MatrixXd>(y));
return wrap(new_x);
}
// [[Rcpp::export]]
List trans3(Eigen::MatrixXd x,Eigen::MatrixXd y) {
return List::create(Named("x%*%y")=x*y, Named("crossprod(x,y)")=x.transpose()*y);
}//当然,trans1和trans3直接修改传入的对象,按照kk的说法,不太推荐。
发现已经可以无差错运行,而以前需要这样:
// [[Rcpp::export]]
List trans4(NumericMatrix AA,NumericMatrix BB) {
typedef Eigen::Map<Eigen::MatrixXd> MapMatd;
const MapMatd A(as<MapMatd>(AA));
const MapMatd B(as<MapMatd>(BB));
const Eigen::MatrixXd A(as<Eigen::MatrixXd>(AA));
const Eigen::MatrixXd B(as<Eigen::MatrixXd>(BB));
Eigen::MatrixXd m(A.cwiseProduct(B));
Eigen::MatrixXd n(A.array().sin());
return List::create(Named("A")=A,Named("B")=B,Named("m")=m,Named("n")=n);
}
先来个映射
map
来定义什么进什么出,然后借此转换为
Eigen
的对象,这下好像省了,也方便了不少。