gpt4 book ai didi

performance - 按名称添加矢量元素的快速函数

转载 作者:行者123 更新时间:2023-12-04 03:16:09 28 4
gpt4 key购买 nike

我写了这篇 R函数,给定任意数量的向量(...),通过根据它们的名称对各自的元素值求和来组合它们。

add_vectors <- function(...) {
a <- list(...)
nms <- sort(unique(unlist(lapply(a, names))))
out <- numeric(length(nms))
names(out) <- nms
for (v in a) out[names(v)] <- out[names(v)] + v

out
}

例子:
v1 <- c(a=2,b=3,e=4)
v2 <- c(b=1,c=6,d=0,a=4)
add_vectors(v1, v2)
#
a b c d e
6 4 6 0 4

我正在尝试编写一个等效函数 更快 .

不幸的是,目前我不知道如何在 R 中实现这一点。所以我想 Rcpp .
但是,为了转换为 Rcpp这个功能我错过了一些概念:
  • 如何管理...范围。参数为 List输入 Rcpp ?
  • 如何迭代 ... 中的向量范围。
  • 如何通过名称访问(然后求和)向量的元素(这在 R 中非常简单,但我不知道如何在 Rcpp 中进行操作)。

  • 因此,我正在寻找可以帮助我提高此功能的性能的人(在 RRcpp 中,或两者兼有)。

    任何帮助表示赞赏,谢谢。

    最佳答案

    我会使用这样的东西:

    #include <Rcpp.h>
    using namespace Rcpp;

    // [[Rcpp::export]]
    NumericVector add_all(List vectors){
    RCPP_UNORDERED_MAP<std::string,double> out ;
    int n = vectors.size() ;
    for( int i=0; i<n; i++){
    NumericVector x = vectors[i] ;
    CharacterVector names = x.attr("names") ;
    int m = x.size() ;

    for( int j=0; j<m; j++){
    String name = names[j] ;
    out[ name ] += x[j] ;
    }
    }
    return wrap(out) ;
    }

    使用以下包装器:
    add_vectors_cpp <- function(...){
    add_all( list(...) )
    }
    RCPP_UNORDERED_MAP只是 unordered_map 的 typedef , 在 std::或在 std::tr1::取决于您的编译器等...

    这里的技巧是从 ... 中创建一个常规列表。使用经典 list(...) .

    如果真想直接传 ...在 C++ 中并在内部处理它,您必须使用 .External 界面。这很少使用,因此 Rcpp 属性不支持 .External 界面。

    .External ,它看起来像这样(未经测试):
    SEXP add_vectors(SEXP args){
    RCPP_UNORDERED_MAP<std::string,double> out ;
    args = CDR(args) ;
    while( args != R_NilValue ){
    NumericVector x = CAR(args) ;

    CharacterVector names = x.attr("names") ;
    int m = x.size() ;

    for( int j=0; j<m; j++){
    String name = names[j] ;
    out[ name ] += x[j] ;
    }
    args = CDR(args) ;
    }
    return wrap(out) ;
    }

    关于performance - 按名称添加矢量元素的快速函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15765748/

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