我正在尝试生成5000乘5000的随机数矩阵。这是我用MATLAB做的事情:
for i = 1:100
rand(5000)
end
这就是我在C ++中所做的:
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <ctime>
using namespace std;
int main(){
int N = 5000;
double ** A = new double*[N];
for (int i=0;i<N;i++)
A[i] = new double[N];
srand(time(NULL));
clock_t start = clock();
for (int k=0;k<100;k++){
for (int i=0;i<N;i++){
for (int j=0;j<N;j++){
A[i][j] = rand();
}
}
}
cout << "T="<< (clock()-start)/(double)(CLOCKS_PER_SEC/1000)<< "ms " << endl;
}
MATLAB大约需要38秒,而C ++大约需要90秒。 在另一个问题中,人们执行相同的代码并获得相同的C ++和MATLAB速度。
我想知道我在这里缺少什么?谢谢你的帮助。
编辑:这是关键的事情...... Why MATLAB is faster than C++ in creating random numbers?
在这个问题中,人们给了我答案,他们的C ++速度与MATLAB相同。当我使用相同的代码时,我的速度会变得更差,而我正在努力理解为什么。
答案 0 :(得分:3)
在您的C ++代码中,您正在堆上执行5000次double [5000]分配。如果你单次分配一个双[25000000],你可能会获得更好的速度,然后你自己的算术将你的2个索引转换为单个索引。
答案 1 :(得分:3)
您的测试存在缺陷,正如其他人所指出的那样,甚至没有解决标题所做的陈述。您正在将内置的Matlab函数与C ++进行比较,而不是Matlab代码本身,实际上它比C ++执行速度慢100倍。 Matlab只是C / Fortran中BLAS / LAPACK库的一个包装器,所以人们会期望一个Matlab脚本,一个完全编写的C ++大致相当,实际上它们是:Matlab 2007b中的这段代码
tic; A = rand(5000); toc
在我的机器上执行810毫秒
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <ctime>
#define N 5000
int main()
{
srand(time(NULL));
clock_t start = clock();
int num_rows = N,
num_cols = N;
double * A = new double[N*N];
for (int i=0; i<N*N; ++i)
A[i] = rand();
std::cout << "T="<< (clock()-start)/(double)(CLOCKS_PER_SEC/1000)<< "ms " << std::endl;
return 0;
}
在830ms内执行。 Matlab内部RNG优于rand()
的一个小优势并不令人惊讶。另请注意单个索引。 这就是Matlab在内部执行的操作。然后它使用一个聪明的索引系统(由其他人开发)为您提供类似矩阵的数据接口。
答案 2 :(得分:0)
我相信MATLAB在您的机器上使用多个cpu内核。您是否尝试编写多线程版本并测量差异?
此外,(伪)随机的质量也会略有不同(但不是那么多)。
答案 3 :(得分:0)
根据我的经验,
product
库中函数itertools
给出的常见做法,请参阅this)我希望它有所帮助。