C++ 创建C+中的随机数矩阵+;无环

C++ 创建C+中的随机数矩阵+;无环,c++,matrix,boost,C++,Matrix,Boost,我需要使用高斯分布创建一个随机分布数字的多维矩阵,并尝试尽可能优化程序。目前我正在使用Boost矩阵,但我似乎找不到任何不手动循环就能实现这一点的东西。理想情况下,我希望类似于Python的NoMPy.Run.Runn()函数,但这必须在C++中完成。有没有比手动循环更快的方法来实现这一点?您无论如何都必须循环,但您可以在循环中消除数组查找。真正的N维数组索引将是昂贵的,所以您最好的选择是任何库(或自己编写的库),它也为您提供底层线性数据存储 然后,可以像线性数组一样循环整个n维数组,避免索引与

我需要使用高斯分布创建一个随机分布数字的多维矩阵,并尝试尽可能优化程序。目前我正在使用Boost矩阵,但我似乎找不到任何不手动循环就能实现这一点的东西。理想情况下,我希望类似于Python的NoMPy.Run.Runn()函数,但这必须在C++中完成。有没有比手动循环更快的方法来实现这一点?

您无论如何都必须循环,但您可以在循环中消除数组查找。真正的N维数组索引将是昂贵的,所以您最好的选择是任何库(或自己编写的库),它也为您提供底层线性数据存储

然后,可以像线性数组一样循环整个n维数组,避免索引与维度的多次相乘

另一种优化方法是完全取消索引,取一个指向第一个元素的指针,然后迭代指针本身,这样就取消了CPU中的整个变量,这可以为编译器提供更多的空间用于其他事情。e、 g.如果向量中有1000个元素:

vector<int> data;
data.resize(1000);

int *intPtr = &data[0];
int *endPtr = &data[0] + 1000;

while(intPtr != endPtr)
{
    (*intPtr) == rand_function();
    ++intPtr;
}
矢量数据;
数据。调整大小(1000);
int*intPtr=&data[0];
int*endPtr=&data[0]+1000;
while(intPtr!=endPtr)
{
(*intPtr)=rand_函数();
++intPtr;
}
在这里,发生了两件事。在循环本身之外预先计算结束条件(这避免了对vector::size()等函数的1000次查找),并使用指向内存中数据的指针而不是索引。每次使用索引访问数组时,它都会在内部转换为指针。通过存储“当前指针”并每次向其添加1,可以消除从索引计算指针1000次的成本

这可以更快,但取决于实现。编译器可以做一些同样的手工优化,但不是全部。rand_函数也应该是内联的,以避免函数调用开销


但是,警告:如果将std::vector与指针技巧一起使用,那么它不是线程安全的,如果另一个线程在循环期间更改了向量的长度,那么该向量可以重新分配到内存中的其他位置。不要使用指针技巧,除非您能够根据需要轻松编写自己的向量、数组和表类。

但我不确定您会看到多少改进。为什么您认为手动循环速度慢?我建议您不要担心循环的成本以及逐个设置矩阵每个元素的值。我怀疑你的程序中的任何瓶颈都会在别处。矩阵是卷积神经网络的一部分,需要能够处理大量数据,所以我正试图让它尽可能快。矩阵可以很容易地具有+10000个元素或更高的维度。感谢您的解释!