这是一个递归解决方案:
function t = recCat(s)
if ~iscell(s)
t = s;
elseif size(s,1) > 1,
t = [recCat(s(1,:)); recCat(s(2:end,:))];
elseif size(s,2) > 1,
t0 = cellfun(@(x) strcat('.', x), ...
cellfun(@recCat, s(2:end), 'UniformOutput', false), ...
'UniformOutput', false);
t = strcat(s{1}, t0{:});
elseif ischar(s{1})
t = s;
else
t = recCat(s{1});
end
end
这是第一个示例的结果:
>> theCellArray = {{'aa1' {'bb'; 'cc'}}; {'aa2' {'dd'; 'ee'}}};
>> recCat(theCellArray)
ans =
'aa1.bb'
'aa1.cc'
'aa2.dd'
'aa2.ee'
第二个,因为它现在失败,因为连接中的维度问题。我放入'bb' {'b1' {'b11' 'b12'} 'b2'}
另一个单元格,使其具有与'cc'
您得到的列数相同的列数
>> theCellArray = {{'aa1' {{'bb' {'b1' {'b11' 'b12'} 'b2'}}; 'cc'}}; {'aa2' {'dd'; 'ee'}}};
>> recCat(theCellArray)
ans =
'aa1.bb.b1.b11.b12.b2'
'aa1.cc'
'aa2.dd'
'aa2.ee'
但是,您可能的意思是b11
并且b12
在同一列而不是同一行,所以在这种情况下:
>> theCellArray = {{'aa1' {{'bb' {'b1' {'b11';'b12'} 'b2'}}; 'cc'}}; {'aa2' {'dd'; 'ee'}}};
>> recCat(theCellArray)
ans =
'aa1.bb.b1.b11.b2'
'aa1.bb.b1.b12.b2'
'aa1.cc'
'aa2.dd'
'aa2.ee'