我以前没有使用过MATLAB的经验。 现在,我正在尝试编辑一个MATLAB程序,以使其在GNU Octave中均可运行(均在Windows系统上)。
通过更改某些运算符或特殊字符,我修复了一些错误,例如+:不一致的参数(op1为1x1,op2为0x1)。 例如,我改变了
val = textscan(unit53,'%d %s %f %f %f %f
');
至
val = textscan(unit53,'%d %s %f %f %f %f"
""
"');
我成功地编辑了该程序,它可以正常运行。 但是,我编辑的程序大约需要32个小时才能运行。 原始的MATLAB程序只需要大约10分钟即可运行。
程序的最慢部分是关于声明的for循环,用从文档中读取的信息填充矩阵,然后使用这些矩阵进行计算。
每当您尝试在Octave中运行MATLAB代码时,是否会发生这种情况(运行速度较慢)?
如何使MATLAB代码运行得更快?
在几乎所有方面,八度通常比MATLAB慢。在您的情况下,所花费的时间是MATLAB的3倍左右,这有点太多,可能是另一个问题,但也可能您做得还不错。我认为没有任何一般规则可以解决此问题。 (请问您为什么要迁移代码?)
此外,标题似乎有点歧义。我猜您希望Octave代码的运行速度比当前运行的速度更快。还是您想击败MATLAB?
非常感谢您的帮助。我英语写作不好。这就是为什么我提出一个模棱两可的问题。我希望Octave代码的运行速度比当前运行的速度快。
我刚刚注意到您说在MATLAB中花费10分钟,在Octave!中花费30小时,而不是3而是180!。那一定是有问题的。您的结果是否相同?
我还没有结果。运行慢速循环之前的变量值与原始MATLAB代码中的值相同。我添加了fprintf(已达到%d个循环,loop_counter);循环。然后,我计算破坏单个循环的持续时间。因此,我可以估计总运行时间约为32小时。
好吧,我认为一定有问题,我什至不愿意等待结果。但是我不知道为什么如果代码可以在MATLAB中运行,那么为什么要转到Octave的原因。
是的,我认为您是对的。代码中一定有问题。关于迁移代码的原因,我不知道。老板把这份工作交给了我。也许,八度版本适用于没有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分钟。在八度中,我在两天后杀死了它。主要问题是两个for循环,其中一个循环遍历512 * 512 * 2000图像的每个像素。我进行矢量化处理后,Octave在2分钟内运行了它。我不得不移植许多Matlab程序,这很常见。
编辑(评论的答案):有很多关于矢量化的示例和教程,但没有灵丹妙药。该解决方案通常是唯一的,并且将取决于您的代码。对于连续元素之间的差异的特定情况,应使用diff获取差异数组,然后对其进行处理。向量化代码看起来会增加内存使用量,但速度会更快。
您能给我看看一些关于向量化的例子吗?
在我的代码中,那些for循环非常复杂。使用了很多变量。同样,使用两个连续元素之间的差异。 (例如:hx(i,j)-hx(i,j-1))。我应该为差异创建一个新的矩阵,然后使用代码中的矩阵进行计算来解决此问题吗?谢谢。
@Killed_by_Bugs请参见答案的编辑以解决您的问题。
谢谢您的回答。但是,如果我使用diff来获取差异数组,则会出现问题。 diff函数返回一个列数比原始数组少1的数组。因此,我将收到"错误:运算符-:不符合参数(op1为......")这种错误。我想我可能会在该diff返回的数组中再添加1个零列,但我不知道该怎么做你能建议吗?
@Killed_by_Bugs还有codereview.stackexchange.com,我建议您在此处发布一个完整的,可运行的和有据可查的代码,并寻求帮助以更快的速度运行它,并提供更好的样式提示。但重要的是,其他人可以抓取这段代码,并可以开始分析和优化它