获取矩阵中 n 个最大元素的索引

发布于 2024-08-30 02:09:15 字数 160 浏览 3 评论 0原文

假设我有以下矩阵:

01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03

我想要前 5 个元素的索引(在本例中为 32、13、12、11、10)。在 MATLAB 中执行此操作最简洁的方法是什么?

Suppose I have the following matrix:

01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03

And I want the indices of the top 5 elements (in this case, 32, 13, 12, 11, 10). What is the cleanest way to do this in MATLAB?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

避讳 2024-09-06 02:09:15

您可以通过多种方法来执行此操作,具体取决于您想要如何处理重复值。以下是使用 sort

[~, sortIndex] = sort(A(:), 'descend');  % Sort the values in descending order
maxIndex = sortIndex(1:5);  % Get a linear index into A of the 5 largest values

这是一个解决方案,它查找 5 个最大的唯一值,然后查找所有等于这些值的元素(这可以如果有重复值,则应大于 5),使用 uniqueismember

sortedValues = unique(A(:));          % Unique sorted values
maxValues = sortedValues(end-4:end);  % Get the 5 largest values
maxIndex = ismember(A, maxValues);    % Get a logical index of all values
                                      %   equal to the 5 largest values

There are a couple ways you can do this depending on how you want to deal with repeated values. Here's a solution that finds indices for the 5 largest values (which could include repeated values) using sort:

[~, sortIndex] = sort(A(:), 'descend');  % Sort the values in descending order
maxIndex = sortIndex(1:5);  % Get a linear index into A of the 5 largest values

Here's a solution that finds the 5 largest unique values, then finds all elements equal to those values (which could be more than 5 if there are repeated values), using unique and ismember:

sortedValues = unique(A(:));          % Unique sorted values
maxValues = sortedValues(end-4:end);  % Get the 5 largest values
maxIndex = ismember(A, maxValues);    % Get a logical index of all values
                                      %   equal to the 5 largest values
只怪假的太真实 2024-09-06 02:09:15

如果您有一个相当大的数组并且只想要其中的几个元素。这将是我的解决方案。

Arraycopy = Array;
for j = 1:n
   [a, Index(j)] = max(Arraycopy);
   Arraycopy(Index(j)) = -inf;
end
maximumValues = Array(Index);

我认为它应该比排序解决方案更快并且对 RAM 的要求更低。

If you have a rather big array and only want a few elements out of it. This would be my solution.

Arraycopy = Array;
for j = 1:n
   [a, Index(j)] = max(Arraycopy);
   Arraycopy(Index(j)) = -inf;
end
maximumValues = Array(Index);

I think it should be faster and less RAM demanding than the sort solution.

情深已缘浅 2024-09-06 02:09:15

您还可以在 matlabcentral 上找到 matlab 问题的良好答案。我在寻找同样的东西时在那里找到了一个很好的 mex 实现。

它是由 Bruno Luong 使用 C-MEX 实现的部分快速排序算法完成的。复杂度为 O(n + k.log(k)),其中 n 是数组的大小,k 是要选择的元素的数量。对于大尺寸输入,它比 SORT 或多次调用 MIN/MAX 更快。支持多维功能

http://www.mathworks.com/matlabcentral/fileexchange/23576-最小最大选择

You can find good answers to matlab questions also on matlabcentral. I found a good mex implementation there while searching for the same thing.

It is done by Bruno Luong using a partial quick-sort algorithm implemented with C-MEX. The complexity is O(n + k.log(k)), where n is the size of the array, and k is the number of elements to be selected. It is faster than SORT or multiple call of MIN/MAX for large size inputs. Multidimensional capability supported

http://www.mathworks.com/matlabcentral/fileexchange/23576-minmax-selection

假装不在乎 2024-09-06 02:09:15

在 MATLAB ≥ R2017b 中,您可以使用 maxk 出于此特定目的。

[maxvalues, ind] = maxk(A(:), 5);

In MATLAB ≥ R2017b, you can use maxk for this specific purpose.

[maxvalues, ind] = maxk(A(:), 5);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文