从Rcpp Armadillo中的sp_mat访问尺寸名称

时间:2018-08-29 21:59:52

标签: rcpp armadillo

我是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中一样分配它们,但是没有运气。

我猜我在犯一个简单的小错误。有人可以帮我解决这个问题吗?任何帮助将不胜感激。

1 个答案:

答案 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>或...