Метки столбца RcppEigen

Как можно извлечь метки столбцов из матрицы 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 (или Armadillo). Они просто используют индексы. Я рекомендую написать локальную подпрограмму "красивого принтера", которая добавляет имена столбцов, если они вам нужны.

Dirk Eddelbuettel 11.12.2020 13:56

Спасибо! Дело в том, что я хотел бы использовать имена столбцов, используемые пользователем R в этой функции «симпатичного принтера». Есть ли способ сделать это с помощью Eigen::Matrix или мне нужно изменить ввод на Rcpp::NumericMatrix, а затем преобразовать в Eigen::MatrixXd после считывания меток столбцов?

Martin Schab 11.12.2020 14:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это помогает отступить. Что такое имена? Атрибут. Итак, в 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"

> 

Таким же образом вы можете получить доступ только к именам столбцов.

Большой! Большое спасибо за вашу работу! Я очень ценю это.

Martin Schab 11.12.2020 15:47

Пожалуйста, и запоздалое Добро пожаловать в StackOverflow. Спасибо, что приняли ответ, и не стесняйтесь «проголосовать» за него, нажав на треугольник «вверх».

Dirk Eddelbuettel 11.12.2020 15:51

Я бы хотел, но у меня нет необходимой репутации. Если я получу это, я нажму на треугольник вверх!

Martin Schab 11.12.2020 16:17

Другие вопросы по теме