I find the handling of strings and structures in MATLAB to be completely arbitrary and the documentation on it to be too terse. The following are conventions that I have figured out or other people have explained to me.
1) Suppose you do a bunch of calculations and you end up with result variables with names like precipensondjfmacor, precipensondjfmareg, sfctemppnandjfmacor, and sfctemppnajasreg; and you would like to plot these fields and write them out as PostScript files. You need a way to convert the variable names into strings that can be used in figure titles and as output filenames.
eval( [ 'a=' string ';' ] ) will execute the command "a = precipensodjfmacor;" in Matlab.
A second example is how to get Matlab to do something outside of the
matlab session. Say you wanted to delete a file from within
Matlab:
eval( [ '!/bin/rm ' string ';' ] )
will delete the file "precipensodjfmacor"
2) An application of "eval."
"Eval" can be used to access the contents of a variable. An example
of this is
variablename = 'summertemperature'.
eval(variablename) yields the contents of variablename, which is
'summertemperature.' This is useful in a subroutine call where you want to pass numbers and
not just a variable name.
subroutine( varname ) will crash
subroutine( eval(varname) ) will pass the variable
'summertemperature'
3) Arguments to the print function.
Continuing on with using string = 'precipensondjfmacor', let's
say that you want to print out this analysis using the print
function.
print( '-dpsc2', sprintf( '%s.ps', string ) );
will create the PostScript file 'precipensondjfmacor.ps' (no quotes). It appears that the inputs to the print function need to be
strings, for example, '-dpsc2' requires the single quotes.
4) Decoding time
Time in netcdf files can be written as so many units since some reference time. An example of a reference time is January 1st, 1999, which is written as "1999-01-01 0:0:0". The time variable "time" can be written in days, hours, seconds, or something else.
The Matlab functions datevec and datenum can be used in the following manner to convert from time in some silly units to a vector of the year, month, day, hour, minute, and second:
datevec( time + datenum([1999,01,01,0,0,0]) )
where "time" is the time variable. The datenum output and datevec input are both hours so "time" has to be in units of hours.
Example: Convert 17288910 seconds since 1999-01-01 0:0:0 into years,
months, days, ... :
datevec( 17288910/60/60/24 + datenum( [ 1999 1 1 0 0 0 ] ) )
yields:
1999 7 20 2 28 30
which is 2:28 AM and 30 seconds on the 20th of July, 1999.
Guillaume Mauger showed me this trick.
5) Creating a structured array. An example:
c = struct( 'pre1', pre1, 'pre2', pre2 ) yields
c = pre1: [400x1440 double] pre2: [400x1440 double]
6) Modifying/changing the value in a structured array
Suppose you read in the header of a netCDF file with
ncinfo, info = ncinfo( filename.nc ); . "info" will be a
structured array with a mix of character and numerical data.
The number of latitudes, longitudes, and time values is stored in
info.Dimensions.Length . To change the number of latitudes, use
info.Dimensions(1).Length = new_value, where the (1) specifies
that it is the latitude dimension you are changing.
7) Converting numbers in cells to numbers: number = cell2mat(cell_variable)
8) Try something (process A), and do something else (process B) if it fails.
try
process A
catch
process B
end