提高Matlab中卡尔曼滤波器的计算速度

时间:2013-07-24 13:20:23

标签: c matlab mex kalman-filter

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

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

3 个答案:

答案 0 :(得分:0)

编写mex文件肯定会加快整个过程,但是你将无法使用很多内置的MATLAB函数。你只能在C ++和C中做。你可以编写自己的函数,只要你知道如何。

速度增加主要来自于编译mex文件而不是标准MATLAB脚本逐行解释的事实。编译完mex后,可以像调用任何其他MATLAB函数一样调用它。

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

MEX Files Documentation

答案 1 :(得分:0)

如果你对C / C ++一点都不熟悉,那将会很难。希望除了Matlab之外你还有其他语言的经验吗?你可以尝试从许多included examples学习/复制,但你真的需要先弄清楚基础知识。

特别有一点。如果你使用mex,你需要一些方法来获得卡尔曼滤波器噪声的正确随机数。您可能会感到惊讶,但计算时间的很大一部分可能会产生噪声的随机数(取决于过滤器的复杂程度,它可能> 50%)。

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

这些不适合科学计算,尤其是在您需要时生成大量值时。您的第一个选择是将在Matlab中通过randn生成的大量随机数传递给您的mex代码。或者考虑包含C代码Mersenne Twister算法本身,并找到/实现一个用于从统一随机数生成正态随机数的方案(log-polar最简单,但Ziggurat会更快)。这不是太难。我自己完成了,Double precision SIMD-oriented Fast Mersenne Twister (dSFMT)实际上比Matlab当前实现的均匀变量快2倍。

答案 2 :(得分:0)

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