Я хочу написать процедуру для создания транспонирования матрицы в виде большой двойной матрицы строк, используя Eigen3 (внутри RcppEigen ).В основном я буду использовать его для матриц разного размера.
В Eigen3 шаблон Matrix
принимает 6 аргументов:
Три обязательны: (Scalar, RowsAtCompileTime и ColsAtCompileTime)
Три необязательных: (Опции, MaxRowsAtCompileTime и MaxColsAtCompileTime) Параметры могут быть RowMajor или ColMajor
Я предпочитаю динамически назначать размеры для матриц, потому что я работаю с большиминаборы данных, и я хочу избежать траты оперативной памяти.
Итак, я написал следующее
Eigen::MatrixXd mktrasp(Eigen::MatrixXd X const int n, const int p){
Eigen::Matrix<double, p, n, RowMajor> T;
T = X.transpose();
return T;
}
Но я получаю ошибки компилятора
ошибка: 'p'не может появляться в константе-выраженииошибка: 'n' не может появляться в константном выражении
Я предполагаю, что это происходит потому, что n
и p
не известны во время компиляции.
Итак, я попробовал это решение
Eigen::MatrixXd mktrasp(Eigen::MatrixXd X, const int n, const int p){
Eigen::Matrix<double, Dynamic, Dynamic, RowMajor> T(p, n);
T = X.transpose();
return T;
}
Это работает, но я полностью потерял сюжет.T
- это динамическая матрица или фиксированный размер сейчас?Безопасно ли это делать?Может кто-нибудь предложить лучший подход?