在矩阵中为每个ID提取“n”行 - MATLAB

时间:2011-10-28 23:21:05

标签: matlab matrix count member

3 个答案:

答案 0 :(得分:2)

以下是使用UNIQUEACCUMARRAY函数的有效解决方案:

%# 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行,但我认为您需要它们。)