Matlab  higher dimensions
Introduction
Matlab supports the use of 1D vectors and 2D matrices. It also copes with higher dimensioned matrices ("ND arrays"), though there are a few surprises. Just as a vector with 4 elements is often described as a 4x1, so a 4x3 matrix could be described as a 4x3x1 (a slice of a 4x3xn block) or even a 4x3x1x1. These singlethickness dimensions are called "singleton dimensions".
The ndims
command returns how many dimensions a matrix has.
It never returns less than 2.
After
m=ones(4,1)
ndims(m)
return 2. After
m=ones(4,2,3)
(which creates a 4x2x3 matrix full of 1s)
ndims(m)
returns 3, though after
m=ones(4,1,1)
ndims(m)
returns 2 because it ignores trailing singleton dimensions. If you create m
in the following way
m=ones(1,1,4)
m
is essentially the same shape as before, but this time ndims(m)
returns 3. You can do
m=squeeze(m)
which removes singleton dimensions after which ndims(m)
returns 2.
Another complication is that
m=ones(4,0)
is legal  it means that m
is empty along one dimension.
Creating ND arrays
We've already seen how ones
can be used to create ND arrays.
zeros
and randn
can be used in the same way. Also
 If you have a 2D matrix you can add dimensions to it.
A=randn(3,4) A(:,:,2) = 5;
makesA
(a 3x4 matrix) into a 3D matrix whose 1st layer is the same as the originalA
and whose 2nd layer is full of 5s. repmat
can replicate through several dimensions. The following creates 24 copies of a 2x2 matrix spread through 3 dimensions.m=repmat([1 2;3 4], [2, 3, 4])
 The
cat
command ("cat" stands for "concatenate") joins a list of arrays along a specified dimension. SoA=randn(3,4) B=cat(3,A,A)
creates a 3D matrix with 2 layers each holding a copy ofA
. ndgrid
 does in N dimensions whatmeshgrid
does in 2 dimensions. It's useful in combination withinterpn
Manipulating ND arrays
There are some new commands to manipulate ND arrays. Often they're generalisations of commands to deal with 2D arrays.
Changing the shape
reshape
works with ND arrays. Also

shiftdim
shifts dimensions, so that (for example) the 1st dimension becomes the 2nd and so on. For examplenewm=shiftdim(m,1)
shifts the dimensions to the left and wraps the dimensions round so that the first becomes the last, andnewm=shiftdim(m,1)
shifts the dimensions to the right, this time padding with singletons. 
permute
rearranges the dimensions as specified by the vector provided newm=permute(m,[3 2 1 4])
You can use this to transpose matrices. 
shiftdata
(there's an inverse,unshiftdata
) shifts data so that it's in the right dimension for certain functions.
Changing the contents

circshift
circularly shifts the values in the array. sov=[1:4;5:8] newv=circshift(v,1)
shifts the values along the 1st dimension. Different dimensions can be selectively shiftedv=[1:4;5:8] newv=circshift(v,[1 2])
shifts the values down 1 and right 2. The following would shift data in the first 3 dimensions ofm
by 0, 1 and 2 respectively.newm=circshift(m,[0,1,2])

flipdim
is a generalisation offlipup
andfliplr
.flipdim(m,1)
is equivalent toflipup(m)
, andflipdim(m,2)
is equivalent tofliplr(m)
.
Taking slices
If you want to take 2D slices from a 3D matrix A
you
can use something like A(:,:,1)
.
Processing ND arrays
Some old commands have been rewritten to cope with ND arrays.
For example, sum
by default sums along the first
nonsingleton dimension. You can make it sum along other
dimensions. So
A=randn(3,4,2) sum(A,3)
sums along the 3rd dimension (i.e. "depth") giving 12 values.
Note that you can't have sparse ND arrays.
An example
Suppose you wanted to calculate the possible outcomes of rolling 2 dice (a red one and a green one, say). You could use
for red=1:6 for green=1:6 outcomes(red,green)=red+green; end end
To add another (blue) die, you could do
oldoutcomes=outcomes; for blue=1:6 outcomes(:,:,blue)=oldoutcomes(:,:)+blue; end
We can now try some simple commands just to check that all is as expected
ndims(outcomes) size(outcomes) numel(outcomes) min (outcomes(:)) max (outcomes(:)) lessthansix=outcomes<6 sum(lessthansix(:))/numel(outcomes) % the chance of getting <6 % Now find the dice values corresponding to these throws. % Note that for ND arrays you need to use ind2sub as well lessthansixindices=find(outcomes<6) [red,green,blue]=ind2sub(size(outcomes),lessthansixindices) % Plot them scatter3(red,green,blue)
See also Mathworks' Multidimensional Arrays and volume visualization pages.