I am a little confused about the usage of cells and arrays in MATLAB and would like some clarification on a few points. Here are my observations:
An array can dynamically adjust its own memory to allow for a dynamic number of elements, while cells seem to not act in the same way:
a=[]; a=[a 1]; b={}; b={b 1};
Several elements can be retrieved from cells, but it doesn't seem like they can be from arrays:
a={'1' '2'}; figure; plot(...); hold on; plot(...); legend(a{1:2}); b=['1' '2']; figure; plot(...); hold on; plot(...); legend(b(1:2)); %# b(1:2) is an array, not its elements, so it is wrong with legend.
Are these correct? What are some other different usages between cells and array?
Every cell array is an array! From this answer:
[]
is an array-related operator. An array can be of any type - array of numbers, char array (string), struct array or cell array. All elements in an array must be of the same type!Example:
[1,2,3,4]
{}
is a type. Imagine you want to put items of different type into an array - a number and a string. This is possible with a trick - first put each item into a container{}
and then make an array with these containers - cell array.Example:
[{1},{'Hallo'}]
with shorthand notation{1, 'Hallo'}
Cell arrays can be a little tricky since you can use the
[]
,()
, and{}
syntaxes in various ways for creating, concatenating, and indexing them, although they each do different things. Addressing your two points:To grow a cell array, you can use one of the following syntaxes:
When you index a cell array with
()
, it returns a subset of cells in a cell array. When you index a cell array with{}
, it returns a comma-separated list of the cell contents. For example:For
d
, the{}
syntax extracts the contents of cells 2, 3, and 4 as a comma-separated list, then uses[]
to collect these values into a numeric array. Therefore,b{2:4}
is equivalent to writingb{2}, b{3}, b{4}
, or2, 3, 4
.With respect to your call to
legend
, the syntaxlegend(a{1:2})
is equivalent tolegend(a{1}, a{2})
, orlegend('1', '2')
. Thus two arguments (two separate characters) are passed tolegend
. The syntaxlegend(b(1:2))
passes a single argument, which is a 1-by-2 string'12'
.