如何将 class Eigen::MatrixXd 的对象转换为 class Rcpp::NumericMatrix
How do you convert object of class Eigen::MatrixXd to class Rcpp::NumericMatrix
我正在开发一个需要一些非常快速的矩阵乘法的包,因此希望使用 RcppEigen
。由于各种原因,虽然与多维数组的需要有关,但我需要将 class Eigen::MatrixXd 的创建对象转换为 class Rcpp::NumericMatrix.
我尝试反转 RcppEigen::FastLm.cpp 中列出的步骤,但这似乎不起作用
例如而不是使用
const Map<MatrixXd> X(as<Map<MatrixXd> >(Xs));
我试过了
Rcpp:NumericMatrix X(as<Rcpp::NumericMatrix>(Xs));
其中 Xs 是 class Eigen::MatrixXd 的矩阵,但这似乎不起作用:“错误:没有匹配函数来调用 'as'
return Rcpp::asRcpp::NumericMatrix(z);
如果这根本不可能,我可以尝试另一个方向。
基本上我需要用 R speak 做的是
a = matrix(1, nrow = 10, ncol = 10)
b = array(0, c(10,10,10))
b[,,1] = a
给出一个更清晰的开始例子
如何将 class MatrixXd 的对象存储在 class NumericMatrix 的对象中?
#include <Rcpp.h>
#include <RcppEigen.h>
using namespace Rcpp;
using namespace Eigen;
// [[Rcpp::export]]
NumericMatrix sample_problem() {
Eigen::MatrixXd x(2, 2); x << 1,1,2,2;
Eigen::MatrixXd z(2, 2);
Eigen::MatrixXd y(2,2); y << 3,3,4,4;
z = x * y; // do some eigen matrix multiplication
Rcpp::NumericMatrix w(2,2);
// what I'd like to be able to do somehow:
// store the results of the eigen object z in
// a NumericMatrix w
// w = z;
return w;
}
感谢您发布代码!它使一切变得更容易。我只是重新安排了你的代码。
关键的变化是通过 RcppEigen
助手从 Eigen 表示“明确地”返回到 SEXP
,然后实例化矩阵。有时……编译器需要一点推动。
代码
#include <Rcpp.h>
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
Rcpp::NumericMatrix sample_problem() {
Eigen::MatrixXd x(2, 2), y(2, 2);
x << 1,1,2,2;
y << 3,3,4,4;
// do some eigen matrix multiplication
Eigen::MatrixXd z = x * y;
// what I'd like to be able to do somehow:
// store the results of the eigen object z in
// a NumericMatrix w
// w = z;
SEXP s = Rcpp::wrap(z);
Rcpp::NumericMatrix w(s);
return w;
}
/*** R
sample_problem()
*/
演示
R> sourceCpp("demo.cpp)
R> sample_problem()
[,1] [,2]
[1,] 7 7
[2,] 14 14
R>
使用 g++-9
我需要 -Wno-ignored-attributes
否则我会收到警告屏幕...
我正在开发一个需要一些非常快速的矩阵乘法的包,因此希望使用 RcppEigen
。由于各种原因,虽然与多维数组的需要有关,但我需要将 class Eigen::MatrixXd 的创建对象转换为 class Rcpp::NumericMatrix.
我尝试反转 RcppEigen::FastLm.cpp 中列出的步骤,但这似乎不起作用
例如而不是使用
const Map<MatrixXd> X(as<Map<MatrixXd> >(Xs));
我试过了
Rcpp:NumericMatrix X(as<Rcpp::NumericMatrix>(Xs));
其中 Xs 是 class Eigen::MatrixXd 的矩阵,但这似乎不起作用:“错误:没有匹配函数来调用 'as' return Rcpp::asRcpp::NumericMatrix(z);
如果这根本不可能,我可以尝试另一个方向。
基本上我需要用 R speak 做的是
a = matrix(1, nrow = 10, ncol = 10)
b = array(0, c(10,10,10))
b[,,1] = a
给出一个更清晰的开始例子
如何将 class MatrixXd 的对象存储在 class NumericMatrix 的对象中?
#include <Rcpp.h>
#include <RcppEigen.h>
using namespace Rcpp;
using namespace Eigen;
// [[Rcpp::export]]
NumericMatrix sample_problem() {
Eigen::MatrixXd x(2, 2); x << 1,1,2,2;
Eigen::MatrixXd z(2, 2);
Eigen::MatrixXd y(2,2); y << 3,3,4,4;
z = x * y; // do some eigen matrix multiplication
Rcpp::NumericMatrix w(2,2);
// what I'd like to be able to do somehow:
// store the results of the eigen object z in
// a NumericMatrix w
// w = z;
return w;
}
感谢您发布代码!它使一切变得更容易。我只是重新安排了你的代码。
关键的变化是通过 RcppEigen
助手从 Eigen 表示“明确地”返回到 SEXP
,然后实例化矩阵。有时……编译器需要一点推动。
代码
#include <Rcpp.h>
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
Rcpp::NumericMatrix sample_problem() {
Eigen::MatrixXd x(2, 2), y(2, 2);
x << 1,1,2,2;
y << 3,3,4,4;
// do some eigen matrix multiplication
Eigen::MatrixXd z = x * y;
// what I'd like to be able to do somehow:
// store the results of the eigen object z in
// a NumericMatrix w
// w = z;
SEXP s = Rcpp::wrap(z);
Rcpp::NumericMatrix w(s);
return w;
}
/*** R
sample_problem()
*/
演示
R> sourceCpp("demo.cpp)
R> sample_problem()
[,1] [,2]
[1,] 7 7
[2,] 14 14
R>
使用 g++-9
我需要 -Wno-ignored-attributes
否则我会收到警告屏幕...