Вы можете использовать splitapply
с анонимной функцией следующим образом.
grouping_col = 2; % Grouping column
maximize_col = 3; % Column to maximize
[~, ~, group_label] = unique(A0(:,grouping_col));
result = splitapply(@(x) {x(x(:,maximize_col)==max(x(:,maximize_col)),:)}, A0, group_label);
result = cell2mat(result); % convert to matrix
Как это работает : анонимная функция @(x) {x(x(:,maximize_col)==max(···),:)}
вызывается splitapply
один раз для каждой группы. Функция предоставляется как входная подматрица, содержащая все строки с одинаковым значением столбца с индексом grouping_col
. Затем эта функция сохраняет все строки, максимизирующие столбец с индексом maximize_col
, и упаковывает их в ячейку. Затем результат преобразуется в матричную форму как cell2mat
.
При вышеупомянутом решении, если для каждой группы есть несколько максимизирующих строк, получается все из них. Чтобы оставить только первый один, замените последнюю строку на
result = cell2mat(cellfun(@(c) c(1,:), result, 'uniformoutput', false));
Как это работает : здесь используется cellfun
для применения анонимной функции @(c) c(1,:)
к содержимому каждой ячейки. Функция просто сохраняет первый ряд. В качестве альтернативы, чтобы сохранить последний ряд, используйте @(c) c(end,:)
. Затем результат преобразуется в матричную форму, снова используя cell2mat
.