1

I have a A which is 640x1 cell, where the value of each cell A(i,1) varies from row to row, for example:

A(1,1)=[]
A(2,1)=[1]
A(3,1)=[1,2,3]

What I want to do is to convert A to be like this:

A(1,1)=[]
A(2,1)=1
A(3,1)=1; A(3,2)=2; A(3,3)=3

so that each cell has only one value. So if anyone could assist me how can I do this? This is a part of who A looks like

A=
[]
0
0
0
145
[144;192]
[145;197;307]

1 Answer 1

3

Example:

% first lets create some random cellarray containing data of different length
A = cell(10,1);
for i=1:numel(A)
    A{i} = rand(1,randi([0 5]));
end

% determine the maximum number of columns
colnum = max(cellfun(@numel, A));

% create new cellarray, and fill each row
B = cell(numel(A),colnum);
for i=1:numel(A)
    if isempty(A{i}), continue; end
    B(i,1:numel(A{i})) = num2cell(A{i});
end

So I had the first cell array as:

>> celldisp(A)
A{1} =
    0.2217    0.1174    0.2967    0.3188
A{2} =
    0.5079    0.0855
A{3} =
    0.8010
A{4} =
     []
A{5} =
    0.7303    0.4886    0.5785    0.2373    0.4588
A{6} =
    0.5468    0.5211    0.2316    0.4889    0.6241
A{7} =
    0.3955    0.3674    0.9880    0.0377
A{8} =
    0.9133    0.7962    0.0987    0.2619    0.3354
A{9} =
    0.1366    0.7212    0.1068    0.6538
A{10} =
    0.7791    0.7150

which turned into:

>> B
B = 
    [0.2217]    [0.1174]    [0.2967]    [0.3188]          []
    [0.5079]    [0.0855]          []          []          []
    [0.8010]          []          []          []          []
          []          []          []          []          []
    [0.7303]    [0.4886]    [0.5785]    [0.2373]    [0.4588]
    [0.5468]    [0.5211]    [0.2316]    [0.4889]    [0.6241]
    [0.3955]    [0.3674]    [0.9880]    [0.0377]          []
    [0.9133]    [0.7962]    [0.0987]    [0.2619]    [0.3354]
    [0.1366]    [0.7212]    [0.1068]    [0.6538]          []
    [0.7791]    [0.7150]          []          []          []

where we access elements as a 2D cell array:

>> B{5,3}
ans =
    0.5785

EDIT:

Here is a slightly different implementation:

len = cellfun(@numel, A);
padding = arrayfun(@(n)cell(1,n), max(len)-len, 'UniformOutput',false);
B = cellfun(@num2cell, A, 'UniformOutput',false);
B = cellfun(@(b,pad) [b{:} pad], B, padding, 'UniformOutput',false);
B = cat(1, B{:});

EDIT2:

Note that the above will return a 2D cell array. This is because regular numeric matrices cannot be jagged (all rows must have the same length).

If you want to get a 2D numeric matrix, you'll have to insert NaN values as fillers:

C = B;
C(cellfun(@isempty,C))= {NaN};
C = cell2mat(C)

the output:

>> C
C =
    0.2217    0.1174    0.2967    0.3188       NaN
    0.5079    0.0855       NaN       NaN       NaN
    0.8010       NaN       NaN       NaN       NaN
       NaN       NaN       NaN       NaN       NaN
    0.7303    0.4886    0.5785    0.2373    0.4588
    0.5468    0.5211    0.2316    0.4889    0.6241
    0.3955    0.3674    0.9880    0.0377       NaN
    0.9133    0.7962    0.0987    0.2619    0.3354
    0.1366    0.7212    0.1068    0.6538       NaN
    0.7791    0.7150       NaN       NaN       NaN
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for your answer. But this gives an error:"Assignment has more non-singleton rhs dimensions than non-singleton subscripts" This is a link showing A dropbox.com/s/64b47gztw8flj3q/ret.mat
@user1460166: ok try the new version, I fixed both implementations
is it possible to check the question in this link where C's format will be the one you provided in this solution stackoverflow.com/questions/18426338/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.