10

したがって、長さの異なる 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

この種の問題のベクトル化されたソリューションを知っている人はいますか? MATLAB の JIT があるため、このループの速度についてはあまり心配していません。私は自分の知識を広げようとしているだけで、これは私のプログラミングで頻繁に遭遇するケースです。

4

1 に答える 1

13

cellfun以下は、無名関数を使用して最初に各セルにNaN値を埋め込み、次にvertcatセルの内容を行列に入れる1 つのソリューションです。

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
于 2010-06-16T15:11:06.690 に答える