Matlab 如何按名称对mat文件中的变量进行分组,并将其收集到结构中?
我正在读取一个mat文件,其中包含带有计数器的变量,例如Matlab 如何按名称对mat文件中的变量进行分组,并将其收集到结构中?,matlab,variables,mat-file,matlab-struct,Matlab,Variables,Mat File,Matlab Struct,我正在读取一个mat文件,其中包含带有计数器的变量,例如a1,a2,a3,b,c1和c2 我想将数据放入一个结构中,其中包含字段名“a”、“b”和“c”,其中 a=[a1;a2;a3],b=b和c=[c1;c2] 算法需要能够做到这一点,而不知道每个变量计数器的最大值是多少。如何执行此操作?首先,使用函数加载mat文件数据,将其放置在结构中。假设这为您提供了以下示例数据: >> s = struct('a1',1:5,'b',[],'a2',1:5,'a3',1:5,'c1',1:3
a1
,a2
,a3
,b
,c1
和c2
我想将数据放入一个结构中,其中包含字段名“a”、“b”和“c”,其中
a=[a1;a2;a3]
,b=b
和c=[c1;c2]
算法需要能够做到这一点,而不知道每个变量计数器的最大值是多少。如何执行此操作?首先,使用函数加载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]
然后,我们将使用按字母顺序排列字段,使用查找字段名,使用从字段名中删除所有尾随数字,然后使用以下命令获取唯一的子字符串:
使用返回的索引,我们可以通过执行diff([0;inds])
计算每个子字符串出现的次数。然后,我们使用这些计数和将结构数据分组到单元数组中:
请注意,我们有一个单元格数组。如果您确信每个子字符串的每一组条目都将正确连接(如我们的示例中所示),则可以使用和将它们连接起来,如下所示:
>> data = cellfun(@cell2mat, data, 'UniformOutput', false)
data =
[3x5 double]
[]
[2x3 double]
现在我们有了一个矩阵单元数组,可以使用以下方法创建一个新结构:
这种方法可行,但原始结构需要按字母顺序排列。如果不是这种情况,请使用[strs,inds]=unique(regexprep(字段名,'\d*$,'','','last');[sortedInds,IX]=分拣(inds);数据=mat2cell(结构单元),差异([0;分类单元]);snew=单元2结构(数据,strs(IX))@user309713:我在文本中提到使用ORDERFIELDS,只是没有在代码中显示。我加了那一行。正确,但是“a10”放在“a1”和“a2”之间。如果像在第一个命令中一样使用sort命令,则情况并非如此。
>> data = mat2cell(struct2cell(s), diff([0; inds]))
data =
{3x1 cell}
{1x1 cell}
{2x1 cell}
>> data = cellfun(@cell2mat, data, 'UniformOutput', false)
data =
[3x5 double]
[]
[2x3 double]
>> snew = cell2struct(data, strs)
snew =
a: [3x5 double]
b: []
c: [2x3 double]