views:

72

answers:

1

So, I have a cell-array of 1xN vectors of different lengths. I want to append them into a matrix so I can display them with imagesc. Obviously the matrix must be the width of the largest vector. My current code for this is below:

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

Does anyone know a vectorized solution for this type of problem? I'm not really worried about the speed of this loop because of MATLAB's JIT. I'm just trying to expand my knowledge and this is a case that I come across quite often in my programming.

+4  A: 

Here's one solution that uses CELLFUN with an anonymous function to first pad each cell with NaN values, then VERTCAT to put the cells in a matrix:

>> 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
gnovice

related questions