如何在不进行排序的情况下找到矢量中2个最小元素的索引?

时间:2014-09-17 04:05:09

标签: matlab sorting vector

我正在尝试找到1xn向量的两个最小元素。问题在于我无法对其进行排序,因为索引线性地依赖于值(因此对值进行排序将会导致原始索引)和0可以是其中一个元素。此外,元素可以重复。这是我的代码的简化示例:

a = [1,5,8,7,1];

find(a==min(a))

ans =

 1     5

对于a,这是我期待的答案。

b = [0,8,6,1,9];

find(b==min(b))

ans =

 1

对于b,我需要它来找到0和1所以它应该分别给我1和4指数。提前谢谢!

2 个答案:

答案 0 :(得分:6)

您应该使用sort的第二个输出

>> [~,idx] = sort(a);
>> idx(1:2)
ans = 
  1  5
>> [~,idx] = sort(b);
>> idx(1:2)
ans = 
  1  4

答案 1 :(得分:6)

Phil Goddard的回答是完全可以接受的。但是,您确实说过要在不进行排序的情况下执行此操作,因此我假设您根本不想使用sort函数。您可以做的是使用min两次。在第一次调用它并找到最小元素的索引后,您可以将数组中的此位置设置为NaN,然后再运行min。通过将位置设置为NaN,您将有效地跳过在该时间点等于最小值的元素。第二次调用min后,您将获得第二个最小元素。

之后您需要做的一件小事就是在第一次NaN通话后清除您在数组中设置的min。您可以通过提取第一次调用后的最小值以及此最小值所在的位置来执行此操作。在您第二次致电min后,您需要将第一个最小值从NaN的位置重置为其原始值。

换句话说:

a = [1,5,8,7,1];
[min1,ind1] = min(a);
a(ind1) = NaN;
[~,ind2] = min(a);
a(ind1) = min1; %// Copy back to ensure we get original data back

ind1ind2将包含a中两个最小值的位置。以你的例子,我得到:

disp([ind1 ind2])

1     5

同样,对于b,这是我们使用上述代码获得的:

disp([ind1 ind2])

1     4