# How can I make each cell array consistent in length?

59 views (last 30 days)
Zara Khan on 7 Mar 2019
Commented: Zara Khan on 19 Mar 2019
In a cell array each element is 1Xlength. This length is not equal. I want to get the maximum length and then want to make each cell with same length by padding zeros in it.

Jos (10584) on 18 Mar 2019
A final attempt to answer this question :-)
C = {1:4 1:2 ; 1:5 1:6 ; 1 1:3} % a m-by-n cell array
N = cellfun(@numel, C) % old lengths of cell elements
M = 3 ; % new length should be multiple of M
newN = M * ceil(N / M) % new lengths of cell elements
padfun = @(k) [C{k} zeros(1, newN(k) - N(k))] ;
C2 = arrayfun(padfun, 1:numel(C) , 'un', 0) ; % apply padding to all elements of C
C2 = reshape(C2, size(C)) % reshape (if needed)
Zara Khan on 19 Mar 2019
Thank you . It works.

tmarske on 7 Mar 2019
Edited: tmarske on 7 Mar 2019
%set up a dummy example
tst = {[1 1], [1 1 1 1 1], [1 1 1], }
%get the maximum length
maxlen = max(cellfun(@length, tst))
tstPadded = cellfun(@(x)([x zeros(1, maxlen - length(x))]), tst, 'UniformOutput', false)
Jos (10584) on 18 Mar 2019
Your question reads otherwise ... " I want to get the maximum length and then want to make each cell with same length by padding zeros in it.

Jos (10584) on 7 Mar 2019
Edited: Jos (10584) on 8 Mar 2019
If you make them the same length, you can also store them in a matrix. In that case, my PADCAT function is your friend :-)
C = {[1 2] ; 1 ; [1 2 3]}
M(~tf) = 0
Zara Khan on 18 Mar 2019
Jos (10584):
by using padcat I am getting a matrix where all coloumns are merged. That I dont want. I want to keep each cell as it is, just want want to add extra zeros. Like , first cell is 1X16, second is 1X31 and so on. I want to work on each indivisually. By adding extra zeros the first cell will be suppose 1X32 and so on. Remember I am dealing with mXn cell array.

Jos (10584) on 18 Mar 2019
C = {1:3 4 ; 5:9 10:12 ; 13:14 15} % a m-by-n cell array
N = cellfun(@numel, C)
maxN = max(N(:))
padfun = @(v) [v zeros(1, maxN - numel(v))] ;
C2 = cellfun(padfun, C , 'un', 0)
Zara Khan on 18 Mar 2019
A=cell(numImages,8);
B{k,j}=profile;
A=B;
len = cellfun(@length, B);
len1 = 32 * ceil(len/32);
width_needed=cell(numImages,8);
width_needed=len1-len;
I am making each cell a multiple of 32. Now my task is to pad extra zero after the multiplication. And I want to keep them as cell format , no merging will be done. Here the profile is varying in length. Basically it consists of consequtives 0's and 1's. I am attaching few pictures here too.