0

我有一个包含字符串和单元格的单元格数组,类似于:

theCellArray = {{'aa1' {'bb'; 'cc'}}; {'aa2' {'dd'; 'ee'}}};

现在我希望能够连接名称并得到类似的东西:

aa1.bb
aa1.cc
aa2.dd
aa2.ee

元素的数量可能会改变(因此对于aa1,可能有bbccddee等)。

我尝试了各种方法,但我总是无法让 Matlab 评估字符串的第二步(包含bb, cc...)。有任何想法吗?

编辑:

可能有超过 2 个级别,因此theCellArray可能是:

theCellArray = {{'aa1' {'bb' {'b1' {'b11' 'b12'} 'b2'}; 'cc'}}; {'aa2' {'dd'; 'ee'}}};

theCellArray就像一棵树,所以层数是未知的。

4

2 回答 2

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'

超级一号班轮!(但效率不高)并且仅适用于具有 2 级单元字符串的原始问题姿势。

于 2013-06-28T19:20:26.830 回答
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'
于 2013-06-29T14:52:45.067 回答