我有一个包含字符串和单元格的单元格数组,类似于:
theCellArray = {{'aa1' {'bb'; 'cc'}}; {'aa2' {'dd'; 'ee'}}};
现在我希望能够连接名称并得到类似的东西:
aa1.bb
aa1.cc
aa2.dd
aa2.ee
元素的数量可能会发生变化(因此对于aa1
,可能会有bb
,cc
,dd
,ee
等。
我尝试了各种各样的东西,但是我总是无法让Matlab评估字符串的第二步(包含bb
,cc
...)。有什么想法吗?
编辑:
可能有超过2个级别,因此theCellArray
可能是:
theCellArray = {{'aa1' {'bb' {'b1' {'b11' 'b12'} 'b2'}; 'cc'}}; {'aa2' {'dd'; 'ee'}}};
theCellArray
就像一棵树,所以级别的数量是未知的。
答案 0 :(得分:1)
这是一个甜蜜的人:
out = cellfun(@(y) cellfun(@(x) [ y{1} '.' x],y{2},'UniformOutput',false),theCellArray,'UniformOutput',false)
out{:}
ans =
'aa1.bb'
'aa1.cc'
ans =
'aa2.dd'
'aa2.ee'
Super One班轮! (但不是非常有效)并且仅适用于具有2级单元串的原始问题姿势。
答案 1 :(得分:1)
这是一个递归解决方案:
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'