2013-11-27 2 views
-1

У меня есть матрица m-by-n. Для каждой строки, я хочу, чтобы найти положение K наибольших значений, а также установить другие 0.Наибольшие значения в матрице, строка за строкой - matlab

Example, for k=2 
        I WANT 
[1 2 3 5   [0 0 3 5 
4 5 9 3    0 5 9 0 
2 6 7 1]   0 6 7 0 ] 
+3

Не могли бы вы показать нам, что вы пробовали? – rubenvb

ответ

2

Вы можете достичь его легко, используя второй выход sort:

data = [ 1  2  3  5 
     4  5  9  3 
     2  6  7  1 ]; 
k = 2; 

[M N] = size(data); 
[~, ind] = sort(data,2); 
data(repmat((1:M).',1,N-k) + (ind(:,1:N-k)-1)*M) = 0; 

В например, это дает

>> data 

data = 

    0  0  3  5 
    0  5  9  0 
    0  6  7  0 
+0

Хмм, точно не назвал бы это «легко». Существует довольно некоторая обманка индекса ';-)'. Кроме того, я не знал бы, что делает код при чтении, но это может быть связано с моим невежеством Matlab ... – rubenvb

+0

SOLVED: Q = [1,2,3,5; 4,5,9,3; 2,6,7,1]; ......................... k = 0,7; [m, n] = размер (Q); ........................ [SORT, I] = sort (Q, 2, 'descend '); ....................... Q (I> пол (n * 0,5)) = 0; – Giuseppe

+0

@ rubenvb Да, линейная индексация (т. Е. Использование одного индекса для доступа к записям матрицы) немного сложна ... но достаточно мощная, как только вы привыкнете к ней! :-) –

0

Команда prctile вы можете найти пороговое значение для каждой строки.
prctile возвращает процентили значений в строках data и, таким образом, могут быть легко переделаны, чтобы вернуть пороговое значение, выше которого существует k -го крупнейшие элементы в каждой строке:

T = prctile(data, 100*(1 - k/size(data,2)), 2); % find the threshold 
out = bsxfun(@gt, data, T) .* data; % set lower than T to zero 

Для data матрицы, размещенной в вопрос, который мы получаем

>> out 
out = 

0  0  3  5 
0  5  9  0 
0  6  7  0 
Смежные вопросы