我正在读取一个 mat 文件,其中包含带有计数器的变量,例如a1
, a2
, a3
,和.b
c1
c2
我想将数据放入字段名称为“a”、“b”和“c”的结构中,其中
a=[a1;a2;a3]
,b=b
和c = [c1; c2]
.
算法需要能够做到这一点,而不知道每个变量的计数器的最大值是多少。我怎样才能做到这一点?
我正在读取一个 mat 文件,其中包含带有计数器的变量,例如a1
, a2
, a3
,和.b
c1
c2
我想将数据放入字段名称为“a”、“b”和“c”的结构中,其中
a=[a1;a2;a3]
,b=b
和c = [c1; c2]
.
算法需要能够做到这一点,而不知道每个变量的计数器的最大值是多少。我怎样才能做到这一点?
首先,您将使用该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]