爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8803|回复: 7

[程序设计] 同样的公式,为何我的matlab程序要3小时,而别人的fortran只需10多分钟?

[复制链接]

新浪微博达人勋

发表于 2014-9-22 22:22:45 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
情况是这样的,希望大神们给答疑解惑。
原理如下:
有个公式,是计算风成浪的,要先算小风区长度,然后一步就可以得到波高。风区长度是13个方向上的长度加权值,这个也好办。
以A点为例,某个方向上的风区长度,是从A点向该方向上画射线,射线与陆地的交点到A点的距离即为该方向的风区长度。

思路与步骤:
依照上述原理,我先生成一个100*100的矩阵,相当于100*100的网格。大于0的代表陆地,小于0的代表水域。
1,先用find函数,找出所有水域网格,以减少计算的工作量;
2,假定第一个方向的角度为r,先让步长n=1,n作为三角形的一个直边,n*tan(r)是另一个直边的端点。若端点小于0,则n=2,直到端点大于0为止。
然后进行下一个方向的判断。
3,该点的13个方向找完以后,再进行其他网格点的计算。
4,加权风区长度,该步时间很短。可以忽略。

问题:
调试过后,发现可以运算,但耗时太长。同样的目的,其他人用fortran程序,耗时不到20分钟,而我的matlab需要3小时以上。
个人觉得,我的算法上还存在优化的空间,请大神们指教。看如何提升效率?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-22 22:41:05 | 显示全部楼层
Fortran就是快,你们就是算法都一样也是fortran快。所以,就用人家的程序呗~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2014-9-23 02:36:43 | 显示全部楼层
1.楼主可以启用并行,请自行搜索
2.关于计算时间的问题请参考:http://julialang.org/
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-23 07:51:14 | 显示全部楼层
Fortran是快,c也还行
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-23 08:18:45 | 显示全部楼层
计算快就是fortran的特点,MATLAB的特点是编程简便
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-23 08:39:52 | 显示全部楼层
相同条件下 fortran的计算速度就是快啊....没的说
要么那么多大型的模式 高性能计算都选择fortran
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-9-23 08:44:07 | 显示全部楼层
当MATLAB的计算速度是没法和Fortran比的,Fortran本来就是为计算而生,看看别人的Fortran是不是加了并行,如果是的话,MATLAB也可以加了试试,如果没有并行差距还这么大,建议你加上Fortran并行试试,也许会更快。
MATLAB我不熟悉,但是我用过的其他语言而言,比如循环里面如果加上各种if判断,会大大降低效率,具体怎样减少这些情况的发生,需要自己仔细考虑。算法的优化可能还需要看其他算法方面的书籍。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2014-9-23 08:45:39 | 显示全部楼层
其实没有什么可比性的,fortran就是为了计算公式而生的。
当然,算法其实还是很重要的,由于不太懂你这个,不知道算法设计是否合理。
建议少用matlab内置的库函数,这样或许可以节省一点计算时间。
此外,作为对比,你也可以参考fortran的算法,设计一样的,然后比较二者在哪一个环节出现的计算慢的情况。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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