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