Turn a cellarray into a single array.

조회 수: 2(최근 30일)
John Petersen
John Petersen 2015년 3월 24일
댓글: John Petersen 2015년 3월 24일
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
Stephen23 2015년 3월 24일
편집: Stephen23 2015년 3월 24일
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'.
  댓글 수: 1
John Petersen
John Petersen 2015년 3월 24일
Thanks, that works!

댓글을 달려면 로그인하십시오.

추가 답변(1개)

Guillaume
Guillaume 2015년 3월 24일
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')
  댓글 수: 1
John Petersen
John Petersen 2015년 3월 24일
Thanks, this works too!

댓글을 달려면 로그인하십시오.

태그

제품

Community Treasure Hunt

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

Start Hunting!

Translated by