代码之家  ›  专栏  ›  技术社区  ›  KcFnMi

如何自定义setrandom的范围?

  •  1
  • KcFnMi  · 技术社区  · 6 年前

    Eigen提供了处理矩阵和向量(其中一维为1)的工具。我正在尝试开发一个函数来填充向量( double *array )随机数由 setRandom 是的。

    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 是的。

    如何将范围更改为i.e.[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;
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   ggael    6 年前

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

    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 启用标量加法。

        2
  •  0
  •   Max Langhof    6 年前

    如注释中所建议的,您可能只需要执行算术运算,将随机值放入所需的范围(即。 +1 ,然后 * 50 )中。不管怎样,这基本上是不同请求范围的情况。