Eigen提供了使用矩阵和向量(其中一维为1(的工具。我正在尝试开发一个函数,该函数用setRandom
产生的随机数填充向量(double *array
(。
double *gen_random(int size, double min, double max) {
double *array = new double[size * sizeof(double)];
Matrix<double, Dynamic, Dynamic, RowMajor>::Map(array, size, 1).setRandom();
return array;
}
上面的代码这样做,但根据 https://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html#title35,随机范围为 [-1:1]。
如何将范围更改为即 [0:99]?
到目前为止,答案和评论似乎建议添加一个循环以获得所需的结果,例如:
double *gen_random(int size, double min, double max) {
double *array = new double[size * sizeof(double)];
Matrix<double, Dynamic, Dynamic, RowMajor>::Map(array, size, 1).setRandom();
for (int i = 0; i < size; ++i)
array[i] = (array[i]+1)*50;
return array;
}
这是一个完整的单行解决方案:
double *gen_random(int size, double min, double max) {
double *array = new double[size * sizeof(double)];
ArrayXd::Map(array,size) = (ArrayXd::Random(size)+1.)*0.5*(max-min) + min;
return array;
}
我正在使用Array
而不是线性代数Vector
或Matrix
来启用标量加法。
正如评论中所建议的,您可能应该只执行算术以使您的随机值进入所需的范围(即+1
,然后* 50
(。无论如何,这基本上就是不同请求范围会发生什么。