灵活地连接细胞

时间:2015-04-24 05:59:13

标签: matlab concatenation

我的结构 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。块。我希望这是有道理的。

非常感谢!

3 个答案:

答案 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