我正在尝试找到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指数。提前谢谢!
答案 0 :(得分:6)
您应该使用sort的第二个输出
>> [~,idx] = sort(a);
>> idx(1:2)
ans =
1 5
>> [~,idx] = sort(b);
>> idx(1:2)
ans =
1 4
答案 1 :(得分:6)
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
ind1
和ind2
将包含a
中两个最小值的位置。以你的例子,我得到:
disp([ind1 ind2])
1 5
同样,对于b
,这是我们使用上述代码获得的:
disp([ind1 ind2])
1 4