如何将 Eigen VectorXd 值转换为双精度值?

问题描述 投票:0回答:1

我的问题应该很简单,但我一直没能让它发挥作用。 我需要从 Eigen 生成一个随机数,设置其范围,并将其分配给 t0 一个双精度数。 我尝试过的所有组合都失败了,包括另一篇文章中建议的组合。

double Trand = Eigen::VectorXd(1) *0.5 + 0.5;

我收到一条错误消息,指示“+0.5”是双精度向量,而不是特征向量。 所以我尝试了这个:

double Trand = Eigen::VectorXd(1).cast<double>() * 0.5 + 0.5;

出现相同的错误,标记加法运算,但不标记乘法。 这在上一篇文章中被建议作为解决方案,但失败了,与上面相同。

m = LO+(ArrayXXd::Random(m,n)*0.5+0.5)*(HI-LO)

任何帮助表示赞赏。

random casting eigen
1个回答
0
投票

从 1 大小的向量中提取标量的正确方法是

value()
。另请注意,使用像
VectorXd
这样的动态大小类型在这里非常浪费,因为它会强制进行临时动态分配。这样会更有效率:

using Vector1d = Eigen::Matrix<double, 1, 1>;
double Trand = Vector1d::Random().value() * 0.5 + 0.5;

但是,Eigen 的随机数生成并不适合生产使用。它更多的是一个调试和测试工具。他们警告自己:

请注意,所有生成随机矩阵的函数都不是可重入的,也不是线程安全的。其中包括

DenseBase::Random()
DenseBase::setRandom()
,尽管调用了
Eigen::initParallel()
。这是因为这些函数基于不可重入的
std::rand
。对于线程安全的随机生成器,我们建议使用 c++11 随机生成器或
boost::random

rand()
也不能保证提供高随机性值。使用现代 C++ 生成器。看起来您想要均匀的真实分布。那里包含了可行的示例。

© www.soinside.com 2019 - 2024. All rights reserved.