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

Pen*_*One 7 matlab concatenation cell-array

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

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

allNames = [A.names B.names C.names];
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于N很大并且根据输入而变化,所以我希望有一种聪明的方法可以使用cellfun,但是我尝试过的所有东西都失败了(例如它不起作用)allNames = [cellfun(@(x) {x.names}, allData)];).

更新:由于建议的解决方案,我可以将所有内容放入一个单元阵列中,其中每个单元包含一个单元阵列.我的目标是连接这些.或多或少,我所拥有的是:

{A.names B.names C.names} 
Run Code Online (Sandbox Code Playgroud)

我想要什么,似乎无法得到的是

{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...}
Run Code Online (Sandbox Code Playgroud)

解决方案:我需要以下每个答案的部分,所以这里有适合我的解决方案:

来自Andrew Lazarus:

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

然后,从gnovice:

allNames = vertcat(allNames{:});

谢谢两个!!

gno*_*ice 4

对于更通用的解决方案,需要更多有关单元格内容的详细信息,但如果该names属性始终返回字符串单元格数组,并且如果您的结构都是标量(即 1×1 结构体数组),那么以下使用CELLFUNCHARCELLSTRallNames的解决方案将为您提供一个包含您所有姓名的N×1 字符串元胞数组:

allNames = cellfun(@(x) {char(x.names)},allData);
allNames = cellstr(char(allNames{:}));
Run Code Online (Sandbox Code Playgroud)

这是一个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'
Run Code Online (Sandbox Code Playgroud)

编辑:

推广到属性返回对象names元胞数组(不一定是字符串)的情况,您可以尝试此解决方案,它将每个元胞数组重塑为 M×1 元胞数组,然后将所有元胞数组垂直连接为 N× 1 个对象元胞数组:

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

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

allNames = cellfun(@(x) {reshape(x.names,1,[])},allData);
allNames = [allNames{:}];
Run Code Online (Sandbox Code Playgroud)