Как я могу собрать ячейки разной длины в матрицу в MATLAB?

Итак, у меня есть массив ячеек из 1xN векторов разной длины. Я хочу добавить их в матрицу, чтобы отображать их с помощью imagesc. Очевидно, что матрица должна быть шириной наибольшего вектора. Мой текущий код для этого ниже:

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

Кто-нибудь знает векторизованное решение для этого типа проблемы? Я не очень беспокоюсь о скорости этого цикла из-за JIT MATLAB. Я просто пытаюсь расширить свои знания, и это случай, с которым я довольно часто сталкиваюсь в своем программировании.


person JudoWill    schedule 16.06.2010    source источник


Ответы (1)


Вот одно решение, в котором используется cellfun с анонимная функция, чтобы сначала заполнить каждую ячейку NaN, затем vertcat, чтобы поместить содержимое ячейки в матрицу:

tcell = {[1 2 3], [1 2 3 4 5], [1 2 3 4 5 6], [1], []};  % Sample cell 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
person gnovice    schedule 16.06.2010