[英]How can I find the indices of the 2 smallest elements in a vector without sorting?
我試圖找到1xn向量的兩個最小元素。 問題是我無法對它進行排序,因為索引線性地依賴於值(因此對值進行排序將使原始索引更復雜)並且0可以是元素之一。 同樣,元素可以重復。 這是我的代碼的簡化示例:
a = [1,5,8,7,1];
find(a==min(a))
ans =
1 5
對於,這是我期待的答案。
b = [0,8,6,1,9];
find(b==min(b))
ans =
1
對於b,我需要它找到0和1,因此應該分別給我1和4作為索引。 提前致謝!
您應該使用sort的第二個輸出,
>> [~,idx] = sort(a);
>> idx(1:2)
ans =
1 5
>> [~,idx] = sort(b);
>> idx(1:2)
ans =
1 4
菲爾·戈達德的答案是完全可以接受的。 但是,您確實說過要在不進行排序的情況下執行此操作,因此我假設您根本不想使用sort
功能。 您可以做的是使用min
兩次。 首次調用它並找到最小元素的索引后,可以將數組中的此位置設置為NaN
,然后再運行min
。 通過將位置設置為NaN
,您將有效地跳過等於該時間點的最小元素。 第二次調用min
之后,您將獲得第二小的元素。
之后您需要做的一件事是清除第一個min
調用后在數組中設置的NaN
。 您可以通過提取首次調用后的最小值以及該最小值所在的位置來實現此目的。 再次調用min
時, NaN
第一個最小值從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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.