Создание матрицы индексов максимальных значений в MATLAB - PullRequest
6 голосов
/ 17 января 2010

Используя MATLAB , у меня есть массив значений размером 8 строк x N столбцов. Мне нужно создать матрицу одинакового размера, которая подсчитывает максимальные значения в каждом столбце и помещает 1 в ячейку, содержащую максимальное значение, и 0 в другом месте.

Небольшой пример. Предположим, у нас есть массив значений D:

    D =
      0.0088358   0.0040346   0.40276     0.0053221
      0.017503    0.011966    0.015095    0.017383
      0.14337     0.38608     0.16509     0.15763
      0.27546     0.25433     0.2764      0.28442
      0.01629     0.0060465   0.0082339   0.0099775
      0.034521    0.01196     0.016289    0.021012
      0.12632     0.13339     0.11113     0.10288
      0.3777      0.19219     0.005005    0.40137

Тогда выходная матрица для такой матрицы D будет:

    0    0    1    0
    0    0    0    0
    0    1    0    0
    0    0    0    0
    0    0    0    0
    0    0    0    0
    0    0    0    0
    1    0    0    1

Есть ли способ сделать это, не перехватывая вектор индексов из функции max, а затем помещая их в нужное место, используя цикл for?

Ответы [ 3 ]

8 голосов
/ 18 января 2010

Ответ в одну строку:

M = D==repmat(max(D),size(D,1),1)

или более элегантно:

M = bsxfun(@eq, D, max(D))

Обновление:

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

M( cumsum(M)>1 ) = false

, который будет гарантировать, что в случае нескольких максимумов только первый встречающийся имеет соответствующий в выходной матрице (это эквивалентно поведению возвращаемого индекса функции max()).

7 голосов
/ 17 января 2010

Возможно, есть лучшие способы сделать это, мой первый подход:

D          = rand(8,4)

[val, sub] = max(D)    
ind        = sub2ind( size(D), sub, 1:4 )

res        = false( size(D) )
res( ind ) = true
1 голос
/ 06 июня 2010

Я написал расширение для исходной задачи, которое может обрабатывать произвольный многомерный массив и искать максимум по любому указанному измерению.

Я использовал его, чтобы найти равновесие по Нэшу в теории игр. Надеюсь, что другие найдут это полезным.

A = rand([3 3 2]);
i = 1; % specify the dimension of A through which we find the maximum

% the following codes find the maximum number of each column of A
% and create a matrix M of the same size with A
% which puts 1 in the cell that contains maximum value, and 0 elsewhere.

[Amax pos] = max(A, [], i);
% pos is a now 1x3x3 matrix (the ith dimension is "shrinked" by the max function)

sub = cell(1, ndims(A));
[sub{:}] = ind2sub(size(pos), (1:length(pos(:)))');
sub{i} = pos(:);

ind = sub2ind(size(A), sub{:});
M = false(size(A));
M(ind) = true;

Пример:

A (:,:, 1) =

0.0292    0.4886    0.4588
0.9289    0.5785    0.9631
0.7303    0.2373    0.5468

A (:,:, 2) =

0.5211    0.6241    0.3674
0.2316    0.6791    0.9880
0.4889    0.3955    0.0377

M (:,:, 1) =

 0     0     0
 1     1     1
 0     0     0

М (:,:, 2) =

 1     0     0
 0     1     1
 0     0     0
...