목적
변수와 배열 변수를 설정하기 위해 여러 텍스트 파일을 사용하고 있습니다. 이는 이러한 변수를 기반으로 URL 다운로드 문자열을 반복적으로 생성한 다음 MATLAB websave
함수를 사용하여 온도 데이터를 다운로드하는 MATLAB 함수에 대한 입력 매개 변수입니다 . 특히 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 호출이 큰따옴표로 묶여 있으므로 이스케이프도 수행해야 합니다. 와 함께 "\". 따라서 코드는 다음과 같습니다.matlab -nodisplay -nojvm -nodesktop -nosplash -r "f_Download_CRW_Temp('$LatArray', '$LongArray', \"1985\", \"2019\", '$Site', \"44\", ".csv"); quit;"