Как я могу накапливать клетки разной длины в матрицу в MATLAB? - PullRequest
10 голосов
/ 16 июня 2010

Итак, у меня есть ячейка-массив из 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. Я просто пытаюсь расширить свои знания, и это тот случай, с которым я довольно часто сталкиваюсь при программировании.

1 Ответ

13 голосов
/ 16 июня 2010

Вот одно решение, которое использует 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...