目的
我正在使用多个文本文件来设置变量和数组变量。这些是 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;"