【问题标题】:MATLAB: Iterating through multiple double arrays to find min/max valueMATLAB:遍历多个双精度数组以找到最小值/最大值
【发布时间】:2021-08-30 18:07:43
【问题描述】:

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

【问题讨论】:

  • 您的句柄对象是什么样的,您用于最小值/最大值的唯一属性是什么?

标签: arrays matlab max min arrayofarrays


【解决方案1】:

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

【讨论】:

  • 谢谢!您的第一个示例运行顺利。我意识到我在写这个问题时搞砸了:这些数组是 2000x1 数组,所以它们非常笨重。我不确定使用您提供的第一个选项,这种大小的数组是否会对性能产生任何重大影响
  • @WallaceBorges:将这两个选项与您的数组一起计时,然后使用更快的那个。 2000个元素并不大。
【解决方案2】:

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

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(:))]

【讨论】:

  • 迭代handles 的元素的好主意。不知道为什么x(1)x(2) 是分开处理的,而不是直接连接x(:)(一次调用structfun)。如果您连接单个列向量中的所有元素,您只需调用一次min 和一次调用max,而不是两次。不过,+1。
  • @Cris 实际上,我正在编写编辑。感谢 +1 ;) 你是对的,没有理由单独使用它们,我认为我的问题是,当我第一次尝试它时,我错误地读到 OP 使用的是 1x2 矩阵而不是 2x1。在我的示例中,我必须使用 1x2 分隔结果。
  • @sg1234 你的想法会很棒!不幸的是,您是对的,handles 对象对此不起作用。 Handles 是使用 GUIDE 在 Matlab 上构建应用程序时保存所有数据的默认对象,这意味着它不仅处理变量,还保存所有 GUI 元素的标签。所以它会遍历所有内容
猜你喜欢
  • 2020-04-02
  • 2019-05-15
  • 1970-01-01
  • 2020-03-07
  • 2018-07-09
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多