如何在 MATLAB 中找到多个数组的最大值?

How to find the maximum of multiple arrays in MATLAB?

假设我们有一个数组 x。我们可以找到这个数组的最大值如下:

maximum = max(x);

如果我有两个数组,比方说 x 和 y,我可以使用命令找到包含最大值的数组

maximum_array = max(x, y);

假设这个数组是y。然后,我可以使用带参数 y 的 max 命令找到最大值,就像之前使用 x:

maximum_value = max(y);

可以使用以下紧凑的单行命令执行此两步过程:

maximum_value = max(max(x, y));

但是当我们有超过 2 个数组时会发生什么?据我所知, max 函数不允许比较两个以上的数组。因此,我必须对数组对使用 max,然后在中间结果中找到 max(这也涉及使用额外的变量)。当然,如果我有,比方说,50 个数组,这将是——而且确实是——一个乏味的过程。

有没有更有效的方法?

我认为对于一小组数组最简单的方法是列化和连接:

maxValue = max([x(:);y(:)]);

对于某些数据结构(例如元胞数组或结构)中的大量数组,我最好使用简单循环:

maxValue = max(cellOfMats{1}(:));
for k = 2:length(cellOfMats)
    maxValue = max([maxValue;cellOfMats{k}(:)]);
end

对于大量具有不同名称的单独数组的病态情况,我说"don't do that"并将它们放在数据结构中或使用eval循环。

方法 #1

将它们的 column 向量版本沿着 dim-2cat and then use maximium values with max 沿着 dim-2 连接以获得最大值。

因此,假设 xyz 是输入数组,做这样的事情 -

%// Reshape all arrays to column vectors with (:) and then use cat
M = cat(2,x(:),y(:),z(:))

%// Use max along dim-2 with `max(..,[],2)` to get column vector 
%// version and then reshape back to the shape of input arrays
max_array = reshape(max(M,[],2),size(x))

方法 #2

您可以使用 ndims 来查找输入数组中的维数,然后沿着该维的 plus 1 维连接,并且最后沿着它找到 max 以获得最大值数组。这将避免所有的来回重塑,因此可以更高效和更紧凑的代码 -

ndimsp1 = ndims(x)+1                         %// no. of dimensions plus 1
maxarr = max(cat(ndimsp1,x,y,z),[],ndimsp1)  %// concatenate and find max