【问题标题】:Evaluate cells of strings in a cell array计算元胞数组中字符串的元胞
【发布时间】:2013-06-28 18:47:13
【问题描述】:

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

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就像一棵树,所以层数是未知的。

【问题讨论】:

  • aa1.bb 是字符串'aa1.bb' 还是一个名为aa1struct 字段名为'bb''cc'
  • @horcler aa1.bb 应该是一个字符串 'aa1.bb'
  • 这些名字的最终目的是什么?
  • @OlegKomarov 这些名称仅用于示例。实名对应于 simulink 模块的输入。由于结构可能会有很大差异,因此单元格并不总是包含相同的结构。

标签: arrays matlab


【解决方案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'

【讨论】:

    【解决方案2】:

    这是一个甜蜜的:

    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 级单元字符串的原始问题姿势。

    【讨论】:

    • 效果很好,但前提是单元格数组有两个级别。请参阅我的问题中的编辑。
    • 它不再是一个单行,但您可以使用 eval 并以这种方式提供额外的级别变量名称。如果你有创意,你可以在没有 for 循环的情况下构建 str,但如果你想使用大部分核心思想,它可以解决这个问题
    猜你喜欢
    • 2015-04-23
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多