Matlab结构体中无需cell2mat计算移动平均值最大值的方法
解决方案
完全可以不用cell2mat实现需求,核心思路是借助cellfun,将移动平均计算+最大值提取的逻辑封装成函数,直接作用于每个单元格元素。以下是具体实现步骤:
1. 定义移动平均+最大值的函数
假设你需要对12×4矩阵按行维度(比如行代表时间步)计算窗口大小为3的移动平均,再提取该移动平均结果中的最大值,可以用MATLAB内置的movmean函数简化实现:
% 匿名函数:输入矩阵→计算行方向移动平均→取全局最大值 mov_avg_max_fun = @(mat) max(movmean(mat, 3, 1), [], 'all');
- 若需要按列维度计算移动平均,只需把
movmean的第三个参数改为2:movmean(mat, 3, 2) - 若不想用内置函数,也可以用
conv2自定义移动平均:% 自定义窗口3的行方向移动平均(same模式保持输出维度) custom_mov_avg = @(mat) conv2(mat, ones(3,1)/3, 'same'); mov_avg_max_fun = @(mat) max(custom_mov_avg(mat), [], 'all');
2. 结合cellfun处理结构体中的单元格
假设你的结构体data_struct包含8个字段(比如field1到field8),每个字段是一个12×4的数值矩阵:
% 先把结构体的所有目标字段收集到cell数组中 cell_array = {data_struct.field1, data_struct.field2, data_struct.field3, data_struct.field4, ... data_struct.field5, data_struct.field6, data_struct.field7, data_struct.field8}; % 用cellfun批量处理每个单元格 per_cell_max = cellfun(mov_avg_max_fun, cell_array); % 最后提取所有移动平均值中的全局最大值 global_max = max(per_cell_max);
如果你的结构体是结构体数组(比如data_struct(1)到data_struct(8),每个元素的data字段是12×4矩阵),代码可以更简洁:
per_cell_max = cellfun(mov_avg_max_fun, {data_struct.data}); global_max = max(per_cell_max);
整个流程全程不需要将cell数组转换为数值矩阵,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Shika93
相关产品推荐
相关产品推荐

