2014-04-13 2 views
1

У меня есть вектор let A размера 100x2. Значения первого столбца A варьируются от 1 до 8. И значения второго столбца являются случайными числами. Итак, первый столбец похож на идентификацию номера кластера. Я хочу сделать это, я хочу получить индекс строк из максимум 8 значений во втором столбце, но которые являются самыми большими в каждом кластере. Таким образом, результат будет самым большим из 8 индексов каждого кластера, это означает, что те самые наибольшие 8 могут быть не самыми большими во всем векторе, потому что может быть кластер один имеет три сверху, а потому, что я беру только один из каждого кластера только самые большие из них будут приняты.Определить индексы максимальных значений кластеров в векторе

Пожалуйста, посоветуйте, как это может быть сделано в MATLAB и дайте мне знать, если какие-либо более подробной информации необходимо

ответ

3

Использование accumarray с пользовательской функции:

%// example data, second columns are random numbers between 0 and 1 
A = [ randi(8,100,1), rand(100,1) ] 

maxima = accumarray(A(:,1), A(:,2), [], @max) 

Она возвращает все максимумы для каждого кластера, но а не их индексы.


Чтобы получить индексы максимумов вам потребуется второй выход функции max, которую я не знаю, если это возможно, чтобы получить при использовании accumarray. Но есть следующий обходной путь:

idx = accumarray(A(:,1), A(:,2), [], @(x) find(A(:,2) == max(x))) 

наконец выход может выглядеть следующим образом:

output = [A(idx,1) idx A(idx,2)] 

output = 

    1.0000 29.0000 0.9319 
    2.0000 18.0000 0.7177 
    3.0000 81.0000 0.9554 
    4.0000 72.0000 0.9127 
    5.0000 55.0000 0.9984 
    6.0000 27.0000 0.7809 
    7.0000 4.0000 0.8598 
    8.0000 14.0000 0.9946 

первой колонке номер кластера, второй индекс каждой максимальной и третьей его стоимости.

+0

, но как получить индекс строк этих значений в матрице 'Ā'? – Tak

+0

Я хочу получить список индексов этих значений в векторе 'A', например, таких 8 значений, находятся в строках 10,34,45,52,55,57,86,87 – Tak

+1

@ user1460166 посмотреть на моем редактировании. Строки в вашем последнем комментарии не помогают без данных – thewaywewalk

2

Чтобы получить максимумы и их расположение, более простая альтернатива, возможно использовать sortrows:

As = sortrows([A (1:size(A,1)).']); %'// 3rd column keeps track of original order 
ind = find(diff([As(:,1); inf])); %// find last occurrence of each column-1 value 
maxValues = As(ind,2); %// maxima 
maxIndices = As(ind,3); %// locations of maxima 
2

sparse массив помогает упростить это далее еще:

s = sparse(1:size(A,1),A(:,1),A(:,2)); 
[m,ii] = max(s) 

Пример:

>> A = [randi(8,100,1) rand(100,1)] 
>> s = sparse(1:size(A,1),A(:,1),A(:,2)); 
>> [m,ii] = max(s); 
>> [ii; full(m)].' 

ans = 

    22.0000 0.9619 
    68.0000 0.9561 
    58.0000 0.9001 
    14.0000 0.9133 
    67.0000 0.9421 
    53.0000 0.9027 
    26.0000 0.8687 
    18.0000 0.9961 

Расположение и значение максимума для каждой строки столбцы в приведенном выше результате.

Примечание: Вы можете также построить s по:

s = spconvert([(1:size(A,1)).' A]) 
Смежные вопросы