首页 > 解决方案 > RcppEigen 列标签

问题描述

如何从 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 库中的函数。

标签: reigenrcpprcppeigen

解决方案


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

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

好吧,结果在带有 Rcpp 的 C++ 中几乎是一样的——请参阅Rcpp 库中的几篇文章或此处的答案。

但是,总是有一个但是,去一个特征矩阵会丢弃属性,因为特征 C++ 类没有这样的概念。但是,如果您愿意,可以从 a SEXP(或 a 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"

> 

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


推荐阅读