评估单元格数组中字符串的单元格

时间:2013-06-28 18:47:13

标签: arrays matlab

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

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

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

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

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

我尝试了各种各样的东西,但是我总是无法让Matlab评估字符串的第二步(包含bbcc ...)。有什么想法吗?

编辑:

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

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

theCellArray就像一棵树,所以级别的数量是未知的。

2 个答案:

答案 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'

但是,您可能认为b11b12位于同一列而不是行,所以在这种情况下:

>> 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'