我是Rcpp的新手,并试图确定如何访问输入的维度名称,以便稍后在脚本中使用它们。具体来说,我试图从Armadillo中的稀疏矩阵中获取列名,并使用它们来命名单独对象中的行。
要澄清的示例: 让我们首先生成一个平凡的稀疏矩阵。
input_mat <- Matrix::Matrix(sample(c(0,1), 35, replace =T)
,nrow = 5
,ncol = 7
,dimnames = list(LETTERS[1:5], letters[1:7]))
接下来,让我们用它来在Rcpp中做一些事情。我们将输出一个填充有一些随机数的数字矩阵。输出的nrow =输入的ncol。
cppFunction('NumericMatrix map_columns(arma::sp_mat x, int k) {
int n = x.n_cols;
NumericMatrix new_mat = NumericMatrix(n, k);
for(int i = 0; i < n; i++) {
for(int j = 0; j < k; j++) {
new_mat(i,j) = rand() % 100 + 1;
}
}
rownames(new_mat) = CharacterVector::create("a", "b", "c", "d", "e", "f", "g");
return(new_mat);
}', depends = "RcppArmadillo"
)
map_columns(input_mat, 4)
我不想手动指定new_mat的行名,而是想获取x的同名并即时分配名称。我尝试访问稀疏矩阵的插槽名称,并尝试像在R中一样分配它们,但是没有运气。
我猜我在犯一个简单的小错误。有人可以帮我解决这个问题吗?任何帮助将不胜感激。
答案 0 :(得分:0)
我不知道转换为Armadillo对象后是否可以访问S4插槽,但是,您可以将稀疏矩阵作为S4对象传递给函数并显式处理转换:
input_mat <- Matrix::rsparsematrix(5, 7, 0.2)
input_mat@Dimnames <- list(LETTERS[1:5], letters[1:7])
Rcpp::cppFunction('NumericMatrix map_columns(Rcpp::S4 y, int k) {
arma::sp_mat x = Rcpp::as<arma::sp_mat>(y);
int n = x.n_cols;
NumericMatrix new_mat = NumericMatrix(n, k);
for(int i = 0; i < n; i++) {
for(int j = 0; j < k; j++) {
new_mat(i,j) = rand() % 100 + 1;
}
}
Rcpp::List dimnames = y.slot("Dimnames");
Rcpp::CharacterVector colnames = dimnames[1];
rownames(new_mat) = colnames;
return(new_mat);
}', depends = "RcppArmadillo"
)
map_columns(input_mat, 4)
请注意,我创建的是稀疏矩阵,而不是示例代码中的密集矩阵。
旁注:请勿使用rand()
。使用R的RNG,来自C ++ 11的<random>
或...