在 Bash 中将数组变量传递给 MATLAB 函数

在 Bash 中将数组变量传递给 MATLAB 函数

目的

我正在使用多个文本文件来设置变量和数组变量。这些是 MATLAB 函数的输入参数,该函数根据这些变量迭代创建 url 下载字符串,然后使用 MATLABwebsave函数下载温度数据。值得注意的是,MATLAB 脚本用于parfor并行化 for 循环并将其分布在计算集群上的 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 调用都在双引号中,因此您还必须转义参数特定的 double用“\”引号。所以代码看起来像:matlab -nodisplay -nojvm -nodesktop -nosplash -r "f_Download_CRW_Temp('$LatArray', '$LongArray', \"1985\", \"2019\", '$Site', \"44\", ".csv"); quit;"

相关内容