如何在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: 我需要下面每个答案的作品,所以这里的解决方案这为我工作:
allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);
然后,从gnovice:
allNames = vertcat(allNames{:});
由于两个!
关于您的单元格内容的一些更多细节可能需要更为一般的解决方案,但如果names
属性总是返回一个单元格数组的字符串,并且您的结构都是标量(即,1×1的结构数组),然后使用CELLFUN,CHAR和CELLSTR以下解决方案将让您包含所有名称的字符串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{:}];
试试这个
allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false)
略去UniformOutput变量参数直串联。这给出了一个单元格输出。
是结构标量(即1-by-1),还是可以是结构*数组* *? – gnovice 2011-05-17 03:10:33
是的,结构是1x1。 – PengOne 2011-05-17 16:14:08