我想提取col3
上具有最大值并按col2
分组的行。
例如,如果我有:
% col1 col2 col3
M = [112 1 78
112 2 2
120 2 77
101 1 86
112 3 103]
MAX on col3 GROUP BY col2
的结果是(行顺序无关紧要(:
% col1 col2 col3
R = [120 2 77
101 1 86
112 3 103]
实际上我使用的是:
M = sortrows(M,[2,3])
[~,ind] = unique(M(:,2),'last')
R = M(ind,:)
但我发现这个解决方案过于复杂,你有更简单的解决方案吗?我想避免使用matlabtable
。
这可能比最初的解决方案更快,但似乎更复杂:
function out = getmax (x)
[~, out] = max (x);
end
idx = accumarray(M(:,2), 1:size(M,1), [], @(x) x(getmax(M(x,3))));
R = M(idx, :);
编辑:注意,如果M(:,2)
中的值不形成从1
开始的连续正整数范围的排列(并且可能具有重复(,则它们应该由unique
变换。
[~, ~, col2] = unique (M(:,2));
idx = accumarray(col2, 1:size(M,1), [], @(x) x(getmax(M(x,3))));
R = M(idx, :);
使用findgroups和splitapply:
>> G = findgroups(M(:,2));
>> Y = arrayfun(@(x) find(M(:,3)==x),splitapply(@max,M(:,3),G));
>> M(Y,:)
ans =
101 1 86
120 2 77
112 3 103