Используя броненосца .memptr()
, мы можем извлечь указатель памяти. Отсюда мы можем использовать Eigen Map<T>()
для создания матрицы Eigen.
Теперь мы можем перейти от матрицы Eigen, используя .data()
для извлечения точки в Структура памяти Эйгена. Затем, используя расширенные параметры конструктора arma::mat
, мы можем создать броненосец матрица а>.
Например:
#include <RcppArmadillo.h>
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Eigen::MatrixXd example_cast_eigen(arma::mat arma_A) {
Eigen::MatrixXd eigen_B = Eigen::Map<Eigen::MatrixXd>(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)
*/
Полученные результаты:
(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
Одно быстрое замечание: если вы используете функцию отображения Eigen, вы должны автоматически получить изменение в матрице Armadillo (и наоборот), например.
#include <RcppArmadillo.h>
#include <RcppEigen.h>
// [[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;
}
Бежать:
map_update(x)
Выход:
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
person
coatless
schedule
12.10.2017
exp()
, что может занять много времени. Вы можете ускорить его, включив OpenMP в Armadillo. - person hbrerkere   schedule 12.10.2017README.txt
, прилагаемый к архиву Armadillo (страница скачать). См. также страницу FAQ Armadillo. - person hbrerkere   schedule 12.10.2017