如何在MATLAB中连接属于单元格数组的单元格数组?

时间:2011-05-16 22:52:14

标签: matlab concatenation cell-array

我有一个Nx1的单元格数组allData。每个单元格都包含一个具有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{:});

感谢两位!!

2 个答案:

答案 0 :(得分:4)

有关更多通用解决方案所需的单元格内容的更多详细信息,但如果names属性始终返回字符串的单元格数组,并且您的结构都是标量(即1)逐个结构数组),然后使用CELLFUNCHARCELLSTR的以下解决方案将为您提供包含字符串allNames的N-by-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的解决方案逐个单元格数组,然后将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{:}];

答案 1 :(得分:1)

试试这个

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

省略UniformOutput vararg以进行直接连接。这给出了一个单元输出。