声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7940|回复: 18

[综合讨论] 感慨了,matlab数值积分速度太慢.

[复制链接]
发表于 2008-9-16 11:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
这一阵在做一个带参数的数值积分,要通过循环不停的进行数值积分运算,发现速度是在是太慢,不能够接受,大家有没有什么好的方法?不行的话,我只能转学fortran了

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2008-9-16 12:26 | 显示全部楼层

回复 楼主 jojocleo 的帖子

哈哈我觉得速度还可以啦
 楼主| 发表于 2008-9-16 13:18 | 显示全部楼层
我现在计算的其实是一个很简单的积分式,算625次大概要8s,计算一个参数要算625*3*4次,再加上其他程序时间总共要100+s了,每次要算10个参数的话就要1000s,如果要优化。。。崩溃了
发表于 2008-9-16 13:59 | 显示全部楼层
改fortran吧,

我认为循环慢绝对是matlab的一个重大缺点

可笑竟然有的书上说,依赖循环是旧思想,搞什么矢量化。

矢量化是matlab不得已而为之的做法,绝对不是其优点。

最重要的是, 不是所有的循环都能矢量化的。
发表于 2008-9-16 14:23 | 显示全部楼层
循环不是matlab的强项
发表于 2008-9-16 15:15 | 显示全部楼层
不这么认为,数值计算是MATLAB的强项,里面的算法是高度优化的,比一般人用C/C++写的要快得多。各位不信可以自己写写有关矩阵的各种算法,无论你用什么语言,然后和MATLAB比一比。
而且,矢量化不是MATLAB不得以而为之的做法,而是其一大编程特色,是MATLAB的精髓之一。以前的循环是MATLAB的瓶颈,可是现在新版本的MATLAB,如果循环嵌套的不是很多的话,早已不是其瓶颈。下面链接有一个这方面的介绍。
http://forum.simwe.com/viewthread.php?tid=839042

评分

1

查看全部评分

发表于 2008-9-16 16:18 | 显示全部楼层
我不想花时间去论证matlab的循环效率问题,只是想到哪说到哪。反正我除了一些简单的矢量化,复杂一点的我就避开。

不论证,但是提几点有关矢量化疑问。

1、既然矢量化好,新版本为什么还去提高循环的效率?这不是矛盾吗?

2、矢量化那么好,为什么别的语言不用,只成为matlab的“编程特色”?
记得原来说指针是c语言的一大特色,后来其它大部份语言都引入了指针。可见好的东西,大家都会学的。
而且,如果以后matlab的循环效率提高了,矢量化会不会用得越来越少?

3、matlab的算法很多是经过了优化,但是别的语言也有经过优化的算法呀。不能把matlab优化过的算法,和一般人编的没有经过优化的算法来比较吧。而且matlab很多也用别的语言的算法,比如lapack。

    其实既使矢量化了,所达到的速度也只是内部代码达到的优化速度,记得现在matlab是用C编的,也就是说,矢量化以后,会达到优化后的C语言的水平。我们大多数时候之所以用matlab而不用C,是因为matlab编程简单。但如果矢量化太过复杂,足以抵消matlab语法简单所带来的好处,那还真不如用其他语言呢。

    比如lz的问题,只是简单的积分,用fortran编也不难,而且也有优化过的代码,所以觉得他这个问题用fortran比matlab要好得多。
发表于 2008-9-16 16:25 | 显示全部楼层
原帖由 messenger 于 2008-9-16 13:59 发表
改fortran吧,
我认为循环慢绝对是matlab的一个重大缺点
可笑竟然有的书上说,依赖循环是旧思想,搞什么矢量化。
矢量化是matlab不得已而为之的做法,绝对不是其优点。
最重要的是, 不是所有的循环都能 ...

抱歉! 我不太认同此说法. 本来不同软件就有不同的原始目的
我认为使用matlab较大的好处就是其方便性, 有许多现成的m-function可用, 或许是个人较懒吧!
虽然同意"不是所有的循环都能矢量化的", 但为何"矢量化是matlab不得已而为之的做法" ? 愿闻其详
发表于 2008-9-16 16:39 | 显示全部楼层

回复 板凳 jojocleo 的帖子

由你的描诉, 我认为并非积分速度太慢, 应该是循环次数很多 !
我的经验, matlab使用循环时需特别小心, 命令写法不同可能差别很大
毕竟软件不同吧! 总不能使用fortran/C的语法架构套用吧!
发表于 2008-9-16 17:15 | 显示全部楼层
1、既然矢量化好,新版本为什么还去提高循环的效率?这不是矛盾吗?

循环对于迭代等计算是必不可少的手段,不是所有代码都能矢量化,优化循环与矢量化并不矛盾;
2、矢量化那么好,为什么别的语言不用,只成为matlab的“编程特色”?

不是别的语言不想用,而是由于各种语言有他们各自的特色,MATLAB是解释性的数学语言,C/FORTRAN是编译性的语言,不能放在一个起跑线比较。另外,很多代码的“矢量化”只是提高代码的简洁性,调用的built-in函数还是循环,只是无需我们来写而已,例如findstr就属此类。此外,语言是个积累的过程,时间起点不同,MATLAB的作者本人Clieve moler自己就是FORTRAN的大师(MATLAB的核心矩阵计算FORTRAN程序库lapack他就是主撰写人之一)他比我们恐怕更知道为什么FORTRAN没有“矢量化”了,在那个年代形成的程序构架,这么多现成的程序库已经形成,现在想改,恐怕它首先也得有能力改吧,即使有大决心,改了,也需要有那么多倔强的老Fortran fans愿意去普及、接受,即使他们都接受了,突然又发现编译型语言循环又不是短脚...我#¥%……%¥%……!
如果以后matlab的循环效率提高了,矢量化会不会用得越来越少?

在MATLAB内部的循环效率改进与java的虚拟机有关,两者的效率对小规模计算是接近,但是如果让你写代码,循环写三十行重重套,用矢量式的语言一行解决,而效率基本相同,你用哪个?循环与所谓的矢量化在很多特殊场合下,相互还不能等价替换,两条腿走路哪个也少不了,都需要用。
至于楼主的问题,窃以为各位不必瞎费心思讨论了,没有具体代码,不知道是用匿名函数还是内联函数调用,不知道是自己写的命令还是调用内部函数,各位如果坚持搞“悬丝诊脉”这么高深的武学,那我才疏学浅,怕怕先闪。

[ 本帖最后由 bainhome 于 2008-9-16 17:24 编辑 ]

评分

1

查看全部评分

发表于 2008-9-16 17:21 | 显示全部楼层
1、messenger兄也承认,不是所有的循环都能矢量化的。所以MATLAB也在不断提高循环效率。
2、矢量化是伴随MATLAB,以生俱来的。矢量化内部细节我不清楚,据说是很好利用了CPU的算术逻辑单元等相关硬件,而且伴随着新的CPU发展,MATLAB内核也再不断调整与便充分利用发掘CPU的潜力。至于别的语言为什么不采用,我觉得不能简单回答这个问题。因为内部细节不清楚,也许别的语言有类似的机制实现类似的功能。这些都是很底层的东西,我们很难清楚。
3、从楼主描述来看,瓶颈不在MATLAB数值计算那里,而是算得次数太多。或者楼主的程序效率不高。不过楼主没有给出程序以及原问题,这些都不好说。因此建议楼主看到后把代码和问题贴上来,否则这样是没有结论的。
总之个人感觉,楼主的问题不是MATLAB慢而是没用好。

[ 本帖最后由 rocwoods 于 2008-9-16 17:26 编辑 ]
发表于 2008-9-16 17:23 | 显示全部楼层
bainhome兄说的“在那个年代形成的程序构架,这么多现成的程序库已经形成,现在想改,恐怕它首先也得有能力改吧。”正是我想说,没有表达出来的
发表于 2008-9-16 17:39 | 显示全部楼层
其实回头想想,messenger兄的意见我本人有些感触:如果不计代价、限定时间,很多算法我第一意识是采用循环。记得有一次朋友玩笑式地让我帮忙算1000以内有多少个能被18除完余2的整数,分别是多少?起先是想用mod函数,还在想怎么矢量化一下让代码比较简洁,朋友随口来了一句:“5分钟有能力解决吗”?
当时把我惹急了,我说:“你给老子看时间!”最后写出的代码本能就是循环——加上打字,一共40来秒,如果矢量语言的话,现在想想,恐怕我会需要稍长的时间,就没有这么震撼了。想起一句话:“莫装逼,装逼被雷劈”啊。:lol
但是今天发完贴再一想,又觉得沮丧,如此简单的问题,我居然能用循环去做,真猪头也...
  1. a=20:18:1000
  2. lena=length(a)
复制代码

[ 本帖最后由 bainhome 于 2008-9-16 17:43 编辑 ]
发表于 2008-9-16 19:08 | 显示全部楼层

回复 8楼 ChaChing ,1楼 rocwoods ,12楼 rocwoods ,13楼 bainhome 的帖子

我说的其他语言,不只是fortran、c等第三代语言,也包括和matlab并列的第四代语言,比如mathematica等。

我并不是完全否定matlab,只是说用矢量来代替循环并不是一个好的办法,将矢量化代替循环(注意,不是矢量化,而是矢量化代替循环)上升到编程新思想的高度更是可笑。

比如,一个比较经典的矢量化代替循环的例子:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    用一个循环建立一个向量,其元素依赖于前一个元素
    使用的工具:FILTER, CUMSUM, CUMPROD
    优化前:
    A = 1;
    L = 1000;
    for i = 1:L
      A(i+1) = 2*A(i)+1;
    end
    优化后:
    L = 1000;
    A = filter([1],[1 -2],ones(1,L+1));
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这个例子能搞懂的人估计不多,能用到实际程序中的更少,反正我是花了很长时间才搞懂的,但搞懂以后觉得不值得,没什么用,而且确实后来也没用过。

所以,我觉得matlab还是把循环速度搞上去才是正事。


lz的问题本来也不是什么大问题,大不了开一晚上机器,就什么都解决了。


我也只是就这个机会,就觉得matlab不爽的地方发发牵骚,不管发的牵骚对还是错,反正和大家讨论一下,总有收获:lol





原帖由 rocwoods 于 2008-9-16 17:23 发表
bainhome兄说的“在那个年代形成的程序构架,这么多现成的程序库已经形成,现在想改,恐怕它首先也得有能力改吧。”正是我想说,没有表达出来的

评分

1

查看全部评分

发表于 2008-9-16 21:48 | 显示全部楼层

回复 14楼 messenger 的帖子

开发商业软件的目的是为了让用户省力省时。如果不发挥matlab的特长,那么就不要选择matlab。
不是所有人都能对程序进行优化的,就连专业搞算法的人也不一定能做得到。有时,优化时间可能比计算时间付出更大的代价,因此有必要依赖matlab等其它数值软件的特长。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-26 01:38 , Processed in 0.075273 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表