Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Rcpp中动态添加行_C++_Rcpp_Rcpparmadillo - Fatal编程技术网

C++ 在Rcpp中动态添加行

C++ 在Rcpp中动态添加行,c++,rcpp,rcpparmadillo,C++,Rcpp,Rcpparmadillo,我试图在RcppArmadillo中编写一个函数,动态地将行附加到数组/矩阵。它应该像R中的rbind或Python中的pandas.concat那样工作。我依赖C++来提高效率。 我的具体目标是引入一个名为foo的向量,并生成一个三列矩阵My_矩阵,它的每一行都由某些条件决定。因为需要检查每个三元组{i,j,k}的条件,所以它涉及一个三重循环。这是我到目前为止所做的,我在这里用正楷写了一些评论: /* (From my RcppArmadillo script) */ arma::mat my

我试图在RcppArmadillo中编写一个函数,动态地将行附加到数组/矩阵。它应该像R中的rbind或Python中的pandas.concat那样工作。我依赖C++来提高效率。 我的具体目标是引入一个名为foo的向量,并生成一个三列矩阵My_矩阵,它的每一行都由某些条件决定。因为需要检查每个三元组{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;
}
我面临三个问题:

在arma::vec new_row={i,j,k}行上;,我被告知,在初始值设定项列表中,非常量表达式不能从“int”类型缩小为“double” 在my_matrix=join_vertmy_matrix,new_row;,行上;,我被告知调用“join\u vert”没有匹配函数 在返回我的_矩阵的行上;,我被告知没有从“arma::vec[3]”到“arma::Mat”或“Mat”的可行转换

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

数据通常以列的形式存储,因此添加行不是很明显。由于矩阵通常表示为连续向量,因此需要完整副本来创建要填充的“孔”


最好将不断增长的数据结构表示为列的集合,并让这些列单独增长。这与data.frame差不多。

数据通常以列的形式存储,因此添加行并不明显。由于矩阵通常表示为连续向量,因此需要完整副本来创建要填充的“孔”


最好将不断增长的数据结构表示为列的集合,并让这些列单独增长。这正是data.frame所做的。

听听Dirk的最佳实践——按列存储的数据是一个巨大的问题,在编写高效代码时,您应该始终注意这个问题。我只是单独写一封信,机械地告诉你,如果出于某种原因你不能听从他的建议,如何完成你所描述的

下面是我如何使您的代码工作的:

让新行成为arma::rowvec 我的矩阵是arma::mat吗 在R侧设置列名 现在让我们看看那是什么样子。在C++方面,我们有:

包括 //[[Rcpp::dependsRcppArmadillo]] //[[Rcpp::export.myFunction]] arma::mat myFunctionarma::vec foo{ int n=foo.size; arma::mat my_矩阵; //循环并追加行 forint i=0;i10.0{ arma::rowvec new_row={i,j,k}; my_matrix=arma::join_vertmy_matrix,new_row; } } } } 返回我的_矩阵; } 然后在R侧:


myFunction听听Dirk的最佳实践-按列存储的数据是一个巨大的问题,在编写高效代码时,您应该始终注意这个问题。我只是单独写一封信,机械地告诉你,如果出于某种原因你不能听从他的建议,如何完成你所描述的

下面是我如何使您的代码工作的:

让新行成为arma::rowvec 我的矩阵是arma::mat吗 在R侧设置列名 现在让我们看看那是什么样子。在C++方面,我们有:

包括 //[[Rcpp::dependsRcppArmadillo]] //[[Rcpp::export.myFunction]] arma::mat myFunctionarma::vec foo{ int n=foo.size; arma::mat my_矩阵; //循环并追加行 forint i=0;i10.0{ arma::rowvec new_row={i,j,k}; my_matrix=arma::join_vertmy_matrix,new_row; } } } } 返回我的_矩阵; } 然后在R侧:

我的功能
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]