我的结构 P 具有不同数量的单元格。例如, P.Block1.onsets , P.Block2.onsets , P.Block3.onsets , P.Block4.onsets 等。开始是 1x16 个单元格(即有16个单元格),每个单元格包含1x4双。所以P.Block1.onsets {1,2}可能是这样的[12,37,108,226]。 P只包含字段BlockX,没有别的。块是结构,只包含字段'onsets'而不包含任何其他内容。我想连接所有的onsets单元格。我可以这样做:
all_onsets=vertcat(P.Block1.onsets,P.Block2.onsets,P.Block3.onsets,P.Block4.onsets);
然而,块的数量是变量,有时,说我有4,其他时候我可能有6或8.有什么方法可以灵活地做vertcat?输出all_onsets应为nx1,n为16 x no。块。我希望这是有道理的。
非常感谢!
答案 0 :(得分:3)
如果所有字段名称都以row.Cells["Name"] != null && row.Cells["Name"].Value != null
开头,那么您可以使用fieldnames
函数动态提取所有字段名称,然后我们可以遍历每个字段,访问{{ 1}}嵌套字段并连接我们的结果:
Block
第一行代码提取所有字段名称并将它们存储到单元格数组中。接下来,我们将onsets
初始化为空数组,然后对于结构中的每个字段名称,我们得到名称以names = fieldnames(P);
all_onsets = [];
for idx = 1 : numel(names)
all_onsets = vertcat(all_onsets, P.(names{idx}).onsets);
end
开头的字段,然后访问all_onsets
嵌套字段并连接这到Block
。请特别注意我访问onsets
的方式。我们可以创建与您想要的字段一致的动态字符串。最后,我们将所有all_onsets
子字段矩阵连接成一个大的单元格数组。
P
的结果如下所示:
onsets
答案 1 :(得分:3)
创建一个结构数组以摆脱Block*
字段,然后在结果aray中引用onsets
字段以获取以逗号分隔的列表并使用vertcat
:
Q = structfun(@deal, P);
all_onsets = vertcat(Q.onsets);
答案 2 :(得分:1)
首先创建一些假数据。
P.Block1.onsets = {[1, 37, 108, 226] [2, 37, 108, 226]}';
P.Block2.onsets = {[3, 37, 108, 226] [4, 37, 108, 226]}';
然后将P&#39的字段(所有这些块)更改为单元格。
P = struct2cell( P );
然后,您可以使用cellfun
将每个块的开始转换为矩阵。您的输出将是nx4矩阵的垂直单元格。您需要cell2mat
连接并将它们转换为矩阵。
A = cell2mat( cellfun( @(C) cell2mat( C.onsets ), P, 'UniformOutput', false ) );
我的代码生成以下输出。
cellfun =>
[2x4 double]
[2x4 double]
>> cell2mat(A)
ans =
1 37 108 226
2 37 108 226
3 37 108 226
4 37 108 226
如果要将矩阵转换为单元格,可以使用我的rows2cell.m function。