Используя 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
функционируйте и затем помещение в использовании правильного места для цикла?
Вероятно, есть лучшие способы сделать это, мой первый подход:
D = rand(8,4)
[val, sub] = max(D)
ind = sub2ind( size(D), sub, 1:4 )
res = false( size(D) )
res( ind ) = true
Вот пример без параметра: 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 ()
).
Я написал расширение к исходной задаче, которое может обрабатывать произвольный многомерный массив и искать максимум по любому заданному измерению.
Я использовал его, чтобы найти равновесие по Нэшу в теории игр. Надеюсь, другие сочтут это полезным.
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