如何将相邻的非空单元格分组?

时间:2012-08-25 23:54:00

标签: matlab cell-array

我有一个4x4单元阵列C,其中

C= {

[1] [3] [6] [ ]; 

[2] [ ] [ ] [8];  

[ ] [4] [ ] [9]; 

[ ] [5] [7] [ ]}

我想生成一个新的单元格数组D给我

D = {[1;2], [3], [4;5],[6],[7],[8;9]}

基本上我想1.将每列中相邻的非空单元格垂直组合,然后输出新单元格数组D包含结果。

3 个答案:

答案 0 :(得分:1)

你可以用它。我使用了成像工具包中的bwlabel:

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

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

lens现在是一个逻辑数组,指示C中的任何插槽是否为空。现在,我们可以通过将D中的每一列视为1 x 任何二进制图像来构建lens,并使用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

答案 1 :(得分: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。

答案 2 :(得分:0)

用NaN值替换空单元格并使其成为cell2mat的矩阵,并获得包含所有数字的逻辑矩阵。在for循环中,您可以使用bwconncomp轻松获取所有连接的值(这将需要图像工具箱)。

为了避免for循环,我们可以变成一个长向量,其中一个nan分隔每列的末尾(通过添加一行nans,然后将其转换为向量)。

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是一个struct数组,因此当您尝试访问它时会获得一个cs-list。您可以使用以下命令将所有值放入单元格数组中:

D = {list(:).Pixelvalues}