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

前端 未结 2 1212
隐瞒了意图╮
隐瞒了意图╮ 2020-12-21 16:49

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

相关标签:
2条回答
  • 2020-12-21 17:06

    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.

    0 讨论(0)
  • 2020-12-21 17:22

    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))
    
    0 讨论(0)
提交回复
热议问题