如何在MATLAB中连接单元数组的一部分的单元数组?

问题描述:

我有一个单元阵列allData这是Nx1。每个单元格包含一个具有names属性的结构(该名称是一个自定义对象,但如果您愿意,可以将其视为单元格数组的字符串)。我想创建一个包含所有名称的单个单元格数组。例如,如果N = 3,所以allData是一个3×1单元阵列,那么下面将完成我的目标:如何在MATLAB中连接单元数组的一部分的单元数组?

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} ...} 

SOLUTION: 我需要下面每个答案的作品,所以这里的解决方案这为我工作:

Andrew Lazarus

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

然后,从gnovice

allNames = vertcat(allNames{:});

由于两个!

+0

是结构标量(即1-by-1),还是可以是结构*数组* *? – gnovice 2011-05-17 03:10:33

+0

是的,结构是1x1。 – PengOne 2011-05-17 16:14:08

关于您的单元格内容的一些更多细节可能需要更为一般的解决方案,但如果names属性总是返回一个单元格数组的字符串,并且您的结构都是标量(即,1×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属性返回一个单元格数组对象,不一定是字符串,你可以试试这个解决方案,将每个单元格阵列分成一个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{:}]; 
+0

这很棒,如果他们是细胞阵列的字符串,但可悲的是我误导了你。他们是自定义对象的单元阵列。尽管如此,我仍然可以从这种方法中获得一些里程碑。谢谢! – PengOne 2011-05-17 05:30:20

+1

@PengOne:故事的寓意是“记得在你的问题中提供样本数据”。 – 2011-05-17 10:55:39

+0

@Richie Cotton:这个对象是通过几个文件和许多行来定义的,所以它只会覆盖这个问题,它的核心很简单:我如何连接它们本身就是单元阵列中的单元的单元阵列? – PengOne 2011-05-17 16:04:33

试试这个

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

略去UniformOutput变量参数直串联。这给出了一个单元格输出。

+0

只有当单元格数组的元素可以水平连接成结构数组时,操作'[allData {:}]'才会起作用,这意味着首先不需要使用单元数组。 – gnovice 2011-05-17 00:36:38

+0

@PengOne:注意[括号]。但我会尝试一个更通用的解决方案。 – 2011-05-17 15:39:38

+0

试过这个......结果是一个1x3单元阵列,每个单元格都包含我真正希望的一个单元阵列,只是想找到一种方法来连接它们自己! – PengOne 2011-05-17 16:13:34