我有一个 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}