Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB脚本和fortran脚本用于bash脚本的for循环。我可以避免多次调用MATLAB吗?_Bash_Matlab_Fortran - Fatal编程技术网

MATLAB脚本和fortran脚本用于bash脚本的for循环。我可以避免多次调用MATLAB吗?

MATLAB脚本和fortran脚本用于bash脚本的for循环。我可以避免多次调用MATLAB吗?,bash,matlab,fortran,Bash,Matlab,Fortran,我有一个bashshell脚本,它在for循环中运行多个MATLAB和fortran代码 在循环中,bash脚本反复调用MATLAB。这使得脚本效率低下 我使用Matlab2017b和MacOSXCatalina(10.15.7) 有什么建议吗 #/bin/bash 对于{1..10}中的i 做 cp初始输入\uu$i初始输入 matlab-nodesktop-nosplash-r“matlab1;退出 cp matlat1.output fortran1.input gfortran fort

我有一个bashshell脚本,它在for循环中运行多个MATLAB和fortran代码

在循环中,bash脚本反复调用MATLAB。这使得脚本效率低下

我使用Matlab2017b和MacOSXCatalina(10.15.7)

有什么建议吗

#/bin/bash
对于{1..10}中的i
做
cp初始输入\uu$i初始输入
matlab-nodesktop-nosplash-r“matlab1;退出
cp matlat1.output fortran1.input
gfortran fortran1.f
/a.out
cp fortran1.output matlab2.input
matlab-nodesktop-nosplash-r“matlab2;退出
cp matlab2.output fortran2.input
gfortran fortran2.f
/a.out
cp fortran2.output matlab3.input
matlab-nodesktop-nosplash-r“matlab3;退出
cp matlab3.output fortran3.input
gfortran fortran3.f
/a.out
cp fortran3.output最终输出
完成

在Mac或Linux上没有内置的简单Matlab方法来实现这一点;它不是在“客户机/服务器”模式下运行的,在这种模式下,有一个需要多个命令的持久化Matlab进程。(如果您使用的是Windows,则可以使用Matlab来执行此操作。)

官方的MathWorks实现这一点的方法可能是使用他们的产品,这是一个运行Matlab工作池的服务器,您可以通过JSON API向其发送调用。但对于您的环境来说,这是一个相当重的、有进取心的系统,它根本不在Mac上运行,并且将花费您20000美元

如果您真的想以客户机-服务器的方式使用Matlab实现这一点,您可以编写一个Matlab程序,使Matlab作为服务器运行:让它运行一个循环,通过检查目录中的新文件或侦听套接字来等待输入,然后当新输入到达时,使用
eval()
来运行它,然后返回循环以等待更多输入。完成后,向其发送
exit
命令


但这需要做很多工作,调试多进程通信之类的东西很难。在你的例子中,我实际要做的就是像Cris Luengo建议的那样,将bash脚本的内容下放到Matlab M代码中,这样你的Matlab脚本就可以控制整个过程。这个bash脚本的功能可以使用
system()
函数和/或
在Matlab中轻松编写构造。

我会在MATLAB中编写这个循环。调用外部程序很容易,无需在shell脚本中执行此操作。另外,我不明白你为什么一遍又一遍地重新编译你的Fortran程序,为什么不在循环之前只编译一次呢?我还可能把Fortran程序转换成一个MEX文件,不再明显地使用文件在程序之间交换数据。