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

我以前没有使用过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,我建议您在此处发布一个完整的,可运行的和有据可查的代码,并寻求帮助以更快的速度运行它,并提供更好的样式提示。但重要的是,其他人可以抓取这段代码,并可以开始分析和优化它

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值