# Turn a cellarray into a single array.

2 views (last 30 days)
John Petersen on 24 Mar 2015
Commented: John Petersen on 24 Mar 2015
I have a cell array, sig, with varying lengths of data in each cell. For example (on a simplified scale)
sig = [{1}; {[2 3 4]}; {[5 6]}];
n = cellfun(@length,sig);
n is the length of each cell. I want to plot the data in each cell according to their cell index. For this example the answer would be
x = [1, 2,2,2, 3,3]; % indices of each cell
y = [1, 2,3,4, 5,6]; % value of each array element
scatter(x,y,'o');
So the question is, how can I acquire x, y programmatically?

Stephen23 on 24 Mar 2015
Edited: Stephen23 on 24 Mar 2015
One solution can be achieved using cellfun and arrayfun. Place this in a script:
sig = {[1], [2,3,4], [5,6]};
N = cellfun('length',sig);
X = arrayfun(@(x,n)x(ones(1,n)), 1:numel(sig),N, 'UniformOutput',false);
X = [X{:}]
Y = [sig{:}]
Running the script displays this in the command window:
>> temp_script
X =
1 2 2 2 3 3
Y =
1 2 3 4 5 6
Note this solution also uses a more efficient way of generating the sig cell array, and a faster cellfun call by using the backwards-compatibility option 'length'.
John Petersen on 24 Mar 2015
Thanks, that works!

Guillaume on 24 Mar 2015
sig = {[1]; [2 3 4]; [5 6]}; %note that your sig is a cell column
%because sig is a column it has to be transposed in the two instructions below:
X = cell2mat(arrayfun(@(c, p) p*ones(1, numel(c{1})), sig', 1:numel(sig), 'UniformOutput', false))
Y = cell2mat(sig')
John Petersen on 24 Mar 2015
Thanks, this works too!