2010-06-16 10 views
8

Por lo tanto, tengo una matriz de celdas de vectores 1xN de diferentes longitudes. Quiero agregarlos a una matriz para que pueda mostrarlos con imagesc. Obviamente, la matriz debe ser del ancho del vector más grande. Mi código actual para esto está debajo:¿Cómo puedo acumular células de diferentes longitudes en una matriz en 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 

¿Alguien sabe una solución vectorizada para este tipo de problema? No estoy realmente preocupado por la velocidad de este ciclo debido al JIT de MATLAB. Solo intento expandir mi conocimiento y este es un caso que encuentro con bastante frecuencia en mi programación.

Respuesta

11

Aquí hay una solución que utiliza CELLFUN con un anonymous function a primera almohadilla de cada celda con NaN valores, entonces VERTCAT para poner las células en una matriz:

>> 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 
Cuestiones relacionadas