在Rcpp中动态添加行

问题描述 投票:0回答:2

我正在尝试在RcppArmadillo中编写一个将行动态添加到数组/矩阵的函数。它应该像R中的rbindPython中的pandas.concat一样工作。 (我依靠C ++来提高效率。)

我的特定目标是接受一个称为foo的向量并生成一个三列矩阵my_matrix,该矩阵的每一行均由某种条件确定。因为需要为每个三元组{i,j,k}检查条件,所以它涉及一个三重循环。到目前为止,这就是我所拥有的(大写的词是我在此处包括的评论):

/* (From my RcppArmadillo script) */
arma::mat myFunction(arma::vec foo) {
  int n = foo.size();
  // initialize first row of column names
  arma::vec my_matrix[] = {"i", "j", "k"}; 
  // loop and append rows
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
      for(int k = 0; k < n; k++) { 
        if (SOME CONDITION ABOUT i,j,k and foo) {
          APPEND ROW {i,j,k} TO my_matrix 
          arma::vec new_row = {i,j,k};
          my_matrix = join_vert(my_matrix, new_row);
        }
      }
    }
  }
  return my_matrix;
}

我面临三个问题:

  1. 在行arma::vec new_row = {i,j,k};上,我被告知“ 不能将非常数表达式的类型从初始值列表的'int'缩小为'double'
  2. 在行my_matrix = join_vert(my_matrix, new_row);上,我被告知“ 没有匹配函数来调用'join_vert'
  3. 在第return my_matrix;行上,我被告知“ 没有从'arma :: vec [3]'到'arma :: Mat'(又名'Mat << >>')]的可行转换”]
  4. 因为我不熟悉C ++

(尤其是涉及迭代修改的问题2和3),所以我陷入了困境。有人可以帮助您进行故障排除吗?提前致谢!

我正在尝试在RcppArmadillo中编写一个将行动态添加到数组/矩阵的函数。它应该像R中的rbind或Python中的pandas.concat一样工作。 (我依靠C ++来提高效率。)我的...

c++ rcpp rcpparmadillo
2个回答
2
投票

(通常)将数据本地存储为列,因此添加行并不是那么明显。因为矩阵通常表示为连续向量,所以您需要完整的副本(以创建要填充的“孔”)。


0
投票

请听Dirk以获得最佳实践-按列存储的数据是一个巨大的问题,您应该始终注意编写高效的代码。我仅单独撰写文章,以机械方式显示如果由于某种原因您不能听从他的建议,如何完成您所描述的内容。

© www.soinside.com 2019 - 2024. All rights reserved.