0

我在 Matlab 中计算一个统计模型,每次迭代必须运行大约 200 个卡尔曼滤波器,并且我想迭代模型至少 10 000 次,这表明我应该运行它至少 2 000 000 次。因此,我正在寻找一种方法来优化 Matlab 在这部分的计算速度。我已经对每个操作进行了操作,以尝试使用所有可以使用的技巧来优化 Matlab 中的计算,但我想更进一步......

我不熟悉 C/C++,但我读到 mex 文件在某些​​情况下可能很有用。任何人都可以告诉我是否值得朝这个方向发展???谢谢...

4

3 回答 3

0

如果您对 C/C++ 完全不熟悉,这将很难。希望您对 Matlab 之外的另一种语言有一些经验?您可以尝试从许多包含的示例中学习/复制,但您确实需要首先弄清楚基础知识。

特别是一件事。如果您使用 mex,您将需要一些方法来为您的卡尔曼滤波器噪声获得合适的随机数。您可能会感到惊讶,但您的计算时间的很大一部分可能是为噪声生成随机数(取决于您的过滤器的复杂性,它可能 > 50%)。

不要在 C/C++ 中使用默认的随机数生成器。

这些不适用于科学计算,尤其是在您似乎需要生成大量值时。randn您的第一个选择是将通过Matlab生成的大量随机数传递给您的 mex 代码。或者考虑包含 C 代码Mersenne Twister算法本身并找到/实现一个从统一随机数生成正常随机数的方案(对数极坐标最简单,但Ziggurat会更快)。这不是太难。我自己已经完成了,面向双精度 SIMD 的快速 Mersenne Twister (dSFMT)实际上比 Matlab 当前的统一变量实现快 2 倍以上。

于 2013-07-24T15:31:18.397 回答
0

编写 mex 文件肯定会加快整个过程,但是您将无法使用很多内置的 MATLAB 函数。您仅限于使用 C++ 和 C 进行的操作。当然,您可以编写自己的函数,只要您知道如何操作即可。

速度的提高主要是因为 mex 文件是编译的,而不是像标准 MATLAB 脚本那样逐行解释。编译完 mex 后,您可以像调用任何其他 MATLAB 函数一样调用它。

对于我在大学上的一门课,我必须编写自己的图像缩放功能,我最初是用标准脚本编写的,在大图像上需要几秒钟才能完成,但是当我在 mex 中用 C 语言编写它时将在不到 0.1 秒内完成。

MEX 文件文档

于 2013-07-24T13:24:06.453 回答
0

您通常可以使用 parfor 循环或并行计算工具箱来加快计算速度。您是否已经检查过 MATLAB 是否使用 100% CPU?

于 2013-07-24T21:53:41.570 回答