将log1p()
应用于整个arma::vec
的适当方法是什么?似乎有log()
和exp()
的向量化版本,但没有log1p()
。我发现NumericVector
有语法糖,因此我最终将arma::vec
转换为NumericVector
,应用log1p()
,然后再转换回去:
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec test_log1p( arma::vec v )
{
// arma::vec res = log1p(v); // results in a compilation error
NumericVector v1 = log1p( wrap(v) );
arma::vec res = as<arma::vec>(v1);
return res;
}
是否有更优雅的方法?
答案 0 :(得分:4)
魔鬼再次出现在细节上。
对于初学者来说,RcppArmadillo没有'Sugar',因此您的推理存在缺陷-您不能只看一下0.0.0.0
上正在使用的Rcpp Sugar函数。
然后,您可以像您一样进行转换。但是您选择了昂贵的转换。查看显式重用内存的高级构造函数-无需副本。
一种更简单,更直接的方法(但仍是本地方法)只是添加一些本地内联函数。那就是我要做的:)在几分钟内完成。
最后,我们有一些令人projects舌的项目,这些项目将Rcpp Sugar推广到可以使用迭代器的任何事物上。那是“主路”,它可以带来一些新的发展。也许开始at this repo。
答案 1 :(得分:4)
使用可用于Armadillo向量和矩阵的.transform()或.for_each()工具。示例:
v.transform( [](double val) { return log1p(val); } );
或
v.for_each( [](double& val) { val = log1p(val); } ); // note the & character
您可能需要使用std
前缀:std::log1p()
而不是log1p()
。