RcppArmadillo 中的向量化 log1p()
Vectorized log1p() in RcppArmadillo
将 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;
}
有没有更优雅的方法?
细节决定成败。
对于初学者来说,RcppArmadillo 没有 'Sugar' 所以你的推理是有缺陷的——你不能只看在 Rcpp::NumericVector
.
上工作的 Rcpp Sugar 函数
话又说回来,你可以像你一样转换。但是您选择了昂贵的 转换。查看显式重用内存的高级构造函数——不需要副本。
一个更简单和更直接(但本地)的方法就是添加一个小的本地内联函数。这就是我会做的 :) 在几分钟内完成。
最后,我们有一些兄弟项目将 Rcpp Sugar 概括为可以采用迭代器的任何东西。那是 "the high road" 并且它可以做一些新的开发。也许开始 at this repo.
使用可用于 Armadillo 向量和矩阵的 .transform() or .for_each() 工具。示例:
v.transform( [](double val) { return log1p(val); } );
或
v.for_each( [](double& val) { val = log1p(val); } ); // note the & character
您可能需要使用 std
前缀:std::log1p()
而不是 log1p()
。
将 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;
}
有没有更优雅的方法?
细节决定成败。
对于初学者来说,RcppArmadillo 没有 'Sugar' 所以你的推理是有缺陷的——你不能只看在 Rcpp::NumericVector
.
话又说回来,你可以像你一样转换。但是您选择了昂贵的 转换。查看显式重用内存的高级构造函数——不需要副本。
一个更简单和更直接(但本地)的方法就是添加一个小的本地内联函数。这就是我会做的 :) 在几分钟内完成。
最后,我们有一些兄弟项目将 Rcpp Sugar 概括为可以采用迭代器的任何东西。那是 "the high road" 并且它可以做一些新的开发。也许开始 at this repo.
使用可用于 Armadillo 向量和矩阵的 .transform() or .for_each() 工具。示例:
v.transform( [](double val) { return log1p(val); } );
或
v.for_each( [](double& val) { val = log1p(val); } ); // note the & character
您可能需要使用 std
前缀:std::log1p()
而不是 log1p()
。