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"
>
您可以用相同的方式只访问列名。
如何从 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"
>
您可以用相同的方式只访问列名。