如何按名称对mat文件中的变量进行分组并将其收集到结构中?

时间:2014-01-17 17:47:00

标签: matlab variables mat-file matlab-struct

我正在读取一个mat文件,该文件包含带有计数器的变量,例如a1a2a3bc1c2

我想将数据放入一个字段名为“a”,“b”和“c”的结构中 a=[a1;a2;a3]b=bc = [c1; c2]

算法需要能够做到这一点,而不知道每个变量的计数器的最大值是多少。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

首先,您将使用load函数加载mat文件数据,将其放在结构中。比方说,它给了你以下样本数据:

>> s = struct('a1',1:5,'b',[],'a2',1:5,'a3',1:5,'c1',1:3,'c2',3:5)
s = 
    a1: [1 2 3 4 5]
     b: []
    a2: [1 2 3 4 5]
    a3: [1 2 3 4 5]
    c1: [1 2 3]
    c2: [3 4 5]

然后,我们将使用orderfields按字母顺序排序字段,使用fieldnames查找字段名称,使用regexprep从字段名称中删除所有尾随数字,然后获取使用unique的唯一子串:

>> s = orderfields(s);
>> [strs, inds] = unique(regexprep(fieldnames(s), '\d*$', ''), 'last')
strs = 
    'a'
    'b'
    'c'

inds =
     3
     4
     6

使用unique返回的索引,我们可以通过diff([0; inds])计算每个子字符串出现的次数。然后,我们使用这些计数将结构数据分组到单元格数组中struct2cellmat2cell

>> data = mat2cell(struct2cell(s), diff([0; inds]))
data = 
    {3x1 cell}
    {1x1 cell}
    {2x1 cell}

请注意,我们有一个单元格数组的单元格数组。如果您确定每个子字符串的每个条目集都将正确连接(如我们的示例中所示),则可以使用cellfuncell2mat将它们连接起来,如下所示:

>> data = cellfun(@cell2mat, data, 'UniformOutput', false)
data = 
    [3x5 double]
    []
    [2x3 double]

现在我们有一个矩阵的单元格数组,可以使用cell2struct创建一个新的结构:

>> snew = cell2struct(data, strs)
snew = 
    a: [3x5 double]
    b: []
    c: [2x3 double]