83205

# Accumulating different sized column vectors stored as a cell array into a matrix padded with NaNs

Imagine I have a series of different sized column vectors inside an array and want to group them into a matrix by padding the empty spaces with `NaN`. How can I do this?

There is already an answer to a very similar problem (accumulate cells of different lengths into a matrix in MATLAB?) but that solution deals with row vectors and my problem is with column vectors. One possible solution could be transposing each of the array components and then applying the above mentioned solution. However, I have no idea how to do this.

Also, speed is a bit of an issue so if possible take that into consideration.

You can just slightly tweak that answer you found to work for columns:

```tcell = {[1,2,3]', [1,2,3,4,5]', [1,2,3,4,5,6]', [1]', []'}; %\\ ignore this comment, it's just for formatting in SO maxSize = max(cellfun(@numel,tcell)); fcn = @(x) [x; nan(maxSize-numel(x),1)]; cmat = cellfun(fcn,tcell,'UniformOutput',false); cmat = horzcat(cmat{:}) cmat = 1 1 1 1 NaN 2 2 2 NaN NaN 3 3 3 NaN NaN NaN 4 4 NaN NaN NaN 5 5 NaN NaN NaN NaN 6 NaN NaN ```

Or you could tweak this as an alternative:

```cell2mat(cellfun(@(x)cat(1,x,NaN(maxSize-length(x),1)),tcell,'UniformOutput',false)) ```

If you want speed the `cell` data structure is your enemy. For this example I will assume you have this vectors stored in a structure called `vector_holder`:
```elements = fieldnames(vector_holder); % Per Dan request maximum_size = max(structfun(@max, vector_holder)); % maximum_size is the maximum length of all your separate arrays matrix = NaN(length(elements), maximum_size); for i = 1:length(elements) current_length = length(vector.holder(element{i})); matrix(i, 1:current_length) = vector.holder(element{i}); end ```
Many Matlab functions are slower when dealing with `cell` variables. In addition, a `cell` matrix with `N` double-precision elements requires more memory than a double-precision matrix with `N` elements.