Matrix‎ > ‎cell array‎ > ‎

# Convert cell arrays element-wise (`cellfun`)

Apply a function to each cell element

`X = cellfun(@function , CellArray)`

## Convert cell array into matrix

% convert numbers from text string cell-array 'C' into a numerical matrix 'X'
`C = {'11','12','13','14','15';...`
`     '21','22','23','24','25'} `
`X = cellfun(@str2num, C )`
11    12    13    14    15
21    22    23    24    25

% convert subset of cell-array into matrix
`X = cellfun(@str2num, C(2 , 1:3) )   `%  elements 1...3 of second row
21    22    23
`X = cellfun(@str2num, C(: , 3) )     `%  convert 3rd column
13
23

# Multiple inputs and custom functions

```X = cellfun(@(x) myfunction(x,y) , CellArray)   ```

## Example - Customized function

% define custom function
```function c = myfunction(s,th) ```
```    % convert string into numerical value and check if larger than threshold 'th' ```
`    x = str2num(s);`
`    if isempty(x), x=NaN; end`
`    c = x > th;`

apply custom function to each cell array (check if text numbers are larger than 12)
`C = {'11','12','13','14','15';...`
`     '21','22','23','24','25'} `
`X = cellfun(@(x) myfunction(x,12) , C )`
0   0   1   1   1
1   1   1   1   1

## One-liner: small custom functions inside cellfunc

% same x>12 check as before, but as short version inside the cellfun
% find all text-numbers larger than 12 (convert string into numerical values and compare)

`C = {'11','12','13','14','15';...`
`     '21','22','23','24','25'} `
`X = cellfun(@(x) str2num(x)>12 , C )`
0   0   1   1   1
1   1   1   1   1

% convert string into numbers and divide by 100
` X = cellfun(@(x) str2num(x)/100 , C )`
0.1100    0.1200    0.1300    0.1400    0.1500
0.2100    0.2200    0.2300    0.2400    0.2500

`X = cellfun(@(x) {['T_',x]}, C )`
{'T_11'}  {'T_12'}  {'T_13'}  {'T_14'}  {'T_15'}
{'T_21'}  {'T_22'}  {'T_23'}  {'T_24'}  {'T_25'}

% replace space with underscore for all elements in cell
`C = {'A 1','A 2','A 3'};`
`X = cellfun(@(x) {strrep(x,' ','_')} , C)`
{'A_1'} {'A_2'} {'A_3'}

# Filter (select) text of cell elements

## Get cell elements containing specific text (keywords or substring)

% get index location of  'Control' samples
`C = {'A1','A2','A3','','B1','B2','B3','','Control','Control','Control'};`
`id = find( cellfun(@(x) isequal(x,'Control'), C) )`
9   10   11

% get location of all cell elements that contain substring 'B' (find cells whose output of strfind is not ('~') empty)
`id = find( cellfun(@(x) ~isempty(strfind(x,'B')), C) )`
5   6   7
`C(id)`
{'B1'} {'B2'} {'B3'}

% get index of cells that starts with 'CTR' (control) at the first 3 letters
`C={'CTR_2','TIME_1','TIME_2','TIME_3','CTR_2','TIME_4','TIME_5'}`
`idx = cellfun(@(x) isequal('CTR',x(1:3)), C )`
1   0   0   0   1   0   0
`find(idx)`
1   5

## Replace all text elements 'Control' with 'CTR'

% get index location of  'Control' samples and overwrite with 'CTR'
`C = {'A1','A2','A3','','B1','B2','B3','','Control','Control','Control'};`
`C( find(cellfun(@(x) isequal(x,'Control'), C)) ) = {'CTR'}`

## Find and remove empty cell elements

```C = {'A1','A2','A3','','B1','B2','B3','','Control','Control','Control'}; ``` ``` ```
% find all empty elements in cell array
`idx = cellfun(@isempty, C)`
0   0   0   1   0   0   0   1   0   0   0
`find(idx)`
4     8

% get subset containing all elements that are not ('~') empty
`X = C( ~cellfun(@isempty, C) )`
{'A1'} {'A2'} {'A3'} {'B1'} {'B2'} {'B3'} {'Control'} {'Control'} {'Control'}

https://mathworks.com/help/matlab/ref/cellfun.html