我正在将一个R函数移植到c ++以便在RcppArmadillo中使用,我找不到一种优雅(高效)的方法来重复列向量N次,逐个元素。这是一个最小的例子,我必须首先创建一个重复3列的矩阵,然后重塑为行向量,然后进行转置。
library(RcppArmadillo)
sourceCpp(code = '
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::colvec foo(const arma::colvec& u, const arma::colvec& v)
{
arma::colvec u_rep(12), result(12);
u_rep = trans(vectorise(repmat(u, 1, 3), 1)); // this seems inefficient
result = u_rep % v;
return(result);
}'
)
foo(1:4, 1:12)
R等价物是,
fooR = function(u, v){
u_rep = rep(u, each=3)
u_rep * v
}
答案 0 :(得分:1)
没有已知的C ++运算符或函数可以执行此操作,因此您可能需要手动执行此操作。
最糟糕的情况是你只是循环和复制(可能是块)。犰狳确实有索引,所以也许这会有所帮助。 R在回收时做了很多检查,所以你可能也要考虑到这一点。
顺便说一句,您的示例混合了Attributes和inline。我只是把代码
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
arma::colvec foo(const arma::colvec& u, const arma::colvec& v) {
arma::colvec u_rep(12), result(12);
u_rep = trans(vectorise(repmat(u, 1, 3), 1)); // this seems inefficient
result = u_rep % v;
return(result);
}
在文件bafoo.cpp
中,并按如下方式提供:
R> sourceCpp("/tmp/bafoo.cpp")
R> foo(1:4, 1:12)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 8
[5,] 10
[6,] 12
[7,] 21
[8,] 24
[9,] 27
[10,] 40
[11,] 44
[12,] 48
R>