I want to write a batch file that calls sequentially 2 m-files. I want the second m-file (f.m) not to start before the end of the first m-file (main.m). The second m-file is repeated 4 times (4 tasks).
I have tried to use the wait option as below but it does not work.
#$ -S /bin/bash
#$ -l h_vmem=2G
#$ -l tmem=2G
#$ -cwd
#$ -j y
#$ -N example
#$ -t 1-4
echo "Task ID is $SGE_TASK_ID"
matlab -wait -nodisplay -nodesktop -nojvm -nosplash < main.m
matlab -nodisplay -nodesktop -nojvm -nosplash < f.m
What am I doing wrong?
You can either concatenate the contents of main.m and f.m together prior to piping them to MATLAB
cat main.m f.m | matlab -nodisplay -nodesktop -nojvm -nosplash
Or you can call the scripts by passing a command to MATLAB using the -r flag
matlab -nodisplay -nodesktop -nojvm -nosplash -r 'main; f; exit'
These are both going to be more performant than your approach since here we're only launching one instance of MATLAB.
Related
I am using slurm to submit jobs to the university supercomputer. My matlab function has one parameter:
function test(variable_1)
and my slurm file is (I am not sure if it is correct. I know how to define the value of the parameter in the slurm file, but I would like to pass the value to the slurm file as I need to run the matlab function many times with different values for the parameter):
#!/bin/bash -l
#SBATCH --time=2-00:00:00
#SBATCH --job-name="test"
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --mem=4gb
#SBATCH -p small
module load matlab/R2021a
matlab -nodisplay -nodesktop -nosplash -r "test variable_1"
I tried to use the following codes (for example, I would like to set variable_1=12) to submit the job but it did not work.
sbatch test.slurm 12
Can anyone help me with this issue? Thanks!
The first argument of the Bash script is stored in an environment variable named $1. So the last line of the script should be
matlab -nodisplay -nodesktop -nosplash -r "test $1"
Beware that if the argument is a number, you might need to first cast it to integer from string with str2num in your Matlab script.
I run a script in folder
C:\SVN\myscripts\tst1.m
with following command on cmd.exe( Win 7)
"C:\Program Files\MATLAB\R2013b\bin\matlab.exe" -nosplash -nodesktop -wait -minimize -r "tst1"
This executes fine. However, as mentioned in the "help" document, I can specify multiple scripts/functions like
"C:\Program Files\MATLAB\R2013b\bin\matlab.exe" -nosplash -nodesktop -wait -minimize -r "tst1, exit"
This worked too.
However, if the same is done on startup.m file( my own file which sets some paths before calling some other Matlab Scripts) that is located as
C:\SVN\myscripts\StartupScript\startup.m
in following manner( after changing pwd to above folder):
"C:\Program Files\MATLAB\R2013b\bin\matlab.exe" -nosplash -nodesktop -wait -minimize -r "startup, exit"
The Startup.m does execute all its contents sucessfully, but at the end of it, I get following message :
Undefined function or variable 'startup'.
and Matlab returns the control to command prompt with non zero exit code.
Any reasons for this kind of behavior.
Thanks
sedy
I am using slurm sbatch to parralel launch a matlab function on a cluster.
What is the proper syntax in my sbatch file in order to assign numeric parameters to the matlab function?
I have tried the following (and alike s):
#!/bin/bash
#SBATCH --partition=debug
#SBATCH --time=0-00:15:00
#SBATCH --cpus-per-task=12
#SBATCH -n1
VAR1=50
VAR2=40
BASE_MFILE_NAME=RUNAGT
MATLAB_MFILE=.m
srun --exclusive --cpus-per-task=12 matlab2013b/bin/matlab -nodesktop -nosplash -nodisplay -r "RUNAGT(${SLURM_ARRAY_TASK_ID},VAR1,VAR2);exit" -logfile testV${SLURM_ARRAY_TASK_ID}.log &
wait
${SLURM_ARRAY_TASK_ID} is working but matlab does not recognize VAR1 and VAR2.
error: Undefined function or variable 'VAR1'.
I believe it is not reading your variables because you are not putting a $ in front of them. You srun line should be:
srun --exclusive --cpus-per-task=12 matlab2013b/bin/matlab -nodesktop -nosplash -nodisplay -r "RUNAGT(${SLURM_ARRAY_TASK_ID},${VAR1},${VAR2});exit" -logfile testV${SLURM_ARRAY_TASK_ID}.log &
I'm running matlab jobs on a remote server. The documentation says to run 'script.m', use the following command:
bsub -o script.out -R "rusage[matlab=1:duration=1]" matlab -nodisplay script
This doesn't seem to do much (or anything).
However,
bsub -o script.out -R "rusage[matlab=1:duration=1]" matlab -nodisplay -r "script"
works though. Any idea why the -r and quotation marks were omitted in the documentation? Was this simply a mistake, or am I misunderstanding something.
That looks just plain wrong to me, MATLAB has always needed the -r option to run a script.
I'm trying to run MATLAB scripts from command-line and am having problems getting MATLAB to return results to stdout.
When running the following command, MATLAB prints the license banner and exits without printing the message.
matlab -nodisplay -nojvm -r "fprintf(1, 'value: %f\n', 2.0); quit;"
*note: I am currently running Version 7.10.0.499 (R2010a) 64-bit (maci64)
As was shown in this related post, you can use the -logfile option to make a copy of all outputs to a file.
matlab -nodisplay -nojvm -logfile out.txt -r "fprintf(1, 'value: %f\n', 2.0); quit;"
On Windows, use the -wait command-line options to block the execution of your script until MATLAB closes.
On Unix, you can use sleep 5s to sleep for 5 seconds, or use the wait command to pause execution until the process finishes:
#!/bin/sh
matlab -nodisplay -logfile out.txt -r "rand(3), quit"
wait $(ps | grep matlab | awk '{print $2}') && cat out.txt