MATLAB遍历多个双精度数组计算最值的高效实现方法咨询
优化实现方案
方案1:零额外数据拷贝的循环实现(完全符合内存节约要求)
你只需将需要遍历的纬度字段名存为字符串元胞数组,通过循环计算即可,全程不会复制原数组数据,仅占用两个标量的临时内存存储当前最值,代码也大幅精简:
%% Finds min/max Lat values function results = FindRanges(hObject,handles) % 定义需要遍历的纬度字段名,仅存储字符串无数据拷贝 lat_fields = {'AC_Lats', 'MS_Lats', 'DL_Lats', 'PI_Lats', 'EM_Lats'}; % 初始化最值 minLat = TG_Lat; maxLat = TG_Lat; % 遍历所有字段计算 for i = 1:length(lat_fields) current_data = handles.(lat_fields{i})(:); cur_min = min(current_data); cur_max = max(current_data); if cur_min < minLat minLat = cur_min; end if cur_max > maxLat maxLat = cur_max; end end results = [minLat, maxLat]; end
优势说明:
- 没有任何数组级别的数据拷贝,
current_data是Matlab的动态字段引用,指向handles里的原数组,不会额外占用内存 - 代码可维护性强,后续需要新增/移除参与计算的纬度数组,只需要修改
lat_fields元胞数组即可,不需要重复写判断逻辑 - 比原代码少调用一半的
min/max函数,每个数组只算一次最值就同时更新最小和最大值,计算效率更高
方案2:极简写法(适合不在乎极小数组拷贝的场景)
如果你参与计算的都是2x1的小数组,拼接带来的内存开销可以忽略不计,可以用更短的写法:
function results = FindRanges(hObject,handles) all_lats = [TG_Lat; handles.AC_Lats(:); handles.MS_Lats(:); handles.DL_Lats(:); handles.PI_Lats(:); handles.EM_Lats(:)]; results = [min(all_lats), max(all_lats)]; end
该写法代码量最少,5个2x1数组拼接后总长度才10个双精度元素,仅占用80字节额外内存,开销完全可以忽略。
内容的提问来源于stack exchange,提问作者Wallace Borges
相关产品推荐
相关产品推荐

