gpt4 book ai didi

c++ - rep(x, each=3) 相当于 Armadillo

转载 作者:太空狗 更新时间:2023-10-29 23:05:15 25 4
gpt4 key购买 nike

我正在将一个 R 函数移植到 C++ 以便在 RcppArmadillo 中使用,但我找不到一种优雅(高效)的方式来逐个元素地重复列 vector N 次。这是一个最小的示例,我必须首先创建一个重复 3 列的矩阵,然后 reshape 为行 vector ,然后进行转置。

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
}

最佳答案

没有已知的 C++ 运算符或函数可以执行此操作,因此您可能必须手动执行此操作。

最坏的情况是你只是循环和复制(可能是 block )。 Armadillo 确实有索引,所以也许这会有所帮助。 R 在回收时会进行大量检查,因此您可能也必须考虑到这一点。

顺便说一句,您的示例混合了属性和内联。我只是把代码放在

#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>

关于c++ - rep(x, each=3) 相当于 Armadillo ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com