2010-06-16 4 views
8

Quindi, ho una matrice cellulare di vettori 1xN di diverse lunghezze. Voglio aggiungerli in una matrice in modo da poterli visualizzare con imagesc. Ovviamente la matrice deve essere la larghezza del vettore più grande. Il codice corrente per questo è il seguente:Come posso accumulare celle di diverse lunghezze in una matrice in MATLAB?

tcell = {[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6], [1], []}; 
lens = cellfun('length', tcell); 
rmat = NaN(length(tcell), max(lens)); 
for i = 1:length(tcell) 
    rmat(i, 1:lens(i)) = tcell{i}; 
end 

Qualcuno conosce una soluzione vettoriale per questo tipo di problema? Non sono molto preoccupato della velocità di questo ciclo a causa del JIT di MATLAB. Sto solo cercando di ampliare le mie conoscenze e questo è un caso che mi capita spesso nella mia programmazione.

risposta

11

Ecco una soluzione che utilizza CELLFUN un anonymous function al primo tampone ciascuna cella con NaN valori, allora VERTCAT mettere le cellule in una matrice:

>> tcell = {[1,2,3], [1,2,3,4,5], [1,2,3,4,5,6], [1], []}; %# Sample array 
>> maxSize = max(cellfun(@numel,tcell)); %# Get the maximum vector size 
>> fcn = @(x) [x nan(1,maxSize-numel(x))]; %# Create an anonymous function 
>> rmat = cellfun(fcn,tcell,'UniformOutput',false); %# Pad each cell with NaNs 
>> rmat = vertcat(rmat{:})     %# Vertically concatenate cells 

rmat = 

    1  2  3 NaN NaN NaN 
    1  2  3  4  5 NaN 
    1  2  3  4  5  6 
    1 NaN NaN NaN NaN NaN 
    NaN NaN NaN NaN NaN NaN