本征矩阵库中的setRandom函数将给定矩阵填充为[-1,1]范围内的随机数。如何扩展此值以生成任何给定范围内的数字?我需要浮点数,我可以使用伪随机数。
我尝试执行以下操作:
B = LO + A.cast<double>().array()/(static_cast <double>(RAND_MAX)/(HI-LO));
Run Code Online (Sandbox Code Playgroud)
这里A是有问题的矩阵,[LO,HI]是我要填写的范围。问题是我的RAND_MAX值为2147483647,这使整个计算混乱。
任何帮助深表感谢。
将 c++11 随机数生成器与 Eigen 中的零表达式相结合:
std::random_device rd;
std::mt19937 gen(rd()); //here you could also set a seed
std::uniform_real_distribution<double> dis(LO, HI);
//generate a 3x3 matrix expression
Eigen::MatrixXd::NullaryExpr random_matrix(3,3,[&](){return dis(gen);});
//store the random_number in a matrix M
Eigen::MatrixXd M = random_matrix;
Run Code Online (Sandbox Code Playgroud)
请注意,每次调用时您都会获得一个新的随机数random_matrix(0,0)。对于访问元素一次的矩阵运算来说这是可以的。如果您需要在多个地方使用的随机矩阵,可以将其保存到特征矩阵中,M如最后一行所示。
这可能会有所帮助:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
double HI = 12345.67; // set HI and LO according to your problem.
double LO = 879.01;
double range= HI-LO;
MatrixXd m = MatrixXd::Random(3,3); // 3x3 Matrix filled with random numbers between (-1,1)
m = (m + MatrixXd::Constant(3,3,1.))*range/2.; // add 1 to the matrix to have values between 0 and 2; multiply with range/2
m = (m + MatrixXd::Constant(3,3,LO)); //set LO as the lower bound (offset)
cout << "m =\n" << m << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
m =
10513.2 10034.5 4722.9
5401.26 11332.6 9688.04
9858.54 3144.26 4064.16
Run Code Online (Sandbox Code Playgroud)
所得矩阵将包含介于LO和之间的double类型的伪随机元素HI。
| 归档时间: |
|
| 查看次数: |
5509 次 |
| 最近记录: |