c++ - 在 Rcpp 中动态添加行

标签 c++ rcpp rcpparmadillo

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

我的具体目标是接收一个名为 foo 的 vector 并生成一个三列矩阵 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<< >>')"

因为我不熟悉 C++(尤其是涉及迭代修改的问题 2 和 3),所以我被卡住了。这里有人可以帮助排除故障吗?提前致谢!

最佳答案

数据(通常)原生存储为列,因此添加行并不那么明显。因为矩阵通常表示为连续 vector ,所以您需要完整拷贝(以创建要填充的“孔”)。

最好将不断增长的数据结构表示为列的集合,并让它们单独增长。这几乎就是 data.frame 的作用。

关于c++ - 在 Rcpp 中动态添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338272/

相关文章:

c++ - 无效协变返回类型,嵌套类 C++

c++ - 发出带有 qt 信号的 std::string

c++ - 3D数组中的偏移量计算

c++ - 是否有 C++ 方法来实现/等效于 R 中的 which() 函数?

r - 使用 List 将 R 矩阵转换为 arma::mat

c++ - 代码块和 g++ 错误 "is private"

r - 单元测试包中的 Rcpp 代码

r - Rcpp 中的 is_NA() 与 all() 结合使用

r - 使用 Rcpp 无法更快地获取 all()

c++ - Armadillo - 长 vector 中每个小块的范数