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);

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
于 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 回答