【问题标题】:C vs MATLAB (make a matrix whose elements are random numbers uniformly distributed)C vs MATLAB(制作一个矩阵,其元素是均匀分布的随机数)
【发布时间】:2018-01-19 11:00:33
【问题描述】:

我正在使用 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的矩阵,其第一列是从varmin(1)到varmax(1)均匀分布的随机数,第二列是从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) 快? 另外,有没有更好的代码来制作具有随机数的矩阵?

【问题讨论】:

  • 我建议使用优化的 c++ 库,例如 eigenThis 帖子显示,在 eigen 中生成随机复数矩阵比其他 c++ 库 Armadillo 快两倍。
  • 我建议将数据存储在Disc
  • mex 非常简单,只需将所有内容转换为 C 类型并返回即可。你最多需要 4 个 mex 函数
  • @rahnema1 不幸的是,我根本不懂 C++。我真的很想学 C++,但我现在做不到,对不起。
  • @AnderBiguri 好的,我将尝试使用 C-mex!

标签: c matlab performance random


【解决方案1】:

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

我会说,如果您以正确的方式使用 MATLAB,它的速度非常快。这意味着大量依赖内置矩阵运算并尽可能将其他运算向量化。它自动为您并行计算的事实简直是锦上添花。 另一方面,如果您在大型矩阵上进行大量手动循环,您可能会遇到问题。请注意,较新版本的 MATLAB 也知道如何 JIT 这类代码,但它不会像经过超调的内置方法那么快。

所以我会避免在 MATLAB 之外使用 C。最多只在 C 中执行一些小函数,而 MATLAB 确实无法帮助您,而将其余的留在 MATLAB 中。

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

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

【讨论】:

  • 我的代码有很多 for 循环。我的模拟有 10,000 个时隙。在每个时隙中,大约需要 500 x 50 (2,500) 次迭代才能收敛该值。另外,每次迭代都包含我的启发式路由功能(迭代我的节点数乘以边)。在这里,我以 MonteCarlo 方式模拟代码 1000 次。即使我在C中改变,也没有加速吗? :(
  • 整个答案都是基于意见的。事实上,完全优化 C 代码可能比完全优化 MATLAB 代码更快,因为在使用 MATLAB 时会有额外的解释层。您已经对用例可能是什么进行了很多猜测。如果您不必一开始就购买 MATLAB 许可证,开发设置成本实际上会降低,所以这又是主观的。尽管对 OP 的设置一无所知,但推荐硬件再次超出了范围。这个问题的框架很差,所以你的答案离题了。
  • 可能在这种情况下。似乎 MATLAB 不适合。您是否使用了任何特殊的 MATLAB 函数,或者更多的是它是一种您知道并且可以快速上手的语言?在 C 语言中有很多地方可能会出错——如果你有一个行序矩阵并以列序方式访问它,你将获得糟糕的内存访问性能。进行未对齐的读/写也会触发这种情况。如果对正在发生的事情没有更多的了解,我们只能推测。正如@Wolfie 所说,这不是一个好主意。而不是 SO 适合的格式。
猜你喜欢
  • 2017-02-17
  • 2021-12-28
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多