C vs MATLAB(制作一个矩阵,其元素是均匀分布的随机数)

时间:2018-01-19 11:00:33

标签: c matlab performance random

我正在使用MATLAB运行模拟器。 但是,需要几天时间。 因此,我决定将代码更改为C. (首先,我尝试在MATLAB中使用c-mex,但我认为编码和调试非常困难.mxType !!!?!?!?因此,我决定使用Visual Studio 2017制作C代码。)

在我的MATLAB代码中,我使用了

x = [unifrnd(varmin(1),varmax(1),varnum,1),...
     unifrnd(varmin(2),varmax(2),varnum,1),...
     unifrnd(varmin(3),varmax(3),varnum,1)];

即,x是大小varnum * 3的矩阵,其第1列是从varmin(1)到varmax(1)均匀分布的随机数,第2列是从varmin(2)到varmax均匀分布的随机数( 2),第3列是从varmin(3)到varmax(3)均匀分布的随机数。

当我在C代码中创建矩阵时,我将编写如下代码:

srand(time(NULL));
for(j=1; j<3; j++) {
    for(i=1; i<varnum; i++) {
        x[i][j] = rand() % (varmax[j]-varmin[j]) + varmin[j];
    }
}

我将代码从MATLAB更改为C,因为运行时间太长。但是,我认为MATLAB一次处理一个矩阵,但C通过运行M * N迭代来处理大小为MxN的矩阵。 但是,下面的代码(C)是否比上面的代码(MATLAB)更快? 另外,有没有更好的代码来制作具有随机数的矩阵?

1 个答案:

答案 0 :(得分:1)

MATLAB和C都会运行随机生成M*N次,你无法真正解决这个问题。在C中它可能更明确一些,但最后它只是一个打字而不是实际速度的问题。

如果你以正确的方式使用它,我会说MATLAB非常快。这意味着要在内置矩阵运算上倾斜很多,并尽可能地将其他运算矢量化。它自动为您计算并行计算的事实只是在蛋糕上。 另一方面,如果您在大型矩阵上进行大量手动循环操作,则可能会出现问题。请注意,新版本的MATLAB也知道如何JIT那种代码,但它不会像超调整的内置方法一样快。

所以我要避免在MATLAB之外转到C.最多只做C中的一些小函数,其中MATLAB对你没有帮助,但其余部分留在MATLAB中。

除非你真的知道自己在做什么,否则你不太可能看到性能提升。事实上,我打赌你会看到性能下降。并保证增加开发成本。

如果资源允许,我会调查为团队购买更大的机器,或从AWS / GCP租用一些计算资源。虽然使MATLAB工作的后勤工作可能令人望而却步。