簡體   English   中英

MATLAB 腳本和 fortran 腳本用於 bash 腳本的 for 循環。 我可以避免多次調用 MATLAB 嗎?

[英]MATLAB scripts and fortran scripts are used in a for loop of a bash script. Can I avoid call MATLAB multiple times?

我有一個 bash shell 腳本,它在 for 循環中運行多個 MATLAB 和 fortran 代碼。

在循環中,bash 腳本一遍又一遍地調用 MATLAB。 這使腳本效率低下。

我使用 MATLAB 2017b 和 Mac OS X Catalina(10.15.7)。

有什么建議?

#!/bin/bash 
 
for i in {1..10}
do
    cp initial_input_$i initial_input
    matlab -nodesktop -nosplash -r "matlab1; exit;"
    cp matlat1.output fortran1.input
    gfortran fortran1.f 
    ./a.out
    cp fortran1.output matlab2.input
    matlab -nodesktop -nosplash -r "matlab2; exit;"
    cp matlab2.output fortran2.input
    gfortran fortran2.f 
    ./a.out
    cp fortran2.output matlab3.input
    matlab -nodesktop -nosplash -r "matlab3; exit;"
    cp matlab3.output fortran3.input
    gfortran fortran3.f 
    ./a.out
    cp fortran3.output final_output_$i
done

在 Mac 或 Linux 上沒有內置的普通 Matlab 方法來執行此操作; 它不會在“客戶端/服務器”模式下運行,在這種模式下,有一個持續的 Matlab 進程需要多個命令。 (如果您使用的是 Windows,則可以使用 Matlab 的“COM 自動化服務器”模式來執行此操作。)

MathWorks 的官方方法可能是使用他們的Matlab Production Server產品,該產品是一個運行 Matlab 工作池的服務器,您可以通過 JSON API 將調用分派到該池。 但這對於您的環境來說是相當重量級和企業級的,根本不能在 Mac 上運行,並且將花費您 20,000 美元。

如果您真的想以客戶端 - 服務器的方式使用 Matlab 執行此操作,您可以編寫一個 Matlab 程序,使 Matlab 作為服務器運行:讓它運行一個循環,通過檢查目錄中的新文件或偵聽來等待輸入一個套接字,然后當新輸入到達時,使用eval()運行它,然后返回循環等待更多輸入。 完成后,向它發送exit命令。

但這需要大量的工作,而且調試這樣的多進程通信很困難。 因此,在您的情況下,我實際上要做的只是將 bash 腳本內容推送到 Matlab M 代碼中,就像 Cris Luengo 建議的那樣,以便您的 Matlab 腳本控制整個過程。 這個 bash 腳本的功能可以使用system()函數和/或! 構造。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM