Cell Arrays - Miami University

MATLAB
Cell Arrays
Greg Reese, Ph.D
Research Computing Support Group
Academic Technology Services
Miami University
MATLAB
Cell Arrays
© 2011 Greg Reese. All rights reserved
Cell Arrays - definition
A MATLAB cell array is an array of cells.
A cell can hold any data type, and data
types within a cell array can differ
1
0
0
0
1
0
0
0
1
99
'Romeo, Romeo'
3.1415
@my_function()
3
Cell Arrays - creation
For specified content, create same way as
arrays but use (curly) braces
Example
>> a = { i 5:-1:2 'carrots'; magic(2) 77 NaN }
a =
[0 + 1.0000i]
[1x4 double]
'carrots'
[2x2 double]
[
77]
[
NaN]
4
Cell Arrays - creation
Create empty cell array with cell() function
a = cell( rows, columns )
Example
>> a = cell( 3, 6 )
a =
[]
[]
[]
[]
[]
[]
[]
[]
[]
>> whos a
Name
a
Size
3x6
[]
[]
[]
Bytes
72
[]
[]
[]
[]
[]
[]
Class
cell
5
Cell Arrays - display
Various ways to display cell array. One is
to type variable name with no trailing
semicolon. This shows top level of array
only
Example
>> a = { 'AAA' 2 { {1 2; 3 4} } };
>> a
a =
'AAA'
[2]
{1x1 cell}
6
Cell Arrays - display
celldisp() recursively displays cell
array, i.e., if content a cell array, also
displays its content
Example
>> a = { 'AAA'
>> celldisp( a
a{1} = AAA
a{2} = 2
a{3}{1}{1,1} =
a{3}{1}{2,1} =
a{3}{1}{1,2} =
a{3}{1}{2,2} =
2 { {1 2; 3 4} } };
)
1
3
2
4
cell within cell
7
Cell Arrays - display
cellplot() displays in figure window
drawing of 1D or 2D cell array
Example
>> a = { 'AAA' 2 { {1 2; 3 4} } };
>> cellplot( a )
AAA
1
2
3
4
2
8
Cell Arrays - indexing
Two types of indexing into a cell array
• Cell indexing - access groups of cells
but not their content
• Content indexing - access single cell's
content
9
Cell Arrays - indexing
Cell indexing
• Done by using parentheses around
subscript, e.g., a(5), b(3:6,:), c(2,9)
• Can access one or more cells
• Cannot access content of cells
Use cell indexing if you want to
manipulate cells of an array, regardless
of what is inside them
10
Cell Arrays - indexing
To delete elements of a cell array, use cell
indexing ()
Examples
>> a = { 'r1c1' 'r1c2' 3; [1 2; 3 4] 1:4 'The End' }
a = 'r1c1'
'r1c2'
[
3]
[2x2 double]
[1x4 double]
'The End'
>> a(:,2) = [] % delete second column
a = 'r1c1'
[
3]
[2x2 double]
'The End'
>> a(2,:) = [] % delete second row
a = 'r1c1'
[3]
11
Cell Arrays - indexing
Content indexing
• Done by using (curly) braces around
subject, e.g., a{5}, b{2,9}
• Lets you access what's inside a
single cell
• Can only use on one cell at a time
(sort of - will discuss this later)
Use content indexing if you want to get
inside cell
12
Cell Arrays - indexing
Principal rules
• Indexing a cell(s) with () always produces cells
• Indexing a cell with {} produces a data type of
whatever is inside the indexed cell
– Result of {} indexing is a cell only if content is a cell
• If have cells indexed with () on left side of =,
must have array of cells of same size on right
side
• If array on left not subscripted, can use () or {}
on right
13
Cell Arrays - indexing
Examples - follow along
>> a = { 'AAA' 2 { {1 2; 3 4} } }
a = 'AAA'
[2]
{1x1 cell}
>> whos a
Name
Size
Bytes Class
a
1x3
526 cell
Attributes
"Attributes" column always
empty for these slides so
will omit from now on
Even though a is a cell array, output from first line is
showing content of array's cells
– 'AAA' means that the content of cell 1 of a is a character
array with three elements
– [2] means that the content of cell 2 of a is a numerical
array with one element (the number 2)
– {1x1 cell} means that the content of cell 3 of a is a
cell array with one cell
14
Cell Arrays - indexing
Examples - follow along
From before
a = 'AAA'
[2]
>> z = a(1)
z = 'AAA'
>> whos z
Name
Size
z
1x1
>> z = a{1}
z = AAA
>> whos z
Name
Size
z
1x3
{1x1 cell}
Bytes
66
Class
cell Why?
Bytes Class
6 char Why?
15
Cell Arrays - indexing
Examples - follow along
>> z = a(2)
z = [2]
>> whos z
Name
Size
z
1x1
Bytes
68
Class
cell Why?
>> z = a{2}
z = 2
>> whos z
Name
Size
z
1x1
Bytes
8
Class
double Why?
16
Cell Arrays - indexing
Examples - follow along
>> z = a(3)
z = {1x1 cell} This means a cell containing a 1x1 cell
>> whos z
Name
Size
Bytes Class
z
1x1
392 cell Why?
>> z = a{3}
z = {2x2 cell}
>> whos z
Name
Size
z
1x1
Bytes
332
Class
cell Why?
17
Cell Arrays - indexing
Examples - follow along
>> bb = { 'B' 6:9 }
bb = 'B'
[1x4 double]
>> b = bb;
>> whos b
Name
Size
Bytes Class
b
1x2
154 cell
>> b(1) = 6
??? Conversion to cell from double is not possible. Why?
>> b(1) = 'Hello'
??? Conversion to cell from char is not possible.
Why?
>> b(1) = a
??? In an assignment A(:) = B, the number of elements Why?
in A and B must be the same.
18
Cell Arrays - indexing
Examples - follow along
a = 'AAA'
[2]
{1x1 cell}
>> b(1) = a(1)
b = 'AAA'
[1x4 double]
>> b(1) = a{1}
??? Conversion to cell from char is not possible.
Why?
>> b(1) = a(2)
b = [2]
[1x4 double]
>> b(1)= a{2}
??? Conversion to cell from double is not possible. Why?
>> b(1) = a(3)
b = {1x1 cell}
[1x4 double]
>> b(1) = a{3}
b = {2x2 cell}
[1x4 double]
19
Cell Arrays - indexing
Examples - follow along
Store into single, content-indexed cell
>> a
a = 'AAA'
>> b = bb
b = 'B'
[2]
{1x1 cell}
[1x4 double]
>> b{1} = a(1)
b = {1x1 cell}
[1x4 double]
>> b{1} = a{1}
b = 'AAA'
[1x4 double]
20
Cell Arrays - indexing
Examples - follow along
a = 'AAA'
b = 'B'
[2]
{1x1 cell}
[1x4 double]
>> b{1} = a(2)
b = {1x1 cell}
[1x4 double]
>> b{1} = a{2}
b = [2]
[1x4 double]
>> b{1} = a(3)
b = {1x1 cell}
[1x4 double]
>> b{1} = a{3}
b = {1x1 cell}
[1x4 double]
21
Cell Arrays - indexing
Tricky case - content indexing of multiple
cells
• MATLAB says you can't do it
• Really means that you can do it but
under many circumstances, content of
all but first cell disappear
• For more information, see "commaseparated list" in MATLAB help
22
Cell Arrays - indexing
Accessing a range of cells with content
indexing (curly braces) produces a commaseparated list. If there are n elements in the
range, there will be n members of the list and
these will be assigned in order to the output
variables. If there aren't enough output
variables, MATLAB ignores remaining list
members
data{4:7}
→
data{4}
data{5}
[ a b c ] = data{4:7} same as
[ a b c ] = data{4} data{5}
data{6}
data{6}
data{7}
data{7}
23
Cell Arrays - indexing
a = 'AAA'
[2]
>> clear x
>> x = a{1:3}
x = AAA
>> whos x
Name
Size
x
1x3
>> x = a{2:3}
x = 2
>> whos x
Name
Size
x
1x1
{1x1 cell}
Bytes
6
Class
char
Bytes
8
Class
double
24
Cell Arrays - indexing
>> clear x y
>> [ x y ] = a{1:3}
x = AAA
y = 2
>> whos x y
Name
Size
x
1x3
y
1x1
Bytes
6
8
Class
char
double
25
Cell Arrays - indexing
>> clear x y z
>> [ x y z ] = a{1:3}
x = AAA
y = 2
z = {2x2 cell}
>> whos x y z
Name
Size
x
1x3
y
1x1
z
1x1
Bytes
6
8
332
Class
char
double
cell
26
Cell Arrays - indexing
Tip
Avoid specifying more than one cell
when content indexing
a{1:4,:}
27
Cell Arrays - indexing
Content of a cell-array element is
often a (numerical) array. You can
access multiple array elements of a
single element in a cell array.
a{m,n}(r1:r2,c1:c2)
returns an array made up of rows r1
through r2 and columns c1 through c2
of the element at row m and column n of
the cell array a
28
Cell Arrays - indexing
Examples
>> c = { 'CC' 7; [1 2; 3 4] [0+i 1+0i] }
c = 'CC'
[
7]
[2x2 double]
[1x2 double]
>> c{2,1}(2,2)
ans = 4
>> c{2,1}(:,2)
ans = 2
4
29
Cell Arrays - indexing
Examples
>> c{2,1}(:,:)
ans = 1
2
3
4
>> c{2,1}(:)
ans = 1
3
2
4
30
Cell Arrays - numbers
MATLAB functions that use numbers in
computations seldom work on numbers
that are in cells.
Example
>> c = { 1 3 5 7 }
c = [1]
[3]
[5]
[7]
>> mean(c)
??? Undefined function or method 'sum' for input
arguments of type 'cell'.
Error in ==> mean at 28
y = sum(x)/size(x,dim);
31
Cell Arrays - numbers
However, for convenience, numbers may
appear in cells. To convert a cell array of
numbers to a numerical array, use:
n = cell2mat( c )
• c is a cell array with only numbers
• n is a numerical (double) array
– If elements of c are all scalars*, n has same
dimensions as c
* The elements can also be matrices. See MATLAB help on
cell2mat() for details
32
Cell Arrays - numbers
Example
>> c = { 1 3 5 7 }
c = [1]
[3]
[5]
[7]
>> mean(c)
??? Undefined function or method 'sum' for input
arguments of type 'cell'.
Error in ==> mean at 28
y = sum(x)/size(x,dim);
>> cNum = cell2mat( c )
cNum = 1
3
5
7
>> mean( cNum )
ans = 4
33
Cell Arrays - numbers
To convert an array of numbers to a cell
array, use:
c = num2cell( A )
• A is a numerical array
• c is a cell array of same dimension as A
34
Cell Arrays - numbers
Example
>> a = magic( 3 )
a = 8
1
6
3
5
7
4
9
2
>> c = num2cell( a )
c = [8]
[1]
[6]
[3]
[5]
[7]
[4]
[9]
[2]
35
Cell Arrays - numbers
Try It
Suppose you are given the names and
ages of three guys in two arrays, like
this:
>> names = { 'John' 'Joe' 'Jeff' }
names = 'John'
'Joe'
'Jeff'
>> ages = { 40 45 50 }
ages = [40]
[45]
[50]
36
Cell Arrays - numbers
Try It
Find the mean age
>> nAges = cell2mat( ages )
nAges = 40
45
50
>> mean( nAges )
ans = 45
or all at once:
>> mean( cell2mat( ages ) )
ans = 45
37
Cell Arrays - numbers
Try It
Store all data in one cell array with the
first column containing the names and
the second the ages
38
Cell Arrays - numbers
Try It
>> ages = [ 40 45 50 ]
ages = 40
45
50
>> cAges = num2cell( ages )'
cAges = [40]
[45]
[50]
>> guys = cell( 3, 2 )
guys = []
[]
[]
[]
[]
[]
39
Cell Arrays - numbers
Try It
>> guys(:,1) = names'
guys = 'John'
[]
'Joe'
[]
'Jeff'
[]
>> guys(:,2) = cAges
guys = 'John'
[40]
'Joe'
[45]
'Jeff'
[50]
Can do this a little more easily by concatenating the
40
two cell arrays. See MATLAB help
Cell Arrays - functions on
Some MATLAB functions will take a cell
array as input, e.g., cell2mat(),
isvector(), and deal(). Others, such
as mean(), eval(), and not(), won't. If
one of the latter functions can accept the
content of the elements of the cell array as
input, we can process those cells with the
MATLAB function cellfun()
41
Cell Arrays - functions on
Even if a function can take a cell array as an
input, we may want to apply a function that
can accept cell-array arguments to the
content of a cell array, not to the array itself
Example
Find the length of each word in a string array
>> c = { 'a' 'bb' 'cccc' }
c = 'a'
'bb'
'cccc'
>> length(c)
length of cell array c, not lengths of content (1, 2, 4)
ans = 3
42
Cell Arrays - functions on
The MATLAB function cellfun()
applies a specified function to the
content of every element of a cell
array
43
Cell Arrays - functions on
We'll use a basic version of cellfun, namely,
A = cellfun( fun, C )
• C is a cell array
• fun is a function that takes exactly one input
value and produces exactly one, scalar
output
– fun must be able to accept the type of input in
the cells of C, e.g., character array, numerical
array, etc.
• A is an array of same dimension as C
44
Cell Arrays - functions on
45
Cell Arrays - functions on
A = cellfun( fun, C )
To specify the function, use the at-sign @
followed by the function name without
parentheses. (This is called a function handle)
Examples
– If C is a cell array of strings,
cellfun( @length, c ) finds the length of
each of the strings in the array
– If C is a cell array of strings,
cellfun( @isempty, c ) tells whether or
not each cell in the array is empty
46
Cell Arrays - functions on
Example
Find the means of four data sets:
>> data = { 1 [0 2 4] [ -1 0 1] randn(1,1000) }
data = [1]
[1x3 double]
[1x3 double]
[1x1000 double]
>> mean( data )
??? Undefined function or method 'sum' for input arguments of
type 'cell'.
mean() doesn't accept cell arrays as input, but
Error in ==> mean at 28
contents of each array is okay because those are
y = sum(x)/size(x,dim); numerical arrays
>> dataMeans = cellfun( @mean, data )
dataMeans = 1.0000
2.0000
0
-0.0326
>> whos data dataMeans
Name
Size
Bytes Class
data
1x4
8296 cell
dataMeans
1x4
32 double
47
Cell Arrays - functions on
tf = isempty( C )
isempty() is a useful function
which returns 1 (true) if its input array
is empty and 0 (false) if the array is
not empty. (An empty array is one
that has at least one dimension of
size zero, e.g., 0x0, 0x5, 3x7x0 )
48
Cell Arrays - functions on
Try It
Make a cell array of four cells whose
contents are 'a', 'bb', empty ( {} ), and
'ccc'. Determine if the array is empty
and if each cell is empty
>> c = { 'a' 'bb' {} 'cccc' }
c = 'a'
'bb'
{}
'cccc'
>> isempty( c )
ans = 0
>> cellfun( @isempty, c )
ans = 0
0
1
0
49
Cell Arrays - functions on
Try It
Use the previous array and find the
length of the array and the number of
characters in each string in the array
>> length( c )
ans = 4
>> cellfun( @length, c )
ans = 1
2
0
4
50
Cell Arrays - functions on
It's common to want to know if any element of
a cell array meets a certain condition. Do this
with the MATLAB function:
B = any( A )
• A is a numerical vector (not a cell array)
• B is a scalar that is 1 if any element of A is
not zero and 0 otherwise, i.e., if all elements
of A are zero
any() also works on matrices. See MATLAB
help for details
51
Cell Arrays - functions on
Try It
Use the previous array and determine
if any of the strings have at least one
character
>> lengths = cellfun( @length, c )
lengths = 1
2
0
4
>> any( lengths )
ans = 1
>> any( cellfun( @length, c ) )
ans = 1
52
Cell Arrays - functions on
It's also common to want to know if all
elements of a cell array meet a certain
condition. Do this with the MATLAB function:
B = all( A )
• A is a numerical vector (not a cell array)
• B is a scalar that is 1 if all elements of A are
not zero and 0 otherwise, i.e., if at least one
element of A is zero
all() also works on matrices. See MATLAB
help for details
53
Cell Arrays - functions on
Try It
Use the previous array and determine
if all of the strings have at least one
character
>> lengths = cellfun( @length, c )
lengths = 1
2
0
4
>> all( lengths )
ans = 0
>> all( cellfun( @length, c ) )
ans = 0
54
Cell Arrays - finding
Often it's useful to know which cells in a cell
array meet a certain condition. One way to find
out is with the MATLAB function:
indexes = find( A )
• A is a numerical vector (not a cell array)
• indexes is a vector of the indexes of the
cells whose content is not 0
– If no such cells, indexes is empty
• find() also works on matrices. See
MATLAB help for details
55
Cell Arrays - finding
Try It
Use the previous array and find the
indexes of all empty cells
>> c = { 'a' 'bb' {} 'cccc' }
c = 'a'
'bb'
{}
'cccc'
>> empty = cellfun( @isempty, c )
empty = 0
0
1
0
>> indexes = find( empty )
indexes = 3
>> c{3}
ans = {}
Often just do it all at once
>> indexes = find( cellfun( @isempty, c ) )
indexes = 3
56
Cell Arrays - finding
Can also use find() to determine if
any of the cell array members meet a
criterion and if so, how many meet it:
• Length of returned index vector is
number of cells meeting criterion
– If length is zero or returned vector is
empty (same thing), no cells meet
criterion
57
Cell Arrays - finding
Try It
Use the previous array and find()
to determine how many empty cells
are in the array
>> length( find( cellfun( @isempty, c ) ) )
ans = 1
58
Cell Arrays
Questions?
59
The End
60