我正在尝试在 RcppArmadillo 中编写一个函数,该函数动态地将行附加到数组/矩阵。它应该像 R 中的 rbind
或 Python 中的 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;
}
我面临三个问题:
- 在
arma::vec new_row = {i,j,k};
这行,我被告知“非常量表达式不能从‘int’类型缩小到‘ double' 在初始化列表中" - 在
my_matrix = join_vert(my_matrix, new_row);
行上,我被告知“没有匹配函数来调用 'join_vert'” - 在
return my_matrix;
行中,我被告知“从‘arma::vec [3]’到‘arma::Mat’(又名‘Mat<< >>')"
因为我不熟悉 C++(尤其是涉及迭代修改的问题 2 和 3),所以我被卡住了。这里有人可以帮助排除故障吗?提前致谢!
最佳答案
数据(通常)原生存储为列,因此添加行并不那么明显。因为矩阵通常表示为连续 vector ,所以您需要完整拷贝(以创建要填充的“孔”)。
最好将不断增长的数据结构表示为列的集合,并让它们单独增长。这几乎就是 data.frame 的作用。
关于c++ - 在 Rcpp 中动态添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338272/