MATLAB:遍历多个双数组以找到最小值/最大值

问题描述

我目前正在尝试在 Matlab 上找到 5 个不同的 2x1 数组的最小值/最大值。我在下面编写了一个有效的函数,返回列出的所有 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];

解决方法

复制 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 个数据元素,但在问题文本中没有描述。

,

我目前的回答假设我认为您的 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(:))]