如何自定义setRandom的范围?

How to customize range of setRandom?

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;
}

正如评论中所建议的那样,您可能应该只执行算术运算以使随机值进入所需范围(即 +1,然后是 * 50)。无论如何,这基本上是不同请求范围会发生的情况。

这是一个完整的单行解决方案:

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 而不是线性代数 VectorMatrix 来启用标量加法。