【问题标题】:How does one concatenate cell arrays that are part of a cell array in MATLAB?如何连接作为 MATLAB 中元胞数组一部分的元胞数组?
【发布时间】:2011-08-26 19:53:14
【问题描述】:

我有一个单元格数组allData,它是 Nx1。每个单元格都包含一个具有names 属性的结构(名称是一个自定义对象,但如果您愿意,可以将其视为字符串的单元格数组)。我想创建一个包含所有名称的单元格数组。例如,如果 N=3,那么 allData 是一个 3x1 元胞数组,那么以下将实现我的目标:

A = allData{1};
B = allData{2};
C = allData{3};

allNames = [A.names B.names C.names];

这种方法的问题是 N 很大并且会根据输入而变化,所以我希望有一个聪明的方法可以使用 cellfun 来做到这一点,但是我尝试过的一切都失败了(例如不行allNames = [cellfun(@(x) {x.names}, allData)];)。

更新:多亏了建议的解决方案,我可以将所有内容放入一个单元格数组中,其中每个单元格都包含一个单元格数组。我的目标是连接这些。或多或少,我所拥有的是:

{A.names B.names C.names} 

而我想要却似乎得不到的是

{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...}

解决方案: 我需要以下每个答案的一部分,所以这是对我有用的解决方案:

来自Andrew Lazarus

allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);

那么,来自gnovice

allNames = vertcat(allNames{:});

感谢两位!!

【问题讨论】:

  • 这些结构是标量(即 1×1),还是可以是结构 数组

标签: matlab concatenation cell-array


【解决方案1】:

有更多关于单元格内容的详细信息需要更通用的解决方案,但如果 names 属性总是返回字符串的单元格数组,并且如果您的结构都是标量(即 1-by -1 结构数组),然后使用 CELLFUNCHARCELLSTR 的以下解决方案将为您提供包含您所有姓名的字符串 allNames 的 N×1 元胞数组:

allNames = cellfun(@(x) {char(x.names)},allData);
allNames = cellstr(char(allNames{:}));

这是一个示例,其中allData 包含三种不同的结构:

>> allData{1} = struct('names',{{'hello'}},'junk',1:3);
>> allData{2} = struct('names',{{'hi' 'yo' 'hey' 'whassup'}});
>> allData{3} = struct('names',{{'howdy';'aloha'}},'junk',4);
>> allNames = cellfun(@(x) {char(x.names)},allData);
>> allNames = cellstr(char(allNames{:}))

allNames = 

    'hello'
    'hi'
    'yo'
    'hey'
    'whassup'
    'howdy'
    'aloha'

编辑:

概括到names 属性返回对象 的元胞数组的情况,不一定是字符串,您可以尝试这个解决方案,将reshapes 每个元胞数组转换为 M-by-1元胞数组,然后将vertically concatenates 全部放入一个 N×1 元胞数组中:

allNames = cellfun(@(x) {reshape(x.names,[],1)},allData);
allNames = vertcat(allNames{:});

或者,如果您希望最终得到一个 1×N 的对象元胞数组,您可以这样做:

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData);
allNames = [allNames{:}];

【讨论】:

  • 如果它们是字符串的单元格数组,那就太好了,但遗憾的是我误导了你。它们是自定义对象的元胞数组。不过,我也许可以从这种方法中获得一些好处。谢谢!
  • @PengOne:这个故事的寓意是“记得在你的问题中提供样本数据”。
  • @Richie Cotton:该对象是在多个文件和很多很多行中定义的,所以它只会掩盖一个核心很简单的问题:我如何连接本身就是单元格的单元格数组元胞数组?
  • @PengOne:我已经更新了我的答案,以更一般地处理 objects 而不是字符串。
  • JessumCrow! vertcat 函数有效(一旦我正确转置)!谢谢你。对于我的示例,我不需要重塑,但请将其保留在您的解决方案中,以防其他人在此示例中将头撞到墙上。
【解决方案2】:

试试这个

 allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false)

省略 UniformOutput 可变参数以进行直接连接。这给出了一个单元格输出。

【讨论】:

  • 操作[allData{:}] 仅在元胞数组的元素可以水平连接成结构体数组时才有效,这意味着首先没有真正的理由使用元胞数组。
  • @PengOne:注意[括号]。但我会尝试一个更通用的解决方案。
  • 试过这个......结果是一个 1x3 单元格数组,每个单元格都包含一个单元格数组,我真的希望能找到一种连接自己的方法!
  • @PengOne,不太清楚您的意思,但有一种可能性:通过将 UniformOutput 更改为 true,您可以获得数组输出。无论如何,这是默认设置。您可能需要转置输出以获得串联的单个字符串。
猜你喜欢
  • 1970-01-01
  • 2013-10-03
  • 2011-07-17
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多