Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何按名称对mat文件中的变量进行分组,并将其收集到结构中?_Matlab_Variables_Mat File_Matlab Struct - Fatal编程技术网

Matlab 如何按名称对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

我正在读取一个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,'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]