【问题标题】:Blitz++: Filling an array with random numbersBlitz++:用随机数填充数组
【发布时间】:2013-05-08 11:39:58
【问题描述】:

我正在尝试比较 Blitz++ / Armadillo / Eigen 和我自己的库的性能。

我目前正在使用 Blitz++ 执行以下操作:

...
Array<T, 1> s(samples);
Uniform<T> rand;
rand.seed((unsigned int)time(0));
for(size_t i=0; i<samples; i++) {
    s = rand.random() *4.0 +58.0;
}
...

公平地说,我需要知道用随机数填充数组的正确“Blitz++”方式。 我认为上面的 code-sn-p 不是这样做的方法,因为它的效率非常低。

简而言之

在使用 Blitz++ 时,上述 sn-p 是用随机数初始化数组的正确方法还是有更好/更有效的方法?

【问题讨论】:

  • 请记住,通过这些类型的比较,您最终可能会将苹果与橙子进行比较。例如,Armadillo 中有几种accessing elements 的方式:operator()、operator[]、iterators 或 mempr()。默认情况下,operator() 启用了边界检查,而其他方式则没有。这有助于开发。因此,为了进行更平衡的比较,您还需要考虑使用特定库(包括调试!)开发软件实际需要多长时间,以及最终代码的可读性/可维护性。
  • @mtall,我同意在比较这些类型的库时需要考虑多个方面。然而,并不是所有的苹果和梨……你只需要公平地比较它们。因此,我不会将一个库的元素访问与另一个库的全数组操作进行比较。但是分开比较:整个数组操作、模板/视图、元素操作、初始化/生成器。
  • 即便如此,还有更多需要考虑。例如,许多 C++ 库可以使用各种 BLAS 后端进行整个数组操作。是否比较标准 BLAS 或高度优化的版本,如 OpenBLAS 或 Intel MKL?整个数组操作还受矩阵是动态分配还是固定大小(即,大小指定为模板参数)的影响。在后一种情况下,C++ 编译器可能会生成更好的代码。这反过来又带来了关于给定编译器能力的问题,例如。对于给定的代码,一个编译器可能比另一个编译器优化更多/更少。

标签: c++ random multidimensional-array blitz++


【解决方案1】:

当我写下我的问题时,我意识到我的方式是错误的。

问题的答案是:

你做错了,就这样吧:

...
Array<T, 1> s(samples);
Uniform<T> rand;
rand.seed((unsigned int)time(0));
s = rand.random() *4.0 +58.0;
...

所以现在的问题是,我自己的答案是否正确?

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2017-06-04
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2011-11-29
    相关资源
    最近更新 更多