Matlab
From MohidWiki
MATLAB is a numerical computing environment and programming language. Created by the MathWorks, MATLAB allows easy matrix manipulation, plotting of functions and data, implementation of algorithms, creation of user interfaces, and interfacing with programs in other languages.
Contents
How to install Matlab from IST ?
Go to delta.ist.utl.pt and follow the instructions there. You should obtain the license files in your email after you fill up a form.
How to improve performance of Matlab code?
Use the profiler tool. From the Matlab command line type
> profile on > profile clear
then run your program and after it's finished, run the profiler report
> myprogram > profile report
- A good guideline in matlab is to say that if you're using for loops then you're doing it wrong!. Use vectorial operators with your matrices instead and things will go faster.
- It's faster to pass arguments in simple functions rather than using global variables. In general, global variables tend to bog down the performance of Matlab.
- The lesser the number of files and the number of functions, and the faster in general your Matlab code will run.
MOHID and MATLAB
Since release 7.4(R2007a) it supports reading and writing MOHID HDF5 files.
There are several tools available to MOHID users and developers in the SourceSafe database "OtherTools/MatLab". Detailed information of these tools can be found here
How to run matlab from the command line?
Make sure you end the script you want to invoke from the command line with exit (type help exit at the matlab prompt then add exit as the last line in the script).
Windows
Assuming script.m is a valid matlab script that finishes with the exit command, typing from the dos command line
$ matlab -r script(arguments)
will open matlab, execute the script and then exit matlab.
New version of Matlab needs the -wait option, otherwise it may not function properly in batchfiles:
$ matlab -r -wait script(arguments)
Unix
To run matlab in text mode only type:
> matlab -nodesktop -nojvm -nodisplay
To run matlab in background type:
> nohup matlab -nodesktop -nojvm (-nodisplay) < script.m > _matlab.log &
This last line will run matlab in background, execute script.m and kill the matlab process.
How to save a plot in png from the commandline
%testplot.m %Comentarios comecam com "%" %Criamos um array de valores na abscissas x=[0:0.1:3]; %Criamos o array de valores nas ordenadas f(x) = x^3 f = x .* x .* x; %Criamos a figura da funcao f h = plot(x, f); %Gravamos em png para um ficheiro de nome output.png saveas(h, 'output', 'png');
Execute o script acima com a seguinte linha de comandos:
> nohup matlab -nodisplay -nojvm -nodesktop < testplot.m > testplot.log &
Netcdf package
install
Windows
R2010b
Follow the instructions here. Basically, download the snctools package and the netcdf-java package; then add the paths to the matlab paths preferences, then run the tests.
R2007a and R2007b
This installation is described only for the R2007a to R2007b versions of Matlab:
- Prerequisites:
- mexnc R2007a or R2007b
- snctools, (here for snctools wiki article),
- m_map
- Steps:
- Download all the above packages,
- Transfer the netcdf.dll shipped with mexnc to the windows system path,
- Add in the matlab path setup the paths to mexnc,
- Save and restart matlab,
- Open Matlab,
- [OPTIONAL]: to enable opendap, you must install the netcdf toolsUI jar file. Installation instructions are available here.
- [OPTIONAL]: add the path and filename of toolsUI jar file in the classpath.txt in the /toolbox/local directory of your matlab installation,
- Go to the tests folder in snctools and launch test_snctools.m,
- That's it!
For the m_map package instructions go to http://www.eos.ubc.ca/~rich/private/mapug.html. For the high-res coastline and bathymetry datasets goto http://www.eos.ubc.ca/~rich/private/mapug.html#p9.
NOTE: You can check http://mexcdf.sourceforge.net/tutorial/ch02.html for a quick alternative netcdf installation...
NOTE: If the following error occurs, make sure you have installed the netcdf.dll file, shipped with mexnc, in your windows system path:
??? Invalid MEX-file
R12 to R14
This installation is described only for the R12 to R14 versions of Matlab:
- Prerequisites:
- Steps:
- Download all the above packages,
- Copy the dll files from libdap-prerequisites3.7.3 to the ml-structs folder.
- Add in the matlab path setup the paths to ml-structs, matlab_netCDF_OPeNDAP and mexnc R14 or R12,
- Save and restart matlab,
- Open Matlab, go to the tests folder in mexnc R14 or R12 and launch test_mexnc.m,
- Next, go to the tests folder in matlab_netCDF_OPeNDAP and launch test_all.m,
- That's it!
Check out this page for more detailed instructions: http://www.marine.csiro.au/sw/matlab-netcdf.html. For the m_map package instructions go to http://www.eos.ubc.ca/~rich/private/mapug.html. For the high-res coastline and bathymetry datasets goto http://www.eos.ubc.ca/~rich/private/mapug.html#p9.
NOTE: If using Matlab R13, then use the mexnc R12 release and not the mexnc R14 release!
NOTE: If the following error occur during the test_all.m, then edit the compare_mats_getnc.m file at line 45 and replace {} with (). Rerun the test_all.m. That should do it!
Error: File: C:\MATLAB6p5\toolbox\matlab_netCDF_OPeNDAP\test\compare_mats_getnc.m Line: 45 Column: 59 Functions cannot be indexed using {} or . indexing.
NOTE: If the following error occurs, make sure you have installed the netcdf.dll file, shipped with mexnc, in your windows system path:
??? Invalid MEX-file
Unix
- To install the netcdf package you first require to install the netcdf libraries. Get the latest netcdf.tar.gz and unpack them in a temporary directory. Then type:
> ./configure --enable-fortran (--enable-64) --prefix=/usr/local/netcdf --exec-prefix=/usr/local/netcdf
Next edit the macros.make file and add the -fpic option to both CFLAGS and CXXFLAGS
> vim macros.make CFLAGS = -g -O2 -fpic CXXFLAGS = -g -O2 -fpic
Then type make
> make > sudo make install
This will install the netcdf libraries in the /usr/local/netcdf
directory.
- Next, get the latest mexnc.tar.gz files and unpack them the matlab/toolbox temporary directory. Then copy the
mexopts.sh
file from the matlab root directory into the temporary directory and add the following lines at the end:
############################################################################# # # Architecture independent lines: # # Set and uncomment any lines which will apply to all architectures. # #---------------------------------------------------------------------------- NETCDF="/usr/local/netcdf" EXTRA_CFLAGS="-I${NETCDF}/include" EXTRA_CLIBS="-L${NETCDF}/lib -lnetcdf " CFLAGS="-g $CFLAGS ${EXTRA_CFLAGS}" CLIBS="$CLIBS ${EXTRA_CLIBS} " #---------------------------------------------------------------------------- #############################################################################
Then run make:
> make
Finally add the matlab/toolbox/mexnc path to the matlab environment.
- Continuing, to have opendap accessible installation of the opendap client libraries is required:
> yum install libdap > yum install libnc-dap
Usage
snctools
nc_dump
NC_DUMP: a Matlab counterpart to the NetCDF utility 'ncdump'. NC_DUMP(NCFILE) prints metadata about the netCDF file NCFILE. NC_DUMP(NCFILE,VARNAME) prints metadata about just the one netCDF variable named VARNAME.
nc_varget
NC_VARGET: Retrieve data from a netCDF variable. DATA = NC_VARGET(NCFILE,VARNAME) retrieves all the data from the variable VARNAME in the netCDF file NCFILE. DATA = NC_VARGET(NCFILE,VARNAME,START,COUNT) retrieves the contiguous portion of the variable specified by the index vectors START and COUNT. Remember that SNCTOOLS indexing is zero-based, not one-based. Specifying a -1 in COUNT means to retrieve everything along that dimension from the START coordinate. DATA = NC_VARGET(NCFILE,VARNAME,START,COUNT,STRIDE) retrieves a non-contiguous portion of the dataset. The amount of skipping along each dimension is given through the STRIDE vector. NCFILE can also be an OPeNDAP URL if the proper SNCTOOLS backend is installed. See the README for details. NC_VARGET tries to be intelligent about retrieving the data. Since most general matlab operations are done in double precision, retrieved numeric data will be cast to double precision, while character data remains just character data. Singleton dimensions are removed from the output data. A '_FillValue' attribute is honored by flagging those datums as NaN. A 'missing_value' attribute is honored by flagging those datums as NaN. The exception to this is for NC_CHAR variables, as mixing character data and NaN doesn't really seem to work in matlab. If the named NetCDF variable has valid scale_factor and add_offset attributes, then the data is scaled accordingly. EXAMPLE: #1. In this case, the variable in question has rank 2, and has size 500x700. We want to retrieve starting at row 300, column 250. We want 100 contiguous rows, 200 contiguous columns. vardata = nc_varget ( file, variable_name, [300 250], [100 200] );
getnc
> values = getnc(file, varid, -1, -1, -1, -1, change_miss, new_miss);
> x.file = 'fred.nc'; > x.varid = 'foo'; > x.change_miss = 1; > values = getnc(x);