you*_*aux 1 c++ rcpp rcpparmadillo
我正在尝试在RcppArmadillo中编写一个函数,该函数将行动态附加到数组/矩阵。它应该像rbind在[R或pandas.concat在Python中。(我依靠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;
}
Run Code Online (Sandbox Code Playgroud)
我面临三个问题:
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::rowvecmy_matrix是一个arma::mat现在让我们看看它是什么样的。在 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;
}
Run Code Online (Sandbox Code Playgroud)
然后在 R 端:
myFunction <- function(foo) {
res <- .myFunction(foo)
colnames(res) <- c("i", "j", "k")
return(res)
}
Run Code Online (Sandbox Code Playgroud)
这是它的一个例子:
foo <- 1:4
myFunction(foo)
i j k
[1,] 2 3 3
[2,] 3 2 3
[3,] 3 3 2
[4,] 3 3 3
Run Code Online (Sandbox Code Playgroud)
顺便说一句,将来我将致力于制作更好的可重复示例。例如,在这里,您没有包括行
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
Run Code Online (Sandbox Code Playgroud)
在您的问题代码中。在这种情况下,那部分是一个小问题,因为可能有知识回答您的问题的任何人都知道您需要这些行,但这仍然是不好的做法。
更重要的是,你不包括
i、j、k、 和上的条件foo;所以,如你所见,我只需要自己编造这些东西。它可以帮助其他人帮助您提供更好的可重复示例,只是对未来的一个提示!
PS:这不可能是解决这个问题的有效方法!