BashのMATLAB関数に配列変数を渡す

BashのMATLAB関数に配列変数を渡す

目的

変数と配列変数を設定するために複数のテキストファイルを使用しています。これは、これらの変数に基づいてURLダウンロード文字列を繰り返し生成し、MATLABwebsave関数を使用して温度データをダウンロードするMATLAB関数の入力パラメータです。特に、MATLABスクリプトはparforforループを並列化し、それをコンピューティングクラスタの44コアに分散させるために使用されました。 MATLABは私のラップトップで動作しますが、非常に遅いので、高性能クラスタで実行する必要があります。

質問

bashスクリプトに設定された変数をmatlab関数に渡すのに問題があります。結局私はMATLABコマンドラインにとどまった。 matlab関数呼び出しから変数の周りの一重引用符を削除しようとしましたが、同じエラーが発生しました。

スクリプト

cd CRW_Temp_Profiles

# Set Variables
IFS=$'\r\n' GLOBIGNORE='*' command eval  'LatArray=($(cat Lat.txt))'
IFS=$'\r\n' GLOBIGNORE='*' command eval  'LongArray=($(cat Long.txt))'
IFS=$'\r\n' GLOBIGNORE='*' command eval  'SitesArray=($(cat Sites.txt))'
Site=$(echo ${SitesArray[${SLURM_ARRAY_TASK_ID}-1]})
FileType=".csv"

# Check Variables were read properly
echo 'Site is Number '${Site}
echo 'Row-specific LatLons are:'
echo '    deg N = '${LatArray[${SLURM_ARRAY_TASK_ID}-1]}
echo '    deg S = '${LongArray[${SLURM_ARRAY_TASK_ID}-1]}
echo ' All Lats are'
echo ${LatArray[*]}

# run MATLAB function
module load MATLAB
matlab -nodisplay -nojvm -nodesktop -nosplash -r "try; f_Download_CRW_Temp('$LatArray', '$LongArray', "1985", "2019", '$Site', "44", ".csv"); end; quit;"
module purge

出力およびエラーメッセージ

Site is Number 1
Row-specific LatLons are:
    deg N = -16.5
    deg S = 149.8
 All Lats are
-16.5 -20 -19.5 -11.5 -23.5 -21.5 -31.5 ..... <100 entries of site latitudes> .... 11.2 11.2

                                                                                          < M A T L A B (R) >
                                                                                Copyright 1984-2018 The MathWorks, Inc.
                                                                                R2018b (9.5.0.944444) 64-bit (glnxa64)
                                                                                            August 28, 2018


For online documentation, see https://www.mathworks.com/support
For product information, visit www.mathworks.com.

 try; f_Download_CRW_Temp('-16.5', '149.8', 1985, 2019, '1', 44, .csv); end; quit;
                                                                                   |
Error: Invalid use of operator.

ベストアンサー1

解決策が見つかりました。 matlab関数に文字列変数をパラメータとして入れると、matlabでは二重引用符 ""が表示されますが、1行スクリプトではmatlab呼び出し全体が二重引用符で囲まれているため、エスケープも実行する必要があります。と"\"。したがって、コードは次のようになります。matlab -nodisplay -nojvm -nodesktop -nosplash -r "f_Download_CRW_Temp('$LatArray', '$LongArray', \"1985\", \"2019\", '$Site', \"44\", ".csv"); quit;"

おすすめ記事