Extract top 10 values from each row

5 Ansichten (letzte 30 Tage)
Saurabh
Saurabh am 10 Okt. 2011
Hello,
I have a matrix and wish to keep only the top 10 values in each row and replace all the other (bottom 90) values with zeros. Is there an efficient way to achieve this?

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 10 Okt. 2011
[sortvals, sortidx] = sort(A,'descend');
B = zeros(size(A),class(A));
for K = 1 : size(A,2)
B(sortidx(1:10,K),K) = sortvals(1:10,K);
end
Yes, it could probably be done without a loop, using sub2ind(), but that would not necessarily be any faster, and would probably be less clear.
  1 Kommentar
Walter Roberson
Walter Roberson am 10 Okt. 2011
Adjusting for rows:
[sortvals, sortidx] = sort(A,2,'descend');
B = zeros(size(A),class(A));
for K = 1 : size(A,1)
B(K,sortidx(K,1:10)) = sortvals(K,1:10);
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Laura Proctor
Laura Proctor am 10 Okt. 2011
This code will keep the top ten rows and replaces everything from the 11th row on with a zero.
A = rand(100);
A(11:end,:) = 0;
  4 Kommentare
Saurabh
Saurabh am 10 Okt. 2011
Oh, I meant 'top 10' as in the maximum 10 values.
Example, for simplicity, consider the top 2 values
A =
1 2 3 4
4 3 2 5
6 5 4 2
1 4 2 3
Then I want the output as
B =
0 0 3 4
4 0 0 5
6 5 4 2
0 4 0 3
Thus, the top two values of each row are kept and others are replaced with zeros.
Saurabh
Saurabh am 10 Okt. 2011
I answered a bit late.
Laura: That method would work, but it destroys the element order. I wish to preserve the order as in above example.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by