Asked by Zara Khan
on 7 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.

Answer by Jos (10584)
on 18 Mar 2019

Accepted Answer

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

I am asking something more:

How can I put a condition here to check whether cell length is less than M or not . If it is less than M then only there will be padding otherwise not ?

Jos (10584)
on 19 Mar 2019

After you calculated the new N you can use this:

tf = ~(N < M) % true for the large cells

newN(tf) = N(tf) % reset to the old lengths

Zara Khan
on 19 Mar 2019

Thank you . It works.

Sign in to comment.

Answer by tmarske
on 7 Mar 2019

Edited by tmarske
on 7 Mar 2019

%set up a dummy example

tst = {[1 1], [1 1 1 1 1], [1 1 1], [1]}

%get the maximum length

maxlen = max(cellfun(@length, tst))

%pad zeros

tstPadded = cellfun(@(x)([x zeros(1, maxlen - length(x))]), tst, 'UniformOutput', false)

Jos (10584)
on 18 Mar 2019

Your code makes little sense. You overwrite A and width_needed.

I thought you needed the maximum of the lengths, so why don't you apply max?

Zara Khan
on 18 Mar 2019

Jos (10584)
on 18 Mar 2019

Sign in to comment.

Answer by Jos (10584)
on 7 Mar 2019

Edited by 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] = padcat(C{:}) % pads with NaNs

M(~tf) = 0

PADCAT can be found on the File Exchange, for free:

(edited answer)

Zara Khan
on 8 Mar 2019

This is shwoing wrong syntax : (M,tf) = padcat(C{:})

Jos (10584)
on 8 Mar 2019

My mistake, should be square brackets of course ... (I edited my answer).

(assuming you also downloaded and installed the function)

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.

Sign in to comment.

Answer by 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

Each cell array consists of consequtives 0's and 1's. Padding with extra zero showing me error

size input must be scalar.

Jos (10584)
on 18 Mar 2019

I do not get this error in the above code for a cell array like this

C = {[1 0 0 1], [0 1] ; [1 0 1 0], [0 0 1]}

You should give more details about the error and the input ...

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.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.