Матрицадағы әрбір ID үшін «n» жолдарын шығарыңыз - MATLAB

Менде бір идентификаторға бірнеше жол бар матрица бар. Мен тек бір айта кету керек. ID cols 2 Cols тұрады:

mat = [ ...
        2222 1   734771 0.11
        2222 1   734772 0.22
        2222 1   734773 0.33
        2222 1   734774 0.44
        2222 1   734775 0.55
        5555 3   734771 0.11
        5555 1   734772 0.12
        5555 1   734773 0.13
      ] ;

answer --> % [ 2222 1 734772 0.22 ; 2222 1 734773 0.33 ; 2222 1 734774 0.44 ; 2222 1 734775 0.55]

Мен векторланған тәсілді бағалаймын. Рахмет және бақытты Хэллоуин!

1

3 жауаптар

Мұнда 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
Амроға рахмет. Кейбір себептермен сіздің кодыңыз жоғарыда келтірілген мысал үшін дұрыс жұмыс істемейді. Мен біреудің орнына 2 колышты пайдалану үшін бірегей fnc түрін өзгертіп қойдым, бірақ ол әлі де 5555-ді (бұл сан <4 жолдар болғандықтан түсіп кетуі керек). Бағалайсыз.
қосылды автор Maddy, көзі
рахмет! Маған мұқият талдау керек. Мен reshape() және т.б. көмегімен жаңа тәсіл ойлап таптым, бірақ сіздің шешіміңіз әлдеқайда қысқа және талғампаз.
қосылды автор Maddy, көзі
@Maddy: сіздің бастапқы сипаттамаыңыздан 4 бірегей ID идентификаторы бар жолдарды сақтағыңыз келмегені анық емес еді. Жақында түзетуге арналған соңғы түзетуді көріп тұрмын
қосылды автор Amro, көзі
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 жолдың ешқайсысын қайтармадыңыз, бірақ сіз оларды қалайтыныңызға сенемін.)

0
қосылды
Hi Cyborg, жауап үшін рахмет. Мен «5555» -тен шығып кеттім, өйткені ол мысалда қалағандай <4 жолға ие болды!
қосылды автор Maddy, көзі

Сіз көрген ең нәтижелі емес, бірақ ол жұмыс істейді:

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

Егер сізде матрицалар бар болса, сізге бағынышты индексті қосу керек

0
қосылды