MATLAB:遍历多个双精度数组以查找 min/max 值

MATLAB: Iterating through multiple double arrays to find min/max value

我目前正在尝试在 Matlab 上查找 5 个不同的 2x1 双精度数组的 min/max 值。我在下面写了一个有效的函数,返回列出的所有 5 个数组的最小值和最大值。然而,它看起来又长又笨重。我想知道是否有更有效的方法来做到这一点?

我正在考虑制作一个数组数组,但我不想复制所有数据并浪费内存来检查最小值和最大值。

对此有什么想法吗?谢谢!

%% Finds min/max Lat values
function results = FindRanges(hObject,handles)

% Min of Latitudes
minLat = TG_Lat;
if min(handles.AC_Lats(:)) < minLat
    minLat = min(handles.AC_Lats(:));
end
if min(handles.MS_Lats(:)) < minLat
    minLat = min(handles.MS_Lats(:));
end
if min(handles.DL_Lats(:)) < minLat
    minLat = min(handles.DL_Lats(:));
end
if min(handles.PI_Lats(:)) < minLat
    minLat = min(handles.PI_Lats(:));
end
if min(handles.EM_Lats(:)) < minLat
    minLat = min(handles.EM_Lats(:));
end

% Max of Latitudes
maxLat = TG_Lat;
if max(handles.AC_Lats(:)) > maxLat
    maxLat = max(handles.AC_Lats(:));
end
if max(handles.MS_Lats(:)) > maxLat
    maxLat = max(handles.MS_Lats(:));
end
if max(handles.DL_Lats(:)) > maxLat
    maxLat = max(handles.DL_Lats(:));
end
if max(handles.PI_Lats(:)) > maxLat
    maxLat = max(handles.PI_Lats(:));
end
if max(handles.EM_Lats(:)) > maxLat
    maxLat = max(handles.EM_Lats(:));
end

results = [minLat, maxLat];

我当前的回答假设我认为您的 handles 对象就是这种情况,即它只包含与此任务相关的信息。如果不是这种情况,那么这将不起作用,因为它会遍历 handles 对象的所有属性。

data = [TG_Lat,structfun(@(x)x(1),handles)';TG_Lat,structfun(@(x)x(2),handles)'];
results = [ min(min(data)),max(max(data)) ];

我还想补充一点,虽然代码有点笨重并没有错,但您对 min()max() 的调用太多了。除了矢量化(在这种情况下可能不会显着改变性能),避免为相同结果调用相同函数两次(在 if 和赋值中)似乎是一个好习惯。

编辑 1 实际上,struct2array 似乎会更简单,看看 Cris Luengo 的答案,将数据放在一维中也可以,所以这里有另一个答案使用了他们的一些答案;)(我希望这很酷。)

data = [TG_Lat([1;1]),struct2array(handles)];
results = [min(data(:)),max(data(:))]

复制 5 个 2x1 数组没什么大不了的。这甚至可能比调用 maxmin 函数 5 次更有效(函数调用开销在 MATLAB 中仍然是真实存在的)。所以你可以这样做:

data = [handles.AC_Lats(:); handles.MS_Lats(:); handles.DL_Lats(:); ...
        handles.PI_Lats(:); handles.EM_Lats(:)];
results = [min(data), max(data)];

如果数组(可能)更大,您可以这样做:

minLat = min([min(handles.AC_Lats(:)), min(handles.MS_Lats(:)), min(handles.DL_Lats(:)), ...
              min(handles.PI_Lats(:)), min(handles.EM_Lats(:))]);
maxLat = max([max(handles.AC_Lats(:)), max(handles.MS_Lats(:)), max(handles.DL_Lats(:)), ...
              max(handles.PI_Lats(:)), max(handles.EM_Lats(:))]);
results = [minLat, maxLat];

这与您所做的相同,但使用内置的 minmax 函数而不是将它们写出来。

PS:我忽略了你的TG_Lat,不知道那是干什么用的。目前它看起来像第 6 个数据元素,但问题文本中没有描述它。