我目前正在尝试加速使用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 ++方面”的中间数据)?
提前致谢。
答案 0 :(得分:1)
是的,正如你所说的那样可以将“中间数据”保存在“C ++端”,但这更像是一个C ++程序设计问题,而不是Rcpp所特有的。
使用私有状态数据创建一个类,使用函数创建类对象,然后在迭代期间更新它。
Rcpp将有助于轻松调用这些成员函数,但它不会为您创建框架的其余部分。