/knkutils

MATLAB utility functions written by Kendrick Kay

Primary LanguageMATLAB

This is a collection of MATLAB utilities developed by Kendrick Kay (kendrick@post.harvard.edu, http://kendrickkay.net).  The philosophy of the code is to maximize power (i.e. the ability to perform many different things) and generality (i.e. the ability to re-use code for many different situations).  Let me know if you have comments.

Some of the code uses random-number generation, so it is recommended that you have something like
  rand('state',sum(100*clock));
  randn('state',sum(100*clock));
in your MATLAB startup.m file.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CHANGE HISTORY

Below we document major code changes.  Minor code changes and tweaks that have no significant impact are not mentioned here (e.g. things like cosmetic adjustments, code speed-ups, making functions more general by adding optional input arguments, fixing bugs that would have result in code crashes, etc.).  Major changes include things that make the code backwards-incompatible and things that change actual analysis results.

History of major code changes:
2018/12/22 - matchfiles.m now RETURNS any duplicate filename matches. This changes past behavior.
2018/12/22 - to resolve function naming conflicts, we have done the following: (1) completely removed the function called count.m, (2) completely removed the function called discretize.m, (3) renamed the function strsplit.m to strsplitalt.m
2014/07/31 - in constructpolynomialmatrix.m, we now make the polynomials orthogonal and unit length. this changes previous behavior!
2013/11/18 - use a smoother canonical HRF in getcanonicalhrf.m
2013/09/07 - fix bug in fitnonlinearmodel (if polynomials or extra regressors were used in multiple runs, then they were not getting fit properly).
2013/08/18 - in makedirid.m, occurrences of '-' are now replaced with '_'
2013/08/18 - in projectionmatrix.m, in the cases of empty <X>, we now return 1 instead of [].
2012/06/14 - in constructpolynomialmatrix2d.m and constructpolynomialmatrix3d.m, we now sort the char representation of the basis functions.  the reason is that previously, different machine architectures would give different orders for the basis functions.  this is horrible, as it means that different machines would have different parameter orders.  the fix (which hopefully is robust) is to sort the basis function character-wise, explicitly.  please be aware of this change!
2012/01/23 - in viewimage.m, no longer make a new window and no longer return the figure number
2011/12/10 - in applymultiscalegaussianfilters.m, we now make the default mode to be 0 (center on pixels).  this changes previous behavior.
2011/10/13 - in pton.m, now always generate a CLUT at 8-bit (256 rows)
2011/10/09 - in fitprfstatic.m, <outputfcn> no longer accepts all those special inputs; it is now a usual OutputFcn.
2011/09/22 - add required argument to copyxform_nii
2011/09/16 - the default behavior in dicomloaddir has changed.  we now match all files and perform numerical sorting.
2011/09/13 - make the yellow color in cmapdistinct slightly darker
2011/08/30 - in fitprf.m, we now use stepwise fitting in the nonlinear case (i.e. <mode> is not 0 nor {0}).  this should improve the avoidance of local minima problems, but does change previous behavior!!
2011/07/11 - in dicomloaddir.m, we now have the extra assumption that all files are DICOM files when <filenameformat> is supplied
2011/07/01 - we now use nanmedian and nanmean in calcmdse.m
2011/06/29 - in printnice.m, we now temporarily change PaperPositionMode to auto before printing.  this should make rasterized image output better (in terms of getting the resolution right).
2011/06/27 - in olsmatrix.m, we now explicitly handle the case of all-zero regressors.  previously, NaNs would result.  now, we just ensure that these all-zero regressors get returned a zero weight.
2011/05/26 - in scatterb.m, we weren't drawing the main line.  weird.  we have changed it now to do the right thing.  this modifies old behavior.
2011/04/26 - in constructorientationfilter.m, fixed major bug. orientation was interpreted wrongly and filters were peaked at the wrong orientation.
2011/04/02 - in matchfiles.m, time-sorting behavior did not work (it would always give alphabetical order).  fixed now.
2011/03/09 - in defineellipse3d.m, we now show a maximum of 25 slices.
2011/03/08 - for alignvolumedata.m, make much faster (using ba_interp3), take less memory, remove spline interpolation option, ensure that the alignvolumedata_auto_outputfcn runs at optimization completion.
2011/03/08 - smoothvolumes handles NaNs intelligently now.  this changes old behavior.
2011/03/06 - complete revamp of calcnoiseceiling.m.
2011/02/24 - in matchfiles.m, we now properly match patterns that have spaces in them (since we now escape the spaces using \).  previous behavior was to simply not match those cases.
2011/02/02 - in zerodiv.m, in the case that y is not a scalar and wantcaution is set to 0, we were allowing division by 0 to result in Inf and *notreplaced with val as desired.  big mistake.  we have now fixed this.  utilities that could have used this buggy behavior of zerodiv include calccod, calccorrelation, calcentropy, calcsparseness, calczscore, l1unitlength, unitlength.
2011/01/21 - in matchfiles.m, we explicitly use MATLAB's sort function (for alphabetical ordering) to ensure consistency across platforms.  this might change the alphabetical ordering of matches!
2010/01/17 - completely change cmapdistinct.m; leave JVM on by default in runmatlabinbg.pl
2010/01/05 - in scatterline.m, we now attempt to use nanmean and nanstd to allow more cases in.  see code for details.
2010/12/27 - in divnorm.m, we now explicitly handle cases where the numerator is Inf.  the goal is to try to keep outputs finite when possible.
2010/12/16 - circlewithin.m changed from binary (all within or not) to a graded response
2010/12/06 - in fitprf.m, change initial seeds for certain basis function cases (in particular, we no longer force weights to 1. it seems that nonlinear fitting can operate successfully even if there is a gain ambiguity)
2010/12/03 - in fitprf.m, changed the form of the input <hrfnormfun> (this requires changes to how the function is called); 
2010/12/02 - in fitprf.m and fitprfmulti.m, a number of significant changes: [<ar> input has been deprecated; <arfile> input has been removed; the <meanint>,<driftstd>,<signalrms>,<noiserms> outputs have been removed (I no longer think they are useful); fix bug --- the signal and drift outputs were not getting assigned in the re-do calls of the [A B C] case of <maxiter>]; removed evaluateprfmodel.m
2010/11/24 - remove hrfsample1, remove hrfsample2 [these were obsolete]
2010/11/23 - in calccod.m, change the output range to percentages (R^2).  thus the range is (-Inf,100]. also, we removed the <wantr> input since it was dumb. also, please note that many functions that rely on calccod.m inherit this change to percentages. thus, this was a big global code change.
2010/10/24 - we now impose assumption in rowfun.m that each result has the same size
2010/10/22 - in fitprf.m, fix bug concerning exitflag and maxiters.  if there were multiple resamplings, then we were checking only the last exitflag when deciding to re-do the fitting process.  now, we do the right thing --- we check to see if any of the resamplings stopped because they reached the max number of iterations.
2010/10/22 - in fitprf.m, change initial seed for prfmodel and hrfmodel basis functions to 0!
2010/10/09 - remove showmulticlass.m
2010/10/05 - fixed bugs in sortnumerical.m.  previous calls may have crashed or failed to produce correct answer.
2010/10/02 - fot defineellipse3d.m, change initial visualization state
2010/10/02 - for fitgaussian3d.m, new default initial seed. more liberal tolerance. explicitly guard against nans.
2010/10/02 - in defineellipse3d.m, the fitted Gaussian no longer has a dc fixed to 0 but has an exponent now.
2010/09/27 - zerodiv.m no longer issues warnings when not <wantcaution>
2010/08/25 - explicitly put /home/knk in queuedaemon.  this should be revisited eventually...
2010/08/25 - for outputfcnplot, we revamped this function [hack out ratio check; hack out <restol>; hack out NaN case for <numiters>]
2010/08/11 - queuedaemon, runme have been revamped and are not backwards-compatible.
2010/06/22 - unix_wrapper.m now reports status and result to the command window.
2010/06/15 - start using calccod.m instead of calccorrelation.m where appropriate (see subspaceapprox, fitprf, fitprfmulti, fitgabor2d, fitorientedgaussian2d, fitrbf2d)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SUMMARY OF FUNCTIONS

Here is a short summary of each function so that you can do a simple text search to see if there is a function that already does what you need.

matrix/
  addvectors - add vectors of unequal sizes
  blob - sum over successive groups along a certain dimension of a matrix
  catcell - concatenate elements of a cell matrix
  catmatrix - concatenate matrices (possibly unequal in size)
  cellfunfirst - apply function to first element of a cell matrix (or the matrix itself)
  cropvalidvolume - extract a subvolume of a matrix based on valid values
  equalizematrixdimensions - make two matrices the same dimensions by expanding
  fillout - repeat a matrix to fill a desired size
  filterout - remove elements of a matrix according to a simple boolean operation
  flatten - make into a row vector
  fillmatrix - take a vector and fill a matrix with it
  flipdims - flip some dimensions of a matrix
  insertelt - insert element(s) in a vector
  placematrix - place a 2D matrix inside another 2D matrix at an arbitrary position
  placematrix2 - place a matrix inside another matrix
  placematrixmulti - repeatedly randomly place a 2D matrix inside another 2D matrix
  reshape2D - get into 2D for convenient manipulation
  reshape2D_undo - undo what reshape2D does
  reshapesquare - reshape a vector into a square matrix
  rotatematrix - 2D rotation for an arbitrary matrix
  sizefull - get size of a matrix for a certain number of dimensions
  splitmatrix - take slices of a matrix and put them into a cell vector
  splitruns - find runs of non-NaN numbers in a vector
  squeezedim - remove a specific dimension that has only one element
  squish - squish together the first n dimensions of a matrix
  upsamplematrix - change the dimensionality of a matrix by upsampling
  vflatten - make into a column vector

indexing/
  calcposition - calculate the position of elements relative to a list
  chunking - split a vector into chunks
  firstel - return first element of a matrix
  firstelc - return first element of a cell matrix
  indexall - return an indexing helper for cell vectors
  lastel - return last element of a matrix
  linspacecircular - get equally spaced points in a circular domain
  linspacefixeddiff - get equally spaced points given a fixed difference
  linspacepixels - get equally spaced points that can be treated as centers of pixels
  matrixindex - return different slices through a matrix based on an indexing matrix
  permutedim - shuffle a matrix along a certain dimension or globally
  picksubset - return a random subset of the elements in a matrix
  removerepeats - get rid of runs of consecutive items
  resamplingindices - get indices corresponding to the process of resampling
  slicematrix - return a slice from a matrix
  subscript - get elements using a vector or cell vector of indices
  vectorsplit - split a vector into chunks

programming/
  allocatememory - force allocation of a certain amount of memory (to induce swapping)
  alwaysone - always return 1
  alwayszero - always return 0
  assignseparatevars - split a matrix and assign it to multiple variables
  assigntobaseworkspace - assign all variables to the base workspace
  checkmemoryworkspace - figure how much memory is being used in the caller's workspace
  checkpathconflicts - check for .m file conflicts
  choose - functional form of if-else
  copymatrix - make a copy of a matrix with a subscript assignment on-the-fly
  consolidatemat - consolidate results from multiple .mat files into a single .mat file
  consolidatematdir - consolidate results from .mat files in a directory
  decodenum - undo encodenum.m
  defaultoptimset - return a default optimset options structure
  encapsulate - evaluate a function at multiple values and encapsulate results into a cell vector
  encodenum - encode a number as a string of uppercase letters
  enforcenan - set cases with all 0 to NaN
  evalme - evaluate multi-line input in the MATLAB workspace
  gethostname - get the hostname
  getpid - get the process ID for this instance of MATLAB
  gettimestring - return the current date/time as a simple integer string
  GPUconv - convert to GPU format
  GPUok - return whether we should try to use the GPU
  gunziptemp - gunzip a file on the fly
  identity - return an argument unchanged
  infiniteloop - do nothing forever
  inputmulti - take multi-line string input from stdin
  isfinitenum - evaluate whether each element is finite and numeric
  isint - evaluate whether each element is an integer
  isrowvector - evaluate whether matrix is 1 x n (where n >= 0)
  maketempdir - make a new empty temporary directory and return the path to it.
  mergestructs - merge one struct into another
  mkdirquiet - make a directory, suppressing warnings
  mtimesmulti - multiply arguments together
  passmulti - pass multiple arguments to a function from a cell vector
  pause2 - pause but also return an output
  playalarm - play an alarm to get the user's attention
  plusmulti - add arguments together
  processchunks - perform an operation on successive chunks of a big matrix to save on memory usage
  promptforfile - get a .mat file name from the user
  repeatuntil - call a function until a condition is satisfied
  reportmemoryandtime - use a warning to report the current memory usage and the current time
  rmdirquiet - remove a file or directory, suppressing warnings
  rowfun - apply a function to each row of a 2D matrix
  runmatlabinbg.pl - run MATLAB in the background for a single function/script call
  saveemptymat - save an empty .mat file
  setrandstate - induce randomness by (randomly) setting the seed of rand and randn
  sgerun2 - run MATLAB code using the Sun Grid Engine (SGE)
  statusdots - write out dots (.) indicating progress of code execution
  subsetfun - apply a function to successive subsets of a vector
  swap - swap two arguments
  unix_wrapper - a nice wrapper for unix.m

string/
  cell2str - convert 2D cell matrix into string representation
  cell2str2 - convert cell vector of strings into a single string that names each string
  fixstr - fix string for use with MATLAB's figure functions
  makedirid - return a string with elements of a path joined with '_'
  makeletters - generate a cell vector of letter characters
  mat2cellstr - convert a matrix of numbers into a cell matrix of strings
  matchword - return the first word found in a string
  randomword - generate a random word consisting of capital letters
  sortnumerical - sort a cell vector of strings according to trailing integers
  strsplitalt - split a string based on a pattern

io/
  absolutepath - return the absolute path to a given file
  clearexcept - clear all variables except certain variables
  getextension - get the extension (e.g. '.txt') of a filename
  loadbinary - load numbers from a binary file
  loadexcept - load variables from a .mat file, excluding certain variables
  loadmaybe - load variable from a .mat file, but failing gracefully
  loadmulti - concatenate or merge a single variable from multiple .mat files
  loadmulti2 - load multiple variables from one .mat file
  loadtext - load strings from a text file
  matchfiles - return strings containing paths to matched files and/or directories
  multifile - apply a function to multiple files
  niiload - load specific voxels from NIFTI files containing 4D data
  raw2dload - load specific columns from binary files containing 2D data
  savebinary - save numbers to a binary file
  saveexcept - save all variables to a .mat file, excluding certain variables
  savetext - save strings to a text file
  shuffletext - shuffle lines in a text file
  stripext - remove the extension from a file name
  stripfile - remove the file name from a string

math/
  addnoise - add some noise to a matrix
  allzero - check whether all elements are equal to zero within some tolerance
  ang2complex - convert angles to unit-magnitude complex numbers
  chunkfun - apply a function to successive chunks of a vector
  chunknormalize - subtract mean of successive chunks of a matrix
  calccod - calculate coefficient of determination (R^2)
  calccodcell - calccod for cell vectors of matrices
  calccorrelation - calculate Pearson's correlation coefficient (r)
  calcmdse - calculate the median and the standard error on the median
  calcmdsepct - calculate the median and percentiles on bootstraps of the median
  calcsparseness - calculate sparseness
  calczscore - convert to z-scores
  circularavg - average numbers, respecting circularity
  circulardiff - difference between two values defined in a circular domain
  circularshiftandsum - take a vector, circularly shift it multiple times, and sum
  clipoutliers - clip the outliers of a matrix
  constructpathonsphere - connect points on the unit sphere
  countinstances - count how many 1s, 2s, etc. are in a matrix
  divnorm - apply divisive normalization to a matrix
  matchgain - figure out scalar factor to match one set of data to another
  meanandse - calculate the mean and standard error
  meancell - take the mean for data that are split into cell matrices
  mod2 - like mod.m but return 0 outputs as the modulus itself
  mod4 - like mod.m but restrict outputs to the range [-modulus/2,modulus/2]
  mtimescell - do matrix multiplication but with an argument split into a cell vector
  nanreplace - replace NaNs with a specified value
  nanreplace2 - replace NaNs with a specified value (alternative mode of operation)
  nantoclosest - replace NaNs with the nearest valid values
  negrect - negative-rectify
  negreplace - replace negative values with a specified value
  normalizerange - scale to fit within a specific range
  normalizemax - scale such that max value is 1
  posnegrect - positive- and negative-rectify
  posrect - positive-rectify
  restrictrange - truncate values to fit within a range
  robustrange - calculate a robust range of a set of values
  signedarraypower - take the array power but preserve sign
  signforce - return +1 for positive or zero elements; -1 for negative elements
  stdquartile - return something like std but in the percentile sense
  unitlength - normalize to have unit length (L2-norm is 1)
  unitlengthfast - normalize to have unit length (L2-norm is 1)
  l1unitlength - normalize to have unit length (L1-norm is 1)
  vectorlength - calculate vector length (L2-norm)
  l1vectorlength - calculate vector length (L1-norm)
  zerodiv - divide but with special handling for division by zero
  zeromean - subtract off the mean

stats/
  applyfiltermultidim - apply filters for the case of images with multiple features
  bootstrap - apply a function to bootstrap samples drawn from a vector (useful for computing standard error)
  bootstrapdim - more general version of bootstrap
  calcconfusionmatrix - calculate a confusion matrix (i.e. covariance, cross-product, etc.)
  calcentropy - calculate entropy based on a matrix with counts
  calcggaussianlikelihood - calculate likelihood of a set of points assuming independent generalized Gaussian distributions
  calcintrinsicdim - calculate number of eigenvectors needed to achieve a certain amount of the variance in a matrix
  calcmutualinformation - calculate mutual information between two matrices
  calcmutualinformationcontinuous - calculate mutual information between two matrices in a continuous way
  calcnoiseceiling - calculate how well a set of data can be predicted, taking into account the intrinsic noisiness of the data
  calcoptimalhistbins - calculate the optimum number of bins to use for hist.m
  calcrbflikelihood - calculate likelihood of a set of points given a collection of RBFs
  calcrectlikelihood - calculate likelihood of a set of points given a collection of directions (half-squared responses)
  calcridgeregressionlambda - determine lambda parameter for ridge regression in a controlled way
  calcrobustsummary - calculate the median and one-half of the central 68% range
  calcsurfaceareanball - calculate surface area of a unit n-ball
  centerofmass - calculate the center-of-mass of a matrix
  constructdctmatrix - construct a matrix with DCT-II basis functions in the columns
  constructdftmatrix - construct a matrix with DFT basis functions in the columns
  constructfiltersubsample - construct 2D filters according to a subsampling scheme
  constructfiltertiling - construct filters by tiling a single 2D filter
  constructpolynomialmatrix - construct a matrix with polynomials in the columns
  constructpolynomialmatrix2d - evaluate polynomial basis functions defined in 2D at some locations
  constructpolynomialmatrix3d - evaluate polynomial basis functions defined in 3D at some locations
  evaldivnorm - evaluate divisive-normalization function at some values
  evalgaussian1d - evaluate 1D Gaussian function at some coordinates
  evalgaussian2d - evaluate 2D Gaussian function at some coordinates
  evalgaussian2doriented - evaluate 2D Gaussian function (that can be rotated) at some coordinates
  evalgaussian3d - evaluate 3D Gaussian function at some coordinates
  evalgeneralizedgaussian - evaluate generalized Gaussian pdf
  filter2subsample - apply filter2 and then subsample the result
  findlocal - find points that are close to a given point
  findtailthreshold - determine a threshold for a distribution of data using a GMM with 2 Gaussians
  fit2dpolynomialmodel - use polynomial basis functions to fit a surface defined in 2D, allowing scale factor for different cases
  fit3dpolynomialmodel - use polynomial basis functions to fit a surface defined in 3D, allowing scale factor for different cases
  fit3dpolynomialmodel2 - use polynomial basis functions to fit a surface defined in 3D, allowing DC offset for different cases
  fitdivnorm - fit divisive-normalization function
  fitgaussian1d - fit 1D Gaussian function
  fitgaussian2d - fit 2D Gaussian function
  fitgaussian2doriented - fit 2D Gaussian function that can be rotated
  fitgaussian3d - fit 3D Gaussian function
  fitl1line - perform linear regression but use an L1-error metric 
  fitline2derror - fit a line to a set of 2D points using an error metric that is sensitive to both x and y
  fitnonlinearmodel - a useful wrapper around MATLAB's lsqcurvefit.m function
  fitnonlinearmodel_consolidate - consolidate .mat files written by fitnonlinearmodel
  fitnonlinearmodel_helper - a helper function for fitnonlinearmodel.m
  fitrbfpdf - fit a simplified mixture-of-Gaussians probability density function model using k-means
  fitrectpdf - fit a rectified squared model using k-means and interpret as a PDF
  fitrectdensity - fit a rectified squared model using k-means and interpret more like ANN
  gradientdescent - perform gradient descent or forward stagewise regression
  gradientdescent_wrapper - perform n-fold averaging technique for gradientdescent.m
  localregression - given a degree, kernel, and bandwidth, use local regression to predict values (surface defined on one dimension)
  localregression2d - given a degree, kernel, and bandwidth, use local regression to predict values (surface defined on two dimensions)
  localregression3d - given a degree, kernel, and bandwidth, use local regression to predict values (surface defined on three dimensions)
  localregression4d - given a degree, kernel, and bandwidth, use local regression to predict values (surface defined on four dimensions)
  localregressionbandwidth - cross-validate to determine the optimal bandwidth for local regression
  olscontrol - perform ordinary least-squares regression while controlling for some given regressors
  olsmatrix - perform ordinary least-squares regression
  olsmatrix2 - perform ordinary least-squares regression (fast mode)
  outputfcnplot - plot parameter history during an optimization
  outputfcnsanitycheck - explicit check on the size of the residuals to prevent infinite computation
  performfreqwhitening - flatten the average amplitude spectra of a set of images
  performpcawhitening - whiten a matrix in the PCA sense
  projectionmatrix - project out a linear subspace using ordinary least-squares regression
  randgg - generate random numbers from a generalized Gaussian
  randintrange,randintrange2 - randomly choose integers within a given range
  randnmulti - generate random numbers from a multivariate Gaussian
  randomization - calculate p-values using randomization
  randomorthogonalbasis - generate a random set of orthogonal basis functions
  resamplingtransform - a utility function to deal with cross-validation ordering as used in fitnonlinearmodel.m
  roundpvalue - round p-value up to have the form Xe-Y
  runkmeans - run the k-means clustering algorithm
  subspaceapprox - calculate correlation between a subspace and a vector

timeseries/
  calcpeak - calculate the peak of some time-series data (using interpolation)
  constructbutterfilter1D - construct a Fourier-domain Butterworth filter
  conv2run - convolve but keep runs separate
  deconvolvevectors - deconvolve one vector from another vector
  fouriertospace1D - convert magnitude filter in Fourier domain to the space domain
  generatepinknoise1D - generate samples of pink noise
  processmulti1D - apply a function that expects a single vector to multiple vectors
  sincshift - shift time-series data using sinc interpolation and padding
  tseriesinterp - interpolate time-series to achieve a new sampling rate
  tsfilter - filter time-series data with a Fourier-defined magnitude-based filter

imageprocessing/
  applymultiscalegaborfilters - filter images with a set of multi-scale Gabor filters
  applymultiscalegaussianfilters - filter images with a set of multi-scale Gaussian or Difference-of-Gaussians filters
  ba_interp3_wrapper - convenient wrapper for the 3D interpolation toolbox ba_interp3
  calcamplitudespectrum - calculate a smooth function relating spatial frequency to amplitude
  calccpfov - return number of cycles per FOV associated with fft2 after fftshifting
  calccpfov1D - return number of cycles per FOV associated with fft after fftshifting
  calccpfov3D - return number of cycles per FOV associated with fftn (in three dimensions) after fftshifting
  calcimagecoordinates - return coordinates of the pixels of an image
  calcpositiondifferentfov - determine the coordinates of a new image with respect to an original image
  calcunitcoordinates - return coordinates of points equally spaced within the square bounded by -.5 and .5
  checkimagesize - inspect pixel dimensions of a batch of image files
  chtoim - reshape image(s) from images x res*res to res x res x images
  concatimages - concatenate multiple images together
  constructbutterfilter - construct a Fourier-domain Butterworth filter (for images)
  constructbutterfilter3D - construct a Fourier-domain Butterworth filter (for volumes)
  constructcosinefilter - construct a Fourier-domain cosine-tapered filter
  constructorientationfilter - construct a Fourier-domain orientation filter (von Mises distribution)
  constructsmoothingfilter - construct a space-domain 2D or 3D Gaussian filter
  constructwhiteningfilter - construct a Fourier-domain whitening filter
  detectedges - detect edges in an image using simple scheme
  evaldog2d - evaluate 2D Difference-of-Gaussians function at some coordinates
  evalgabor2d - evaluate 2D Gabor function at some coordinates
  evalgrating2d - evaluate 2D sinusoidal grating function at some coordinates
  evalorientedgaussian2d - evaluate oriented 2D Gaussian at some coordinates
  evalrbf2d - evaluate 2D radial basis function at some coordinates
  extractwindow - easily pull out different chunks of an image
  fitgabor2d - fit 2D Gabor function
  fitorientedgaussian2d - fit oriented 2D Gaussian
  fitrbf2d - fit 2D radial basis function
  fftshift2 - apply fftshift along the first two dimensions
  flattenspectra - apply spatial frequency filtering to flatten the spectra of some images
  fouriertospace - convert magnitude filter in Fourier domain to the space domain
  gabortransform - perform Gabor transformation on one or more images
  generatepinknoise - generate samples of pink noise
  generaterandomphase - generate random phases suitable for multiplication with output of fft2
  generatewinnermap - compress multidimensional data by using hue and brightness to represent the maximum value along a dimension
  getsamplebrain - return a brain volume
  getsampleimage - return a 500x500 grayscale natural image
  ifftshift2 - apply ifftshift along the first two dimensions
  imagefilter - filter images with a Fourier-defined magnitude-based filter
  imagefilter3D - filter volumes with a Fourier-defined magnitude-based filter
  imagesearch - search through image space to minimize some cost function
  imagesequenceconcatenate - concatenate multiple image files together
  imagesequencetomovie - make a QT movie from images
  imaveragefiles - average multiple image files together
  imcropfiles - manually define a crop region and then apply to one or more image files
  imreadmulti - load in multiple images
  imrectsquare - enforce square and integer crop to an imrect
  imresizedifferentfov - resize an image but use a different field-of-view
  imresizememory - call imresize on a bunch of images, minimizing memory usage
  imwritemulti - write multiple images to multiple files
  imtoch - reshape image(s) from res x res x images to images x res*res
  makecircleimage - draw a circle as an image
  makecolorimagestack - convert a 4D matrix containing multiple color images into a 3D matrix
  makeconcentricgrating2d - make a concentric 2D sinusoidal grating
  makedog2d - make a 2D Difference-of-Gaussians
  makegabor2d - make a 2D Gabor
  makegaussian2d - make a 2D Gaussian
  makegaussian3d - make a 3D Gaussian
  makegrating2d - make a 2D sinusoidal grating
  makegratings2d - make a set of 2D sinusoidal gratings
  makeimagestack - convert a 3D matrix containing multiple images into a 2D matrix
  makeimagestack_wrapper - run makeimagestack for multiple 3D matrices
  makeimagestack3dfiles - like makeimagestack but write out some convenient .png files
  makeorientedgaussian2d - make an oriented 2D Gaussian
  makesquareimage - draw a square as an image
  maskmultiscalegaborfilters - modify results of applymultiscalegaborfilters according to a binary mask
  phasescrambleimage - blend image with random-phase image
  placeimageintosquare - place an image anywhere within another image
  processimages - perform some function on many image files
  processmulti - apply a function that expects a single image to multiple images
  scrambleimage - scramble an image, preserving chunks of a certain size
  smoothvolumes - use a Gaussian filter to smooth one or more 3D volumes
  socmodel - compute the response of the SOC model to some stimuli
  splitimages - split images into chunks
  unitlengthfft2 - unit-length-normalize a Fourier domain filter
  varycontrast - vary the contrast of an image
  viewimage - do some visualizations for a given image
  viewimages - visualize many images at once
  viewmovie - view a series of images as a movie (or write a series of image files)
  visualizemultiscalegaborfilters- visualize points associated with applymultiscalegaborfilters

figure/
  addlogticks - add logarithmic ticks to a figure whose data have already been log-transformed
  axissquarify - make axis equal-aspect, square, and origin-centered and draw unity line
  errorbar2 - draw error bars (as lines)
  errorbar3 - draw error bars (as a polygon)
  figureprep - make an invisible figure window
  figurewrite - write the invisible figure window to an image file
  getcolorchar - take an integer and get a color character
  getfigurepos - return figure position (in normalized units)
  hist1dimage - draw a histogram as a vertical 1D image
  histrobust - run hist but ensuring a robust range
  imageactual - draw an image at its native resolution
  imagescmulti - make separate figure windows for multiple images
  plotorientedbar - plot an oriented bar
  plotrectangle - plot a rectangle
  printnice - print figure window to file
  setaxispos - set axis position (without mangling the Units setting)
  setfigurepos - set figure position (without mangling the Units setting)
  scatterb - do a binned scatterplot
  scatterline - use local linear regression to summarize a scatterplot
  scattersparse - do a scatterplot but limit the number of points
  scatterimagesparse - do a image scatterplot and limit the number of points
  squarify - figure out a roughly evenly balanced number of rows and columns necessary to fit a certain number of elements
  straightline - draw horizontal or vertical lines
  subplotresize - make the subplots of a figure as big as possible

colormap/
  cmapang - hue-based colormap suitable for circular ranges (e.g. angles)
  cmapangLR - like cmapang.m but left-right flipped
  cmapangLVF - like cmapang.m but focused on the left visual field
  cmapangRVF - like cmapang.m but focused on the right visual field
  cmapdistinct - hue-based colormap for cases where you want maximally distinct colors
  cmaplookup - take values and get colors from colormap
  cmaphue - hue-based colormap suitable for circular ranges
  cmapsign - blue-black-red colormap suitable for ranges like [-X X]
  cmapsign2 - blue-white-red colormap suitable for ranges like [-X X]
  cmapsign3 - blue-lightgray-red colormap suitable for ranges like [-X X]
  cmapsign4 - cyan-blue-black-red-yellow colormap suitable for ranges like [-X X]
  colorinterpolate - make a colormap by interpolating between key colors
  drawcolorbar - draw a colorbar on the current figure
  drawcolorbarcircular - draw a circular colorbar on the current figure

graphic/
  calcdistpointline - calculate the distance between one or more points and a line
  circlewithin - determine whether one or more circles are contained within a certain circle
  coordangle - calculate coordinates of an angle
  coordpolygon - calculate coordinates of an equilateral polygon
  createrescalingmatrix - construct a transformation matrix that rescales with respect to (0.5,0.5,0.5)
  defineellipse3d - allow user to define a 3D ellipse on a 3D volume
  drawarrow - draw an arrow (in two dimensions)
  drawbar - draw an oriented bar
  drawbars - draw a set of oriented bars
  drawbartexture - draw a random array of oriented bars
  drawcheckerboard - draw an oriented checkerboard
  drawcheckerboards - draw a set of oriented checkerboards
  drawclosedcontour - draw a generic closed contour shape
  drawclosedcontours - render several closed contours
  drawdartboard - draw a radial checkerboard (dartboard)
  drawellipse - draw a complete or partial ellipse (includes circles and arcs as special cases)
  drawmultiscale - place objects at multiple scales on a pink-noise background
  drawpolargrid - draw a polar grid consisting of rings and spokes
  drawrectangle - draw a rectangle
  drawsector - draw a sector
  drawtext - draw a word
  drawtexts - render several words
  renderfigure - render the current figure into an image (assumed to be square)
  xyzscale - construct a scaling transformation matrix
  xyztranslate - construct a translating transformation matrix
  xyzrotate_* - construct a rotation transformation matrix
  xyzrotatetoz - return rotation transformation matrix to align a vector with positive z-axis

mri/
  calchrfpeak - estimate the peak (positive or negative) value of an HRF
  changevolumeres - change the resolution of a volume while preserving field-of-view
  computetemporalsnr - compute the stability of a series of 3D volumes over time
  constructhrfmodeldct - return a matrix of DCT-II basis functions for modeling HRFs
  constructhrfmodeldelta - return a matrix of delta basis functions for modeling HRFs
  constructhrfmodelspline - return an spline-based HRF model
  constructstimulusmatrices - construct design matrix for a finite impulse response (FIR) model
  copyxform_nii - propagate transformation-related fields from one NII file to others
  coregistervolumes - coregister one volume to another
  createspmmatrix - return the default SPM transformation matrix
  dicomloaddir - load volumes and voxel-size information from a DICOM directory
  evaldoublegamma - evaluate double-gamma function at some x-values
  expdesignefficiency - calculate efficiency of an experimental design
  fmriquality - write figures to inspect the spatial quality of fMRI volumes
  fstoint - go from FreeSurfer space to our internal space
  getcanonicalhrf - return a canonical HRF (based on empirical data) for arbitrary duration and TR
  getsamplehrf - return some sample HRFs estimated from actual fMRI data
  homogenizevolumes - homogenize a set of 3D volumes by dividing by fitted 3D polynomials
  inttofs - go from our internal space to FreeSurfer space
  motioncorrectvolumes - perform motion correction for some volumes
  preconditionvolume - precondition a 3D volume by clipping outliers and removing low-frequency signal variations
  quantifymotionparameters - compute an intuitive summary metric of rigid-body motion during a run
  settr_nii - set the TR in the header information of an NII structure
  surfaceslice2 - figure out information relating voxels to vertices
  undistortvolumes - resample volumes in order to correct for motion and distortion
  write3dstack - write out extracted slices in three orientations from a 3D matrix
  writespmfiles - write a series of volumes to individual SPM/ANALYZE files

pt/
  calcfixationdotchangeperformance - perform analysis of behavioral data for experiments involving dot change detection
  preparedigits - generate some digits and letters as uint8 images
  pton - initialize PsychToolbox stuff
  ptoff - uninitialize PsychToolbox stuff
  ptviewimage - show one or more images and allow user to position the images
  ptviewmovie - show a stimulus movie
  ptviewmoviecheck - check the results of ptviewmovie.m
  runretinotopy - script for retinotopy experiment
  showmulticlass - helper function for various experiments

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COPYRIGHT

Copyright (c) 2013, Kendrick Kay
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.

The name of its contributors may not be used to endorse or promote products 
derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.