gpt4 book ai didi

c++ - 用单位法线填充的 RcppEigen 模板函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:53 26 4
gpt4 key购买 nike

我有以下代码:

#include <RcppEigen.h>
using namespace Rcpp;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Eigen::Lower;
using Eigen::Map;

// fills passed dense objects with unit normal random variables
template <typename Derived>
void fillUnitNormal(Eigen::DenseBase<Derived>& Z){
int m = Z.rows();
int n = Z.cols();
NumericVector r(m*n);
r = rnorm(m*n, 0, 1); // using vectorization from Rcpp sugar
Map<VectorXd> rvec(as<Map<VectorXd> >(r));
Map<MatrixXd> rmat(rvec.data(), m, n);
Z = rmat;
}

一段时间以来,这对我来说效果很好。但是,我意识到如果 Z 是一个 VectorXd 对象,那么该函数将失败。用普通 (0,1) 绘制填充从 Eigen::DenseBase 类继承的 Eigen 对象的每个元素的正确方法是什么?

最佳答案

一种方法是将随机值std::copy 放入Z。由于 Eigen 不支持 std::begin(),我决定使用 .data() 提供的原始指针。但是,这在 Eigen::DenseBase 级别不可用。 hierarchy 上两层不过,在 Eigen::PlainObjectBase 中它可以工作:

// [[Rcpp::depends(RcppEigen)]]
#include <RcppEigen.h>

// fills passed dense objects with unit normal random variables
template <typename T>
void fillUnitNormal(Eigen::PlainObjectBase<T>& Z){
int m = Z.rows();
int n = Z.cols();
Rcpp::NumericVector r(m*n);
r = Rcpp::rnorm(m*n, 0, 1); // using vectorization from Rcpp sugar
std::copy(std::begin(r), std::end(r), Z.data());
}


// [[Rcpp::export]]
Rcpp::List test(int n) {
Eigen::MatrixXd mat(n, n);
Eigen::VectorXd vec(n);
fillUnitNormal(mat);
fillUnitNormal(vec);
// gives compile time error: fillUnitNormal(Rcpp::NumericVector::create(n));
return Rcpp::List::create(mat, vec);
}

/*** R
test(5)
*/

关于c++ - 用单位法线填充的 RcppEigen 模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865164/

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