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

Pau*_*aul 1 sorting matlab vector

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

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

find(a==min(a))

ans =

 1     5
Run Code Online (Sandbox Code Playgroud)

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

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

find(b==min(b))

ans =

 1
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*ard 6

你应该使用sort的第二个输出,

>> [~,idx] = sort(a);
>> idx(1:2)
ans = 
  1  5
>> [~,idx] = sort(b);
>> idx(1:2)
ans = 
  1  4
Run Code Online (Sandbox Code Playgroud)


ray*_*ica 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
Run Code Online (Sandbox Code Playgroud)

ind1并且ind2将包含在两个最小值的位置a.以你的例子,我得到:

disp([ind1 ind2])

1     5
Run Code Online (Sandbox Code Playgroud)

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

disp([ind1 ind2])

1     4
Run Code Online (Sandbox Code Playgroud)