RcppEigen как аргумент терпит неудачу - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать функцию, которая вызывает (и выводит) собственную матрицу с длинными значениями типа double, используя 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) {
}

, это терпит неудачу.

Сбой также произойдет, если я попытаюсь с длинным двойным в аргументе (с комбинацией, которая ранее работала, при использовании двойного):

// [[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) {
}

Что я могу с этим поделать?

1 Ответ

0 голосов
/ 19 октября 2018

Второй вариант не работает, поскольку RcppEigen поддерживает только динамические матрицы и векторы для автоматического преобразования из объекта R в объект Eigen.Это имеет смысл, поскольку R-объекты по своей природе являются динамическими по размеру.Следовательно, аргументы измерения в Eigen должны быть либо 1, либо Dynamic, если необходимо преобразование из R.

Третья форма завершается ошибкой, потому что вы пытаетесь инициализировать объект Eigen с помощью long doubleна основе объекта R с использованием double.Помните, что при Eigen::Map объект R и объект 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) {
}

, он компилируется.Я не пробовал, если он работает правильно.

...