Turn a cellarray into a single array.

1 view (last 30 days)
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?

Accepted Answer

Stephen23
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'.

More Answers (1)

Guillaume
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')

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!