我有很多很好的MATLAB代码运行得太慢而且用C语言编写是很痛苦的.如果有的话,用于C的MATLAB编译器似乎没什么帮助.它应该加快执行速度吗?我搞砸了吗?
如果您正在使用MATLAB编译器(在最新版本的MATLAB上),那么您几乎肯定不会看到任何加速.这是因为所有编译器实际上都会为您提供一种打包代码的方法,以便将其分发给没有MATLAB的人.它不会将它转换为更快的任何东西(例如机器代码或C) - 它只是将它包装在C中,因此您可以调用它.
它通过让你的代码,在MATLAB编译器运行时(MCR),它本质上是MATLAB计算内核上运行 - 你的代码仍然被解释.由于必须调用MCR而导致的惩罚,您可能会发现编译代码的运行速度比在MATLAB上运行它时要慢.
换句话说 - 你可能会说编译器实际上没有编译 - 至少在传统意义上是这样.
较旧版本的编译器工作方式不同,在某些情况下可能会出现加速.对于Mathwork来说,这是一个很好的选择
http://www.mathworks.com/support/solutions/data/1-1ARNS.html
根据我的经验,缓慢的MATLAB代码通常来自不对代码进行矢量化(即,编写for循环而不仅仅是乘法数组(简单示例)).
如果您正在进行文件I/O,请注意一次读取一个数据.查看fscanf矢量化版本的帮助文件.
不要忘记MATLAB也包含一个探查器!
我会回应dwj所说的:如果你的MATLAB代码很慢,这可能是因为它没有足够的矢量化.如果您在对整个数组进行操作时进行显式循环,那就是罪魁祸首.
这同样适用于所有面向阵列的动态语言:Perl数据语言,数字Python,MATLAB/Octave等.在编译的C和FORTRAN编译代码中甚至有一定程度的真实:专门设计的矢量化库通常使用仔细的手工编码内部循环和SIMD指令(例如MMX,SSE,AltiVec).
首先,我首先回顾有关分析和矢量化的所有上述评论.
从历史的角度来看......
较旧版本的Matlab允许用户通过预解析m代码并将其转换为一组matlab库调用,将m个文件转换为mex函数.这些调用具有解释器所做的所有错误检查,但旧版本的解释器和/或在线解析器速度很慢,因此编译m文件有时会有所帮助.通常它有助于你有循环,因为Matlab很聪明,可以在C中内联其中一些.如果你有其中一个版本的Matlab,你可以尝试告诉mex脚本保存.c文件,你可以看到它的确切内容这样做.
在更新的版本中(可能是2006a及更高版本,但我不记得),Mathworks开始使用即时编译器进行解释.实际上,这个JIT编译器自动编译所有mex函数,因此显式脱机操作根本没有帮助.在那之后的每个版本中,他们也付出了很多努力来使解释器更快.我相信更新版本的Matlab甚至不能让你自动将m文件编译成mex文件,因为它不再有意义了.