Fortran与Matlab的通信

Fortran与Matlab的通信,matlab,fortran,iteration,communication,data-exchange,Matlab,Fortran,Iteration,Communication,Data Exchange,我是一个比较新的使不同的编程语言相互交流,并将感谢一些帮助。 基本上我有一个Fortran代码和一个Matlab代码。这两个代码首先初始化,然后必须按顺序运行。每个代码都需要另一个代码的输入。当这个过程重复足够频繁时,就会达到一些收敛标准,迭代就终止了。为了使事情变得更复杂,Fortran代码不仅需要来自Matlab的输入,还需要来自它自己的上一次迭代。Matlab也是如此。因此,据我所知,最好在整个迭代过程中保持两个程序都是开放的,因为我有很多变量,因此不能只将它们写入文本文件,将它们交给另一

我是一个比较新的使不同的编程语言相互交流,并将感谢一些帮助。 基本上我有一个Fortran代码和一个Matlab代码。这两个代码首先初始化,然后必须按顺序运行。每个代码都需要另一个代码的输入。当这个过程重复足够频繁时,就会达到一些收敛标准,迭代就终止了。为了使事情变得更复杂,Fortran代码不仅需要来自Matlab的输入,还需要来自它自己的上一次迭代。Matlab也是如此。因此,据我所知,最好在整个迭代过程中保持两个程序都是开放的,因为我有很多变量,因此不能只将它们写入文本文件,将它们交给另一个程序,并为下一次迭代保留它们

所以我基本上是想做这样的事情:

初始化变量集A、B、C和D

Fortran:

Input: A and B
Calculations …
Output: A (variables have now new values) and D
Matlab:

Input: C and D
Calculations …
Output: C (variables have now new values) and B
重复Fortran和Matlab,直到达到收敛标准


所以我的问题是:如何让Matlab和Fortran相互通信,并将变量相互传递?每种代码如何触发另一种代码,然后等待另一种代码先完成计算,然后再继续?

您最喜欢的搜索引擎的关键字是“fortran mex”。MATLAB有一个非常好的文档/教程,您可以开始:

MEX文件允许您从MATLAB调用Fortran子例程


但我相信,只有在从Matlab调用Fortran子程序时,它才会起作用。您不能轻易地从Fortran代码中调用Matlab.m函数。因此,您的“主”程序必须是Matlab
.m
脚本,该脚本调用MEX文件(实际上是一个动态库)中定义的Fortran子程序。

我不知道在Fortran或Matlab环境中进行的计算有多复杂,但这两种语言都面向计算(不太适合接口),因此,将代码中不太复杂的部分从一种语言“重写”到另一种语言,并且只使用一种语言(可能执行起来也更快)可能会少很多麻烦。你说的Matlab代码是什么意思?MEX二级函数?@Hoki遗憾的是,重写m文件或Fortran环境不是一个选项,因为它们都非常复杂。top-level.f文件调用许多子例程,类似地,top-level.m文件调用许多其他m文件。@Peter到目前为止,我只有.m文件。MEX二级函数可以用于我的应用程序吗?如果我从Matlab调用Fortran子程序,调用完成后Fortran变量会发生什么变化?我的意思是如何确保变量集A(来自原始post)在下一次Fortran调用中可用?我想这样做的一种方法是将所有变量从Fortran转移到Matlab,然后再从Matlab转移到Fortran,但我有很多变量需要来回传递。还有更优雅的方法吗?@Dorit:我对Fortran不太了解,但是使用C/C++MEX文件,您可以将变量声明为全局变量,并且它们在下次调用MEX函数时仍然可用(另请参见),只要您不从内存中清除它(
clear mex
clear all
将从内存中卸载共享库)。有几种方法可以锁定mex函数,以防止强制清除该函数而导致内存泄漏(请参阅)