我是一名医学研究员,使用MATLAB 2009b编写的代码由于自引用循环(这里不确定编程术语)而运行得非常慢,即在第二次迭代期间使用第一次迭代的结果,等等(我已将它矢量化为一个票价 - 我已经运行了Profiler。)
我想将代码的慢速部分转换为mex函数。我在20世纪70年代早期学过Fortran但从那以后就没用过它。我需要转换的代码没有任何花哨的东西,它只是一个很长的数值计算。
我的问题是:对于这个目的而言,什么是最容易重新学习的Fortran版本,以及什么编译器在Intel Mac上最适合这个?我找到了将MATLAB中的语法与Fortran 90进行比较的信息,并且转换看起来不像对我来说太令人生畏。但是,我再也不是程序员了。
我正在使用带有OS 10.6的MacBook Pro。
感谢任何帮助,谢谢。
答案 0 :(得分:8)
我建议使用现代Fortran,至少90/95,因为语法更宽容,几乎所有编译器现在都支持它。
在Mac上,我会推荐来自here的gfortran。它不是最新版本,但它与Apple构建工具(您需要从Mac OS DVD安装Xcode)很好地集成,并且运行良好。在数字python社区中,它依赖于很多Fortran扩展,强烈建议使用此版本。
我实际上并没有在Mac上使用fortran mex - 但我认为如果你遵循mex文档它应该相当简单 - 正如你所说的将代码从Matlab转换为Fortran应该不会太糟糕(如果你可以避免调用Matlab函数,但fortran有合理的切片和数组访问权限。)
答案 1 :(得分:0)
嗯,你可能已经找到了解决方案。但是,我会这样说:Matlab越来越快。但是,充分利用Matlab的JIT有时并不直观。 Mathworks曾经说过矢量化代码以提高速度。然后他们说在显式循环中写一切。我实际上不确定目前的最佳做法是什么。
我所说的是,在你去找fortran之前,找出最佳实践并实施它。这可能会给你足够的加速。
另外,你是否完全确定你已经将减速速度隔离到一个循环?你有没有使用过探查器?你可能有,因为你听起来很有经验。我以为我会提到它。
祝你好运, 爱丽儿