1

我正在读取一个 mat 文件,其中包含带有计数器的变量,例如a1, a2, a3,和.bc1c2

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

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

4

1 回答 1

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])struct2cell然后,我们使用这些计数和和将结构数据分组到一个元胞数组中mat2cell

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

请注意,我们有一个由元胞数组组成的元胞数组。如果您确定每个子字符串的每组条目都将正确连接(如我们的示例中所示),则可以使用cellfun和连接它们cell2mat,如下所示:

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

现在我们有了一个矩阵元胞数组,可以使用以下方法创建一个新结构cell2struct

>> snew = cell2struct(data, strs)
snew = 
    a: [3x5 double]
    b: []
    c: [2x3 double]
于 2014-01-17T18:41:59.383 回答