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:



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.

人吐槽 人点赞



用户名: 密码:
验证码: 匿名发表


查看评论:Accumulating different sized column vectors stored as a cell array into a matrix padded with NaNs