How can I convert from an Armadillo Matrix to an Eigen MatrixXd and vice versa?
I have nu as an arma::vec of size N, z>
Using armadillo's .memptr() class member function, we are able to extract the memory pointer. From here, we can use Eigen's Map
Now, we can go from the Eigen matrix using the .data() member function to extract a point to Eigen's memory structure. Then, using the advanced constructor options of arma::mat we can create an armadillo matrix.
For example:
#include
#include
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Eigen::MatrixXd example_cast_eigen(arma::mat arma_A) {
Eigen::MatrixXd eigen_B = Eigen::Map(arma_A.memptr(),
arma_A.n_rows,
arma_A.n_cols);
return eigen_B;
}
// [[Rcpp::export]]
arma::mat example_cast_arma(Eigen::MatrixXd eigen_A) {
arma::mat arma_B = arma::mat(eigen_A.data(), eigen_A.rows(), eigen_A.cols(),
false, false);
return arma_B;
}
/***R
(x = matrix(1:4, ncol = 2))
example_cast_eigen(x)
example_cast_arma(x)
*/
Results:
(x = matrix(1:4, ncol = 2))
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
example_cast_eigen(x)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
example_cast_arma(x)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
One quick remark: If you are using Eigen's Mapping function, then you should automatically have the change in the Armadillo matrix (and vice versa), e.g.
#include
#include
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
void map_update(Eigen::MatrixXd eigen_A) {
Rcpp::Rcout << "Eigen Matrix on Entry: " << std::endl << eigen_A << std::endl;
arma::mat arma_B = arma::mat(eigen_A.data(), eigen_A.rows(), eigen_A.cols(),
false, false);
arma_B(0, 0) = 10;
arma_B(1, 1) = 20;
Rcpp::Rcout << "Armadill Matrix after modification: " << std::endl << arma_B << std::endl;
Rcpp::Rcout << "Eigen Matrix after modification: " << std::endl << eigen_A << std::endl;
}
Run:
map_update(x)
Output:
Eigen Matrix on Entry:
1 3
2 4
Armadill Matrix after modification:
10.0000 3.0000
2.0000 20.0000
Eigen Matrix after modification:
10 3
2 20