在 RCPP 中动态添加行
Dynamically add rows in Rcpp
我正在尝试在RcppArmadillo中编写一个函数,该函数将行动态附加到数组/矩阵。它应该像R中的rbind
或Python中的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;
}
我面临三个问题:
- 在第
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(,所以我被卡住了。这里有人可以帮助排除故障吗?提前感谢!
数据(通常(本地存储为列,因此添加行并不那么明显。 因为矩阵通常表示为连续向量,所以你需要完整副本(来创建你想要填充的"孔"(。
您最好将不断增长的数据结构表示为列的集合,并让这些列单独增长。 这几乎就是data.frame所做的。
听听 Dirk 的最佳实践 - 按列存储的数据是一个巨大的问题,您应该始终注意编写高效的代码。我只是单独写,机械地展示如果由于某种原因你不能听从他的建议,如何完成你所描述的。
以下是我将(并且确实(使您的代码工作的方式:
new_row
必须成为arma::rowvec
my_matrix
是arma::mat
- 在 R 侧设置列名
现在让我们看看它是什么样子的。在C++方面,我们有:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export(.myFunction)]]
arma::mat myFunction(arma::vec foo) {
int n = foo.size();
arma::mat my_matrix;
// 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 ( (foo[i] + foo[j] + foo[k]) > 10.0 ) {
arma::rowvec new_row = {i,j,k};
my_matrix = arma::join_vert(my_matrix, new_row);
}
}
}
}
return my_matrix;
}
然后在 R 侧:
myFunction <- function(foo) {
res <- .myFunction(foo)
colnames(res) <- c("i", "j", "k")
return(res)
}
下面是它的实际示例:
foo <- 1:4
myFunction(foo)
i j k
[1,] 2 3 3
[2,] 3 2 3
[3,] 3 3 2
[4,] 3 3 3
顺便说一句,将来我会努力制作更好的可重复示例。 例如,在这里,您没有包括行
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
在您的问题代码中。 在这种情况下,这部分是一个小问题,因为可能任何有知识的人都可以回答你的问题,知道你需要这些台词,但这仍然是不好的做法。
更重要的是,您不包括
i
、j
、k
和foo
的条件;- 示例函数输入;或
- 所需的功能输出
所以,正如你所看到的,我只需要自己编造这些东西。 它可以帮助其他人帮助您提供更好的可重现示例,只是未来的提示!
PS:这不可能是解决这个问题的有效方法!
- 在 RCPP 中动态添加行
- 如何在 c++ 中将字符串添加到动态数组?
- 在 C++ 的二维数组中添加行和列
- 将新元素添加到动态数组C
- 在编译时识别所有调用函数 1 的所有 T,<T>然后添加行函数 2<T>()
- 添加行和列主矩阵
- 将值添加到动态数组中
- 添加行的 gtkmm 树模型
- 使用 CPP 在之后添加新行的动态分配
- Qt将"action"添加到动态添加的QWidget中
- 向打开的文件添加行
- QtableView中添加行的信号
- 使用pugixml和c++在.xml中添加行
- 添加记忆-动态规划
- SWIG 添加行以删除不存在的变量
- c++预处理器/宏在函数定义后自动添加行
- 添加到动态库中的函数指针映射
- 将行动态添加到表视图中
- Qt tablewidget添加行指针
- 向数组中添加行