Создание матрицы индексов максимальных значений в MATLAB

Используя 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 функционируйте и затем помещение в использовании правильного места для цикла?

6
задан Peter Mortensen 18 January 2010 в 14:11
поделиться

3 ответа

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

D          = rand(8,4)

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

res        = false( size(D) )
res( ind ) = true
7
ответ дан 8 December 2019 в 14:43
поделиться

Вот пример без параметра: http://en.csharp-online.net/CSharp_FAQ: _ How _ call _ a _ method _ using _ a _ name _ string

с параметрами: http://www.daniweb.com/forums/thread98148.html #

в основном передается массив объектов вместе с именем метода. затем используется оба метода с методом Invoke.

Параметры объекта []

-121--1781603-

Если требуется изменить метод, вызываемый во время выполнения, рекомендуется использовать делегат: http://www.codeproject.com/KB/cs/delegates_step1.aspx

Это позволит создать объект для хранения метода, который необходимо вызвать, и передать его другим методам, когда это необходимо.

-121--1781599-

Однострочный ответ:

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

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

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

Обновить:

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

M( cumsum(M)>1 ) = false

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

8
ответ дан 8 December 2019 в 14:43
поделиться

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

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

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

M (:,:, 2) =

 1     0     0
 0     1     1
 0     0     0
1
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: