2010-06-16 5 views
8

Donc, j'ai une matrice de vecteurs 1xN de différentes longueurs. Je veux les ajouter dans une matrice afin que je puisse les afficher avec imagesc. Évidemment, la matrice doit être la largeur du plus grand vecteur. Mon code actuel pour cela est ci-dessous:Comment puis-je accumuler des cellules de différentes longueurs dans une matrice dans 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 

Est-ce que quelqu'un connaît une solution vectorisée pour ce type de problème? Je ne suis pas vraiment inquiet de la vitesse de cette boucle à cause du JIT de MATLAB. J'essaie simplement d'élargir mes connaissances et c'est un cas que je rencontre souvent dans ma programmation.

Répondre

11

Voilà une solution qui utilise CELLFUN avec un anonymous function à la première plaquette de chaque cellule avec NaN valeurs, alors VERTCAT pour mettre les cellules dans une 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 
Questions connexes