小编Lia*_*iam的帖子

优化C++ 11随机生成器的使用

我正在使用随机数对物理模拟进行大量编码,我只是第一次对我的代码进行了描述,因此我可能在读取输出时出错,但我看到这条线首先出现:

   %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name  
 90.09     21.88    21.88   265536     0.08     0.08  std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>::operator()()
Run Code Online (Sandbox Code Playgroud)

这似乎意味着生成数字生成器占用了90%的时间.我之前已经写过一篇文章,询问是否在每个循环中构建随机概率分布可以节省我的时间,但是在尝试和计时后它没有帮助(定义概率分布是否代价高昂?).是否有优化随机数生成的常用选项?

提前谢谢,我的模拟(在当前状态下)运行了几天,因此减少90%的计算时间将是一个重大进步.

c++ random optimization c++11

9
推荐指数
2
解决办法
1744
查看次数

生成随机数:CPU与GPU,目前胜出?

我一直在研究需要生成大量随机数的物理模拟(如果你想要一个想法,至少10 ^ 13).我一直在使用Mersenne twister的C++ 11实现.我还读到,同一算法的GPU实现现在是Cuda库的一部分,并且GPU在此任务中可以非常高效; 但我找不到明确的数字或​​基准比较.例如,与8核i7相比,上一代的Nvidia卡在生成随机数方面更具性能吗?如果是,价格范围是多少?

我认为我的模拟可以从GPU产生大量随机数并且CPU完成其余工作中获益.

c++ hardware random optimization cuda

7
推荐指数
1
解决办法
1186
查看次数

外部库处理多边形并计算其分形维数

我正在看六角形2d格子上的物理问题.它现在是一个几何问题,只有格子边缘的一个子集是有意义的,我给出了这个集合.然后我应该将自己限制在可以用这些边缘组成的闭合曲线上.从这些多边形中,我想提取诸如直径(两个点之间的最大距离))和它们的分形维数之类的信息.

我仍然没有看到如何从原始的初始数据(无序的边缘数组),所以我想知道是否有包/库可以帮助我.从绘制这些边缘中的每一个边缘,它们可以返回它们形成的闭合环,然后分别分析这些多边形中的每一个.

谢谢.

c++ geometry 2d

5
推荐指数
1
解决办法
486
查看次数

在具有相同条形厚度的对数对数刻度中绘制直方图

我正在尝试以对数比例在直方图中绘制输入数据(以快速查看这是否符合幂律),但我在以我想要的方式输出时遇到了麻烦。我正在使用 Python,更具体地说是 matplotlib/numpy 库:

thebins = N.linspace(min_data.min(),min_data.max(),int(sys.argv[len(sys.argv)-1]))
thebins = N.log(thebins)
bar_min = plt.hist(min_data,bins=thebins,alpha=0.40,label=['Minimal Distance'],log=True)
Run Code Online (Sandbox Code Playgroud)

min_data 是我的一维数据数组,前两行用于创建 bin,然后将它们放入对数刻度中。最后一行用于用 log y 刻度“填充”箱/直方图。

图形输出为:

在此输入图像描述

这可能看起来很挑剔,但我对不同厚度的箱子不满意,在我看来,数据更难读取,甚至可能被误读。并非所有对数直方图都具有相同宽度的 bin,我相信它可以在 Python 中完成;你有想法改变我的代码来到达那里吗?

先感谢您 ;)

应该很简单:我只需要获取 x 轴数据的对数,然后通过 y 轴参数“log=True”构建直方图。

python plot matplotlib

5
推荐指数
0
解决办法
799
查看次数

定义概率分布代价是否昂贵?

我正在编写一个物理模拟编码,现在我觉得需要优化它.我正在考虑改进一点:我的一个方法之一(在几种情况下我称之为十亿次)每次定义一个概率分布.这是代码:

void myClass::myMethod(){ //called billions of times in several cases
uniform_real_distribution<> probd(0,1);
uniform_int_distribution<> probh(1,h-2);
uniform_int_distribution<> probv(1,v-2);
    //rest of the code
}
Run Code Online (Sandbox Code Playgroud)

我可以将分发作为类的成员传递,这样我就不必每次都定义它们吗?只需在构造函数中初始化它们,并在h和v更改时重新定义它们?这可能是一个很好的优化进展吗?最后一个问题,当使用标志-O3或-O2编译时,编译器(在我的情况下是g ++)是否已经纠正了这个问题?

先感谢您!

更新:我对它进行了编码并对两者进行了计时:程序实际上变得有点慢(几个百分点)所以我回到了我的开始:在每个循环中创建概率分布

c++ optimization probability

1
推荐指数
1
解决办法
172
查看次数

在Qt中默认情况下与指针无关的指针

我发现了一些与QtCreator 一起玩的东西以及我在使用gcc的析构函数中遇到的错误:默认情况下,指针不等于NULL; 这需要手动添加(在我的情况下为构造函数).这是正确的吗?怎么会?它们的默认值是多少?

c++ qt

0
推荐指数
1
解决办法
465
查看次数

标签 统计

c++ ×5

optimization ×3

random ×2

2d ×1

c++11 ×1

cuda ×1

geometry ×1

hardware ×1

matplotlib ×1

plot ×1

probability ×1

python ×1

qt ×1