# Turn a cellarray into a single array.

조회 수: 1(최근 30일)
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 2015년 3월 24일
편집: Stephen23 2015년 3월 24일
One solution can be achieved using cellfun and arrayfun. Place this in a script:
sig = {, [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 2015년 3월 24일
Thanks, that works!

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

### 추가 답변(1개)

Guillaume 2015년 3월 24일
sig = {; [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 2015년 3월 24일
Thanks, this works too!

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

### 범주

Find more on Matrix Indexing in Help Center and File Exchange

### Community Treasure Hunt

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

Start Hunting!