3

我目前正在尝试在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];
4

2 回答 2

3

复制 5 个 2x1 数组没什么大不了的。这甚至可能比调用maxandmin函数 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 个数据元素,但在问题文本中没有描述。

于 2021-06-14T21:51:06.117 回答
2

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

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

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

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

data = [TG_Lat([1;1]),struct2array(handles)];
results = [min(data(:)),max(data(:))]
于 2021-06-14T21:50:36.080 回答