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)
解决方案:我需要以下每个答案的部分,所以这里有适合我的解决方案:
allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);
然后,从gnovice:
allNames = vertcat(allNames{:});
谢谢两个!!
对于更通用的解决方案,需要更多有关单元格内容的详细信息,但如果该names属性始终返回字符串单元格数组,并且如果您的结构都是标量(即 1×1 结构体数组),那么以下使用CELLFUN、CHAR和CELLSTRallNames的解决方案将为您提供一个包含您所有姓名的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)