如何使用MATLAB编写的程序在Octave中运行得更快?

时间:2018-06-14 14:36:03

标签: matlab octave

我以前没有MATLAB的经验。现在,我正在尝试编辑一个MATLAB程序,使其可以在GNU Octave中运行(两者都在Windows系统上)。

我通过更改一些运算符或特殊字符修复了一些错误,例如 +:不一致的参数(op1是1x1,op2是0x1)。例如,我改变了

val = textscan(unit53,'%d %s %f %f %f %f \r\n'); 

val = textscan(unit53,'%d %s %f %f %f %f "\r""\n"'); 

我成功编辑了程序,它运行时没有错误。但是,我编辑的程序大约需要32个小时才能完成运行。最初的MATLAB程序只需要大约10分钟即可运行。

程序的缓慢部分是关于声明的for循环,用从文档中读取的信息填充矩阵,并用这些矩阵进行计算。

每次尝试在Octave中运行MATLAB代码时,是否会发生这种情况(运行速度较慢)?

如何让MATLAB代码运行得更快?

1 个答案:

答案 0 :(得分:2)

  

原始MATLAB代码只需大约10分钟即可运行。程序的缓慢部分是关于声明的循环,用文档读取的信息填充矩阵,并用这些矩阵进行计算。

根据经验,如果你在Octave程序中看到一个包含多次迭代的for循环,那么这不是一个好的程序。 Matlab曾经是相同的,但现在他们有一个不错的JIT加速了这些草率的代码。如果您的代码是矢量化的,那么您不应该看到Octave和Matlab之间存在很大差异。

如何做,取决于你的问题。许多功能实际上可以很好地与数组一起使用,只是因为人们不会那样使用它们。进入你的for循环,然后将每一行放在循环之外,一个接一个。根据您的问题,这可能并不容易。另一种方法是,如果循环迭代彼此独立,请考虑使用并行包。

作为一个例子,我曾经有一个程序,在Matlab运行约20分钟。在Octave,我在2天后杀了它。主要问题是两个for循环,其中一个迭代遍历512 * 512 * 2000图像的每个像素。在我矢量化后,Octave在2分钟内运行它。我不得不移植许多Matlab程序,这很常见。

编辑(回答评论):有很多关于矢量化的例子和教程,但没有灵丹妙药。解决方案通常是唯一的,它将取决于您的代码。对于连续元素之间差异的特定情况,您应该使用diff来获取差异数组,然后对其进行处理。向量化代码看起来会增加内存使用量,但会更快。