【问题标题】:Caching intermediate results in Rcpp objects在 Rcpp 对象中缓存中间结果
【发布时间】:2013-05-17 11:26:41
【问题描述】:

我目前正在尝试加速使用 Rcpp 计算目标函数的优化过程。我当前的设置与此类似:

largeConstantVector <- readVector()
result <- optim(..., eval=function(par) evalRcpp(par, largeConstantVector)) 

evalRcpp 函数

double evalRcpp(NumericVector par, NumericVector constVector){
    NumericVector parT = transform(par)
    NumericVector constVectorT = transform(constVector)

    return aggregate(parT, constVectorT)
}

我想做的是只计算一次NumericVector constVectorT = transform(constVector),并将结果保存在 C++ 对象中,并且只在 R 端使用对该对象的引用。所以程序应该是这样的:

largeConstantVector <- readVector()
objReference <- calculateCommonStuff(largeConstantVector)
result <- optim(..., eval=function(par) evalRcpp(par, objReference)) 

evalRcpp 函数

double evalRcpp(NumericVector par, const SomeClass& objRef){
    NumericVector parT = transform(par)
    NumericVector constVectorT = objRef.constVectorT

    return aggregate(parT, constVectorT)
}

使用 Rcpp 可以实现这种方法吗?是否可以防止不必要的计算和数据复制(即将迭代数据“保留在 C++ 端”)?

提前致谢。

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    是的,可以将中间数据保留在“C++ 端”,但这更像是一个 C++ 程序设计问题,而不是 Rcpp 所特有的任何问题。

    使用私有状态数据创建一个类,使用函数创建类对象,然后在迭代期间对其进行更新。

    Rcpp 将有助于轻松调用这些成员函数,但它不会为您创建框架的其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2015-05-08
      • 2020-06-29
      相关资源
      最近更新 更多