Main Content

Typing in a series of numbers separated by commas gives you what is called a *comma-separated list*. The MATLAB^{®} software returns each value individually:

1,2,3

ans = 1 ans = 2 ans = 3

Such a list, by itself, is not very useful. But when used with large and more complex data structures like MATLAB structures and cell arrays, the comma-separated list can enable you to simplify your MATLAB code.

This section describes how to generate a comma-separated list from either a cell array or a MATLAB structure.

Extracting multiple elements from a cell array yields a comma-separated list. Given a 4-by-6 cell array as shown here

C = cell(4,6); for k = 1:24 C{k} = k*2; end C

C = [2] [10] [18] [26] [34] [42] [4] [12] [20] [28] [36] [44] [6] [14] [22] [30] [38] [46] [8] [16] [24] [32] [40] [48]

extracting the fifth column generates the following comma-separated list:

C{:,5}

ans = 34 ans = 36 ans = 38 ans = 40

This is the same as explicitly typing

C{1,5},C{2,5},C{3,5},C{4,5}

For structures, extracting a field of the structure that exists across one of its dimensions yields a comma-separated list.

Start by converting the cell array used above into a 4-by-1 MATLAB structure with six fields: `f1`

through `f6`

. Read field `f5`

for all rows and MATLAB returns a comma-separated list:

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2); S.f5

ans = 34 ans = 36 ans = 38 ans = 40

This is the same as explicitly typing

S(1).f5,S(2).f5,S(3).f5,S(4).f5

You can assign any or all consecutive elements of a comma-separated list to variables with a simple assignment statement. Using the cell array `C`

from the previous section, assign the first row to variables `c1`

through `c6`

:

C = cell(4,6); for k = 1:24 C{k} = k*2; end [c1,c2,c3,c4,c5,c6] = C{1,1:6}; c5

c5 = 34

`C{1,1:3}`

to the variables `c1`

, `c2`

, and `c3`

, and then discards `C{1,4:6}`

:[c1,c2,c3] = C{1,1:6};

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2); [sf1,sf2,sf3] = S.f5; sf3

sf3 = 38

`deal`

function for this purpose.The simplest way to assign multiple values to a comma-separated list is to use the `deal`

function. This function distributes all of its input arguments to the elements of a comma-separated list.

This example uses `deal`

to overwrite each element in a comma-separated list. First create a list.

c{1} = [31 07]; c{2} = [03 78]; c{:}

ans = 31 7 ans = 3 78

Use `deal`

to overwrite each element in the list.

[c{:}] = deal([10 20],[14 12]); c{:}

ans = 10 20 ans = 14 12

This example does the same as the one above, but with a comma-separated list of vectors in a structure field:

s(1).field1 = [31 07]; s(2).field1 = [03 78]; s.field1

ans = 31 7 ans = 3 78

Use `deal`

to overwrite the structure fields.

[s.field1] = deal([10 20],[14 12]); s.field1

ans = 10 20 ans = 14 12

Common uses for comma-separated lists are

The following sections provide examples of using comma-separated lists with cell arrays. Each of these examples applies to MATLAB structures as well.

You can use a comma-separated list to enter a series of elements when constructing a matrix or array. Note what happens when you insert a *list* of elements as opposed to adding the cell itself.

When you specify a list of elements with `C{:, 5}`

, MATLAB inserts the four individual elements:

```
A = {'Hello',C{:,5},magic(4)}
```

A = 'Hello' [34] [36] [38] [40] [4x4 double]

When you specify the `C`

cell itself, MATLAB inserts the entire cell array:

```
A = {'Hello',C,magic(4)}
```

A = 'Hello' {4x6 cell} [4x4 double]

Use a list to display all or part of a structure or cell array:

A{:}

ans = Hello ans = [2] [10] [18] [26] [34] [42] [4] [12] [20] [28] [36] [44] [6] [14] [22] [30] [38] [46] [8] [16] [24] [32] [40] [48] ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

Putting a comma-separated list inside square brackets extracts the specified elements from the list and concatenates them:

A = [C{:,5:6}]

A = 34 36 38 40 42 44 46 48

When writing the code for a function call, you enter the input arguments as a list with each argument separated by a comma. If you have these arguments stored in a structure or cell array, then you can generate all or part of the argument list from the structure or cell array instead. This can be especially useful when passing in variable numbers of arguments.

This example passes several attribute-value arguments to the `plot`

function:

X = -pi:pi/10:pi; Y = tan(sin(X)) - sin(tan(X)); C = cell(2,3); C{1,1} = 'LineWidth'; C{2,1} = 2; C{1,2} = 'MarkerEdgeColor'; C{2,2} = 'k'; C{1,3} = 'MarkerFaceColor'; C{2,3} = 'g'; figure plot(X,Y,'--rs',C{:})

MATLAB functions can also return more than one value to the caller. These values are returned in a list with each value separated by a comma. Instead of listing each return value, you can use a comma-separated list with a structure or cell array. This becomes more useful for those functions that have variable numbers of return values.

This example returns three values to a cell array:

```
C = cell(1,3);
[C{:}] = fileparts('work/mytests/strArrays.mat')
```

C = 'work/mytests' 'strArrays' '.mat'

The `fftshift`

function swaps the left and right halves of each dimension of an array. For a simple vector such as `[0 2 4 6 8 10]`

the output would be `[6 8 10 0 2 4]`

. For a multidimensional array, `fftshift`

performs this swap along each dimension.

`fftshift`

uses vectors of indices to perform the swap. For the vector shown above, the index `[1 2 3 4 5 6]`

is rearranged to form a new index `[4 5 6 1 2 3]`

. The function then uses this index vector to reposition the elements. For a multidimensional array, `fftshift`

must construct an index vector for each dimension. A comma-separated list makes this task much simpler.

Here is the `fftshift`

function:

function y = fftshift(x) numDims = ndims(x); idx = cell(1,numDims); for k = 1:numDims m = size(x,k); p = ceil(m/2); idx{k} = [p+1:m 1:p]; end y = x(idx{:}); end

The function stores the index vectors in cell array `idx`

. Building this cell array is relatively simple. For each of the `N`

dimensions, determine the size of that dimension and find the integer index nearest the midpoint. Then, construct a vector that swaps the two halves of that dimension.

By using a cell array to store the index vectors and a comma-separated list for the indexing operation, `fftshift`

shifts arrays of any dimension using just a single operation: `y = x(idx{:})`

. If you were to use explicit indexing, you would need to write one `if`

statement for each dimension you want the function to handle:

if ndims(x) == 1 y = x(index1); else if ndims(x) == 2 y = x(index1,index2); end end

Another way to handle this without a comma-separated list would be to loop over each dimension, converting one dimension at a time and moving data each time. With a comma-separated list, you move the data just once. A comma-separated list makes it very easy to generalize the swapping operation to an arbitrary number of dimensions.