我正在读取一个mat文件,其中包含有计数器的变量,例如a1、a2、a3、b、c1和c2。
我想将数据放入一个字段名为"a“、"b”和"c“的结构中,其中a=[a1;a2;a3]、b=b和c = [c1; c2]。
算法需要能够做到这一点,而不知道每个变量的计数器的最大值是多少。我该怎么做?
发布于 2014-01-17 18:41:59
首先,使用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]https://stackoverflow.com/questions/21192482
复制相似问题