我有一个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
包含结果。
答案 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}