私は4x4のセル配列を持っていますC
。
C= {
[1] [3] [6] [ ];
[2] [ ] [ ] [8];
[ ] [4] [ ] [9];
[ ] [5] [7] [ ]}
私は私に与える新しいセル配列 D を生成したい
D = {[1;2], [3], [4;5],[6],[7],[8;9]}
基本的に、1.各列の隣接する空でないセルを垂直に結合し、2 D
.結果を含む新しいセル配列を出力します。
私は4x4のセル配列を持っていますC
。
C= {
[1] [3] [6] [ ];
[2] [ ] [ ] [8];
[ ] [4] [ ] [9];
[ ] [5] [7] [ ]}
私は私に与える新しいセル配列 D を生成したい
D = {[1;2], [3], [4;5],[6],[7],[8;9]}
基本的に、1.各列の隣接する空でないセルを垂直に結合し、2 D
.結果を含む新しいセル配列を出力します。
これを使用できます。イメージングツールキットのbwlabelを使用しました。
C= { ...
[1] [3] [6] [ ]; ...
[2] [ ] [ ] [8]; ...
[ ] [4] [ ] [9]; ...
[ ] [5] [7] [ ]};
lenf = @(X)~isempty(X);
lens = cellfun(lenf, C);
lens
Cのスロットが空かどうかを示す論理配列になりました。D
これで、各列をlens
1 xのバイナリイメージとして扱い、を使用して領域を探すことで構築できますbwlabel()
。最後に、領域をDに配置します。
sum = 0;
for k = 1:size(lens,2)
[L,num] = bwlabel(lens(:,k), 4);
for idx = 1:num
D{idx+sum} = cat(1, C{L==idx, k});
end
sum = sum + num;
end
別のツールボックスに依存せずに、このコードを使用できます
nextGroup = diff([true(1, size(C, 2)); cellfun(@isempty, C)]) < 0;
index = reshape(cumsum(nextGroup(:)), size(nextGroup));
result = arrayfun(@(x) horzcat(C{index==x}), 1:index(end,end), ...
'UniformOutput', false);
Octave で動作するので、Matlab でも動作することを願っています。
空のセルを NaN 値に置き換えてcell2mat
行列にし、すべての数値で論理行列を取得します。for ループでは、接続されているすべての値を簡単に取得できますbwconncomp
(これには画像ツールボックスが必要です)。
for ループを回避するために、各列の終わりを nan で区切った長いベクトルに変換できます (ベクトルに変換する前に nan の行を追加することにより)。
C(cellfun (@isempty, C)) = {nan};
C = cell2mat (C);
C(end+1, :) = nan;
mask = false (size (C));
mask(~isnan (C)) = true;
list = regionprops (bwconncomp (mask(:)), C(:), 'PixelValues')
list
は構造体配列であるため、アクセスしようとすると cs-list を取得します。次のようにして、すべての値をセル配列に配置できます。
D = {list(:).Pixelvalues}