在matlab中求次极大元

在matlab中求次极大元,matlab,Matlab,我有一个数组,比如说A=[3 5 6 7]。我知道我可以用max(A)获得这个数组的最大值,它返回7,但是我如何才能从这个数组中获得第二个最大值(6),而不排序或删除第一个最大值呢 B = unique(A); % // Finds unique values and sorts max_2 = B(end-1); % // Second maximum ? 测试: 首先,除非你有非常大的向量,否则使用unique并得到最后的第二个索引 如果希望保

我有一个数组,比如说
A=[3 5 6 7]
。我知道我可以用
max(A)
获得这个数组的最大值,它返回
7
,但是我如何才能从这个数组中获得第二个最大值(
6
),而不排序或删除第一个最大值呢

        B = unique(A);      % // Finds unique values and sorts
        max_2 = B(end-1);   % // Second maximum
?

测试:


首先,除非你有非常大的向量,否则使用unique并得到最后的第二个索引

如果希望保留max元素,且向量不包含NaN,则可以尝试:

[max_value,max_idx] = max(A);  % [3 5 6 7]
A(idx) = NaN;              % [3 5 6 NaN]
second_max_value = max(A); % 6
A(idx) = max_value;        % [3 5 6 7]
如果有多个索引具有相同的最大值,则可以选择包含

if length(max_idx)>1, second_max_value=max_value, end
更新:

根据问题旁边OP的评论,让我补充一下:

您也可以在不更改原始数组的情况下使用排序

[~, idx] = sort(A);
A(idx(end)) % is the max value
A(idx(end-1)) % is the second max value

我可以提出以下棘手的解决方案:

second_max_value = max(A(A~=max(A)))

这里
A(A~=max(A))
将是临时数组,不包含原始数组的最大值。超过此数组的最大接收数。

您对排序的关注点是什么?我这样问是因为你可能过早地试图优化。如果程序运行缓慢,请始终只查找关键瓶颈。由于索引不断变化:(.请看我答案中的更新。抱歉,我没有得到排序。写出显式算法非常简单,你知道,对吗?我猜显式算法将比matlab核心函数慢。所以,我有一个猜测。你可以有线性,1次,迭代解;这很容易做到。或者核心函数线性3次解决方案(Barnaba的解决方案,它无疑比基于排序的解决方案快,并且可能比一次迭代快)。您还在寻找更好的解决方案吗?我在问题中提到,没有删除第一个最大元素:(.hoever tnx对于您的AttentionNP,我的代码不会删除max元素,但会覆盖它。因此,如果您关心解决方案的线性度和内存消耗,它是一个就地操作。您可以检查更新以解决您对使用
排序
的担忧吗?是的,但此更新实际上创建了一个跳过的副本g最大值。(如果matlab没有对其进行优化。)
second_max_value = max(A(A~=max(A)))