Как можно извлечь метки столбцов из матрицы Rcpp::Eigen?
Например, вот некоторая R-матрица
mat <- matrix(1:4,ncol=2)
colnames(mat) <- c("col1","col2")
С помощью Rcpp::NumericMatrix можно просто вызывать имена столбцов следующим образом:
void fun_NM(const Rcpp::NumericMatrixXd& Mat)
{
Rcpp::CharacterVector coln = colnames(Mat);
Rcpp::Rcout << coln << "\n\n";
}
Затем fun_NM(mat)
печатает «col1» «col2», как и должно быть. Есть ли способ получить доступ к этим именам столбцов, когда матрица передается как Eigen::MatrixXd?
void fun_EM(const Eigen::MatrixXd& Mat)
{
?
}
Я не знаю, как RcppEigen преобразует матрицу R, переданную в код Rcpp, в Eigen::MatrixXd. Сначала он преобразует его в Rcpp::NumericMatrix? В этом случае можно использовать Rcpp::NumericMatrix в качестве входных данных, извлечь столбцы, а затем преобразовать их в Eigen::MatrixXd вручную в коде, чтобы использовать функцию из библиотеки Eigen.
Спасибо! Дело в том, что я хотел бы использовать имена столбцов, используемые пользователем R в этой функции «симпатичного принтера». Есть ли способ сделать это с помощью Eigen::Matrix или мне нужно изменить ввод на Rcpp::NumericMatrix, а затем преобразовать в Eigen::MatrixXd после считывания меток столбцов?
Это помогает отступить. Что такое имена? Атрибут. Итак, в R мы бы сделали
mat <- matrix(1:4,ncol=2)
colnames(mat) <- c("col1","col2")
attributes(mat)
Что ж, оказывается, в C++ с Rcpp примерно то же самое --- см. несколько статей в Галерее Rcpp или ответы здесь.
Но, и всегда есть но, переход к матрице Eigen отбрасывает атрибуты, поскольку классы Eigen C++ не имеют такого понятия. Но если вы хотите, вы начинаете с SEXP
(или NumericMatrix
), получаете доступ к атрибутам и затем продолжаете. Очень простой пример ниже.
#include <RcppEigen.h>
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
void showNames(SEXP m) {
Rcpp::NumericMatrix nm(m); // to easily access attributes
Rcpp::List dmnm = nm.attr("dimnames");
print(dmnm);
// continue as before
Eigen::MatrixXd Mat = Rcpp::as<Eigen::MatrixXd>(m); // make Mat from m as before
// ... some stuff with Mat
}
/*** R
mat <- matrix(1:4,ncol=2)
colnames(mat) <- c("col1","col2")
attributes(mat)
showNames(mat)
*/
> Rcpp::sourceCpp("~/git/stackoverflow/65251442/answer.cpp")
>
mat <- matrix(1:4,ncol=2)
>
colnames(mat) <- c("col1","col2")
>
attributes(mat)
$dim
[1] 2 2
$dimnames
$dimnames[[1]]
NULL
$dimnames[[2]]
[1] "col1" "col2"
>
showNames(mat)
[[1]]
NULL
[[2]]
[1] "col1" "col2"
>
Таким же образом вы можете получить доступ только к именам столбцов.
Большой! Большое спасибо за вашу работу! Я очень ценю это.
Пожалуйста, и запоздалое Добро пожаловать в StackOverflow. Спасибо, что приняли ответ, и не стесняйтесь «проголосовать» за него, нажав на треугольник «вверх».
Я бы хотел, но у меня нет необходимой репутации. Если я получу это, я нажму на треугольник вверх!
Имена столбцов являются дополнительными атрибутами на уровне R, которые на самом деле не имеют значения на «уровне линейной алгебры», с которым работает Eigen (или Armadillo). Они просто используют индексы. Я рекомендую написать локальную подпрограмму "красивого принтера", которая добавляет имена столбцов, если они вам нужны.