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 数组没什么大不了的。这甚至可能比调用 max
和 min
函数 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];
这与您所做的相同,但使用内置的 min
和 max
函数而不是将它们写出来。
PS:我忽略了你的TG_Lat
,不知道那是干什么用的。目前它看起来像第 6 个数据元素,但问题文本中没有描述它。
我目前正在尝试在 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 数组没什么大不了的。这甚至可能比调用 max
和 min
函数 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];
这与您所做的相同,但使用内置的 min
和 max
函数而不是将它们写出来。
PS:我忽略了你的TG_Lat
,不知道那是干什么用的。目前它看起来像第 6 个数据元素,但问题文本中没有描述它。