【发布时间】:2021-12-31 07:27:08
【问题描述】:
我有很多 mat 文件,每个文件都包含一个结构数组s,它具有相同的内部结构。这是您从加载单个文件中获得的s 结构数组之一的最小示例:
s(1).A.a=rand(3);
s(1).A.b=rand(4);
s(1).B =1;
s(2).A.a=rand(3);
s(2).A.b=rand(4);
s(2).B =10;
在实践中,结构数组有 100 个元素,以及数十个字段和子字段。请不要评论按原样保存文件的选择。它不在我的控制范围内,这里的问题是关于如何处理这些文件中的信息。
我最终希望对这些结构数组的每个子字段的所有信息进行平均,因此逻辑步骤是将它们相加(然后除以文件数)。
我目前的解决方案是这样的:
% initialize arrays of the same inner structure as `s`
sum_s_A_a=zeros(size(s(1).A.a,1),size(s(1).A.a,2),numel(s));
sum_s_A_b=zeros(size(s(1).A.b,1),size(s(1).A.b,2),numel(s));
sum_s_B=zeros(1,numel(s));
for jj=1:100 % loop over all 100 files (just for the example)
% load here each file that contains s
for ii=1:numel(s) ; % loop each element in s and add it to sum_s
sum_s_A_a(:,:,ii) = sum_s_A_a(:,:,ii) + s(ii).A.a;
sum_s_A_b(:,:,ii) = sum_s_A_b(:,:,ii) + s(ii).A.b;
sum_s_B(ii) = sum_s_B(ii) + s(ii).B;
end
end
这非常不实用,因为s 中有几十个字段和子字段,但是如果您使用上面定义的s,上面的最小示例适用于“单个文件”情况
我想以与上述 for 循环类似的方式对所有这些文件的信息求和,但不写下所有字段和子字段的名称并将其硬编码为数组名称,并且如果可能的话不for 循环。
我不介意信息的最终容器是结构体、单元格还是数组。
【问题讨论】:
-
结果的类型是什么?结构体还是数值数组?
-
警告您正在使用动态变量名称,即bad, very bad。不要调用你的变量
s1, s2, s3等。如果可能的话,回到你创建所有这些变量的地方(一开始可能是一团糟)并重新考虑你的方法。可能一个取代的结构或单元会更可取。然后,您可以只对其进行索引,而不是试图深入研究动态变量命名的兔子洞。 -
我其实不是,这只是我给出的例子。实际上,我正在阅读具有相同名称
s的 mat 文件,我只想以问题中描述的方式汇总所有 100 个 mat 文件。 -
我也不明白为什么这个问题被关闭了。有一个最小的例子,细节很清楚。问题是关于对具有相同内部结构的结构中的字段求和。
-
我编辑了这个问题,最小的例子有效,我尽可能地简化和澄清了这个问题。
标签: matlab struct vectorization