RcppEigen 列标签

RcppEigen column labels

如何从 Rcpp::Eigen 矩阵中提取列标签?

例如,这里有一些R矩阵

mat           <- matrix(1:4,ncol=2)
colnames(mat) <- c("col1","col2")

使用 Rcpp::NumericMatrix,可以像这样简单地调用 colnames:

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是如何将传递给Rcpp代码的R矩阵转换成Eigen::MatrixXd的。它首先将其转换为 Rcpp::NumericMatrix 吗?在这种情况下,可以使用 Rcpp::NumericMatrix 作为输入,提取列,然后在代码中手动将其转换为 Eigen::MatrixXd 以使用 Eigen 库中的函数。

有助于退一步。什么是名字?一个属性。所以在 R 中我们会做

mat <- matrix(1:4,ncol=2)
colnames(mat) <- c("col1","col2")
attributes(mat)

好吧,事实证明在 C++ 中与 Rcpp 几乎相同---请参阅 Rcpp Gallery 上的几篇文章或此处的答案。

但是,总是有一个但是,到 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/Whosebug/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"

> 

您可以用相同的方式只访问列名。