Convert cell array

Python

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

% add prefix

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'}

see also: → How to assign a single value to multiple cells

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