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 d
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.
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))