我有一个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} ...}
解: 我需要下面的每个答案的部分,所以这里的解决方案对我有用:
allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);
然后,来自gnovice:
allNames = vertcat(allNames{:});
感谢两位!!
答案 0 :(得分:4)
有关更多通用解决方案所需的单元格内容的更多详细信息,但如果names
属性始终返回字符串的单元格数组,并且您的结构都是标量(即1)逐个结构数组),然后使用CELLFUN,CHAR和CELLSTR的以下解决方案将为您提供包含字符串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以进行直接连接。这给出了一个单元输出。