7

我有一个单元阵列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} ...}

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

安德鲁拉撒路

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

然后,从gnovice

allNames = vertcat(allNames{:});

谢谢两位!!

4

2 回答 2

4

对于更通用的解决方案,需要更多关于单元格内容的详细信息,但如果该names属性始终返回字符串的单元格数组,并且您的结构都是标量(即 1×1 结构数组),那么以下使用CELLFUNCHARCELLSTRallNames的解决方案将为您提供一个包含您所有姓名的 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属性返回对象元胞数组(不一定是字符串)的情况,您可以尝试此解决方案,将每个元胞数组重塑为 M×1 元胞数组,然后将所有元胞垂直连接成 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{:}];
于 2011-05-17T05:10:12.340 回答
1

试试这个

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

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

于 2011-05-17T00:04:35.647 回答