0

我正在尝试使用 RcppEigen 创建一个调用(和输出)具有长双精度的特征矩阵的函数。

当我编译时:

// [[Rcpp::export]]
Eigen::Matrix<long double, 4, 4> A_matrix_LPPLS_RcppEigen(const Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>>& onesfgh_LPPLS) {
}

它可以工作(当然,有一个警告,该函数什么都不做)。但是当我做同样的事情时:

// [[Rcpp::export]]
Eigen::Matrix<long double, 4, 4> A_matrix_LPPLS_RcppEigen(const Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, 4>>& onesfgh_LPPLS) {
}

它失败。

如果我在参数中尝试使用 long double (在使用双精度时使用以前有效的组合),它也会失败:

// [[Rcpp::export]]
Eigen::Matrix<long double, 4, 4> A_matrix_LPPLS_RcppEigen(const Eigen::Map<Eigen::Matrix<long double, Eigen::Dynamic, Eigen::Dynamic>>& onesfgh_LPPLS) {
}

我能做些什么呢?

4

1 回答 1

2

第二个变体不起作用,因为 RcppEigen 仅支持动态矩阵和向量,用于从 R 对象到 Eigen 对象的自动转换。这是非常有意义的,因为 R 对象的大小本质上是动态的。因此,Eigen 中的维度参数必须为 1 或Dynamic需要从 R 转换时。

第三种形式失败,因为您尝试使用long double基于 R 对象初始化 Eigen 对象double。请记住,Eigen::MapR 和 Eigen 对象共享相同的内存。如果数据类型不同并且您必须在某处进行转换,那将无法正常工作。如果我删除Eigen::Map,即使用

// [[Rcpp::export]]
Eigen::Matrix<long double, 4, 4> A_matrix_LPPLS_RcppEigen(Eigen::Matrix<long double, Eigen::Dynamic, Eigen::Dynamic>& onesfgh_LPPLS) {
}

它确实编译。如果它工作正常,我还没有尝试过。

于 2018-10-19T15:07:36.960 回答