我正在读取一个mat文件,该文件包含带有计数器的变量,例如a1
,a2
,a3
,b
,c1
和c2
。
我想将数据放入一个字段名为“a”,“b”和“c”的结构中
a=[a1;a2;a3]
,b=b
和c = [c1; c2]
。
算法需要能够做到这一点,而不知道每个变量的计数器的最大值是多少。我怎么能这样做?
答案 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])
计算每个子字符串出现的次数。然后,我们使用这些计数将结构数据分组到单元格数组中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]