2

私は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.結果を含む新しいセル配列を出力します。

4

3 に答える 3

1

これを使用できます。イメージングツールキットのbwlabelを使用しました。

C= {                   ...
[1] [3] [6] [ ];       ...
[2] [ ] [ ] [8];       ...
[ ] [4] [ ] [9];       ...
[ ] [5] [7] [ ]};

lenf = @(X)~isempty(X);
lens = cellfun(lenf, C);

lensCのスロットが空かどうかを示す論理配列になりました。Dこれで、各列をlens1 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
于 2012-08-26T00:47:14.630 に答える
1

別のツールボックスに依存せずに、このコードを使用できます

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 でも動作することを願っています。

于 2012-08-26T18:57:01.240 に答える
0

空のセルを 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}
于 2012-08-26T01:01:51.460 に答える