答案 0 :(得分:2)
以下是使用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函数的第三个输出,我们为每一行获取唯一ID列表中的索引。然后我们根据这些下标将行索引分配到bin(cell array)中。我们从每个bin中获取最后四个索引,并过滤少于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
答案 1 :(得分:0)
不是您见过的最有效的实施方式,但它确实有效:
a = [1 1 1 1 2 2 2 2 3 3 ];
b = unique(a);
for i = 1:length(b)
c = b(i);
ind = find(a==c);
last4 = ind(end-1:end) %adjust how many elements you want
end
显然,如果你有一个矩阵,你必须添加列索引,如果你关心的事情
答案 2 :(得分:0)
X=[];
id=ones(size(mat,1),1)==1;
for n=1:4
[~, m, ~]=unique(mat(id,1:2),'rows');
X=[X; mat(m,:)];
id(m)=0;
end
return X
(在您的示例答案中,您没有返回任何5555行,但我认为您需要它们。)