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

How to make a program written in MATLAB run faster in Octave?

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

我通过更改一些运算符或特殊字符修复了一些错误,例如 +:nonconformant arguments (op1 is 1x1, op2 is 0x1)。比如我改了

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

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

我成功地编辑了程序并且它 运行s 没有错误。但是,我编辑的程序需要大约 32 个小时才能完成 运行ning。原来的MATLAB程序只需要10分钟左右就可以运行.

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

每次尝试在 Octave 中编写 运行 MATLAB 代码时,是否都会发生这种情况(运行 秒)?

如何使 MATLAB 代码 运行 更快?

The original MATLAB codes only takes about 10 minutes to run. The slow part of program is a for loop about declaration , filling matrix with the information read from a document,and doing calculation with those matrix.

根据经验,如果您在 Octave 程序中看到包含多次迭代的 for 循环,那将不是一个好的程序。 Matlab 曾经是一样的,但现在他们有一个不错的 JIT 可以加速这种草率的代码。如果您的代码是矢量化的,那么您应该看不出 Octave 和 Matlab 之间有太大区别。

怎么做,取决于你的问题。许多函数实际上可以与数组一起正常工作,只是人们不那样使用它们。进入你的 for 循环,将每一行都逐出循环,一行一行。根据您的问题,这可能并不容易。替代方案,如果循环迭代彼此独立,请考虑使用并行包。

例如,我曾经在 Matlab 中编写了一个程序 运行 大约需要 20 分钟。在 Octave 中,我在 2 天后将其杀死。主要问题在于两个 for 循环,其中一个是迭代 512*512*2000 图像的每个像素。在我矢量化之后,Octave 运行 不到 2 分钟。我不得不移植很多Matlab程序,这很常见。

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