r - 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 库中的函数。
解决方案
它有助于退后一步。什么是名字?一个属性。所以在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"
>
您可以以相同的方式仅访问列名。
推荐阅读
- sql - MS Access - 来自同一个表的多个计数
- ios - UIScrollView Subviews being misplaced when scaled down and Subviews not showing up when rounded
- pandas - 将函数内的循环值写入 Pandas 数据帧
- javascript - 我们是否能够为 CSS 语句组合 JavaScript 等效对象?
- c++ - 使用宏反转 4 个字节的字节顺序而不使用 Zeros C++
- javascript - 我该如何解决?找不到包含文件
- java - 如何在 Apache Cloudstack 4.10 版中编辑 css 和 js 文件
- google-chrome-extension - 在尝试上传 Chrome 扩展屏幕截图时总是收到 Invalid size 错误
- android - 使用自定义图标时出现 Google Map Marker Cluster 错误
- c++ - 如何在C ++中打印循环包含有向图中的节点