在犰狳中的rep(x,each = 3)等价物

时间:2013-11-23 18:06:13

标签: c++ r armadillo

我正在将一个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
}

1 个答案:

答案 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>