Department of Engineering

IT Services

Matlab cells and structs

Matlab uses vectors heavily. Matlab vectors are like arrays in fortran or C++ - the elements are all the same type and are indexed using numbers. But there are other ways to organise data structures in matlab

Structs

In C/C++ and newer fortrans one can bundle together elements of various types into a structure. This helps keep the code tidy - e.g. if your program deals with information about people (names, heights, etc) it makes sense to gather together all the info about a person into one variable.

 tpl = struct ('forename', 'Tim', 'surname', 'Love', 'height', 1.73)

creates a variable called tpl containing 3 parts (called 'fields') that can be individually accessed - e.g. tpl.height=1.75; is possible. If you write a function that needed all the information about tpl you just pass tpl as an argument, which is much tidier than passing a list of values. Typing

   isstruct (tpl)

will check whether tpl is a struct. Typing

   fieldnames (tpl)

will list the fields. Doing

   tpl2=setfield(tpl,'weight',98)

will create a new variable with an extra field, and

   tpl3=rmfield(tpl,'height')

will will create a new variable with a field less.

Cells

Like structs, cell arrays can contain dissimilar elements. Unlike structs, the elements are indexed by number. So

   tplcell{1}='tim';
   tplcell{2}='love';
   tplcell{3}=1.73;

(note the curly brackets!) creates a cell array with 3 elements. Typing length(tplcell) will return 3, and iscell(tplcell) will return 1 (i.e. true).

tplcell and tpl contain the same information. Sometimes a cell array is more appropriate than a struct - it depends on the situation.

Variously-sized vectors and matrices can be elements of a cell array, so for example if you wanted to represent a square-based pyramid you could do

pyramid{1}=1;
pyramid{2}=[2 3; 4 5];
pyramid{3}=[6 7 8 ; 9 10 11; 12 13 14];
celldisp(pyramid)

The cellfun function can be used to find out about a cell array. For example,

cellfun('isclass',pyramid,'double') 

tells you that all of the elements of pyramid are standard matlab matrices.

Cell arrays can contain the same data as matrices. Some routines (e.g. union) accept them interchangeably. You can also have matrices of structures, cell arrays of structs, etc.

Converting

cells and matrices

A matrix can be converted to a cell array

   A=1:4
   Acell=num2cell(A)

but because the elements of a cell can be differently sized matrices, cells can't always be converted to matrices. The following would work

   Amat=cell2mat(Acell)

cells and structs

When you convert a cell to a struct you need to give some fieldnames

   newtpl=cell2struct(tplcell,{'firstname','familyname','height'},2)

The final "2" argument (denoting the 2nd dimension) is necessary because otherwise the structure created will have 1 field of 3 elements and the cell2struct call will only need 1 fieldname, so

   newtpl=cell2struct(tplcell,{'firstname'})

works, though in this case isn't very useful.

The fieldnames are lost when converting the other way

   tplcell2=struct2cell(tpl)