Вот эффективное решение с использованием функций UNIQUE и ACCUMARRAY :
%# sample matrix, sorted by first column
mat = [randi([1 5],[20 1]) (1:20)' rand(20,1)]; %'
mat = sortrows(mat);
%# extract last N rows from each unique ID
N = 4;
[~,~,subs] = unique( mat(:,1) ); %# index into unique values
fcn = @(x){ x(max(1,end-N+1):end) }; %# at most last N values
ind = accumarray(subs, 1:numel(subs), [max(subs) 1], fcn);
ind = cell2mat( ind(cellfun(@numel,ind) >= 4) ); %# keep only those with 4+ count
result = mat(ind,:)
Используя третий вывод функции UNIQUE, мы получаем для каждой строкииндекс в список уникальных идентификаторов.Затем мы распределяем индексы строк в ячейки (массив ячеек) на основе этих индексов.Мы берем последние четыре индекса из каждого бина и фильтруем их с менее чем 4 случаями.Затем мы объединяем их все в один вектор индексов строк.Наконец, мы используем его для получения соответствующих строк из исходной матрицы.
Используя приведенный выше пример, мы генерируем следующую матрицу:
mat =
1 2 0.70199
1 6 0.46313
1 7 0.98821
1 12 0.15645
1 13 0.67037
1 16 0.86966
2 8 0.63491
2 9 0.076501
2 15 0.55076
2 17 0.44727
2 19 0.30587
3 5 0.91502
3 10 0.97322
3 20 0.48231
4 3 0.45633
4 4 0.12363
4 11 0.18319
4 14 0.36045
5 1 0.36708
5 18 0.63084
, и в результате получилось:
result =
1 7 0.98821
1 12 0.15645
1 13 0.67037
1 16 0.86966
2 9 0.076501
2 15 0.55076
2 17 0.44727
2 19 0.30587
4 3 0.45633
4 4 0.12363
4 11 0.18319
4 14 0.36045