Optimierung des Zeitstempelfilters in MATLAB - Arbeiten mit sehr großen Datensätzen

Ich schreibe ein Programm in MATLAB (muss MATLAB verwenden und kann kein MEX wirklich verwenden), um sehr große Datenmengen zu filtern.

Bei einem der Filter, die ich implementieren muss, muss ich einen Zeitstempelvektor mit einer Liste bekannter "schlechter" Zeiten vergleichen, um die andere Zeitstempel nicht auftreten können.

Ein typischer Zeitstempelvektor hat ungefähr 2.000.000 Einträge, und ich habe eine Liste von ungefähr 300.000 "schlechten Zeiten".

Hier ist ein funktionierendes Beispiel, wennTIME=[1, 2.3, 5.5, 9.1, 10];, undBAD_TIMES=[5.2, 9.3];und wir haben eine Toleranztolerance=0.25;, dann alle Zeitstempel inTIME zwischen4.95 and 5.45 und9.05 and 9.55 muss gelöscht werden. Dies bedeutet, dass der Vektor gereinigtTIME_CLEAN sollte gleich seinTIME_CLEAN=[1, 2.3, 5.5, 10];.

Dieses Problem ist einfach zu lösen, und ich habe es auf 4 oder 5 verschiedene Arten gelöst. Bei einem Auftrag mit 1.000.000 Zeitstempeln kann die Berechnung dieses Problems jedoch leicht eine Stunde dauern.

Ich versuche, diese Art von Problem auf einer typischen Core-i7-Workstation in weniger als 2 Minuten zu lösen, damit dieser Filter mit so vielen Zeiteinträgen funktioniert.

Ich habe eine funktionierende Version dieses Codes beigefügt. Ich verstehe Code-Vektorisierung und Funktionen wiebsxfun() kann helfen, aber die Verbesserung ist im Verhältnis zu der Art der Effizienz, die ich für diesen Filter benötige, marginal.

Gibt es sehr clevere Möglichkeiten, dieses Problem auf sehr effiziente Weise zu lösen? Jede Hilfe wäre sehr dankbar.

P.S. Der folgende Code ist vollständig; Es generiert alle Daten, die zur Behebung des Problems benötigt werden (wenn auch SEHR langsam!). Ändere dasNO_OF_TIMESTAMPS variabel auf etwas größeres (wie 1.000.000) um es kriechen zu sehen!

clear all %% CLEAR WORKSPACE
close all %% CLOSE FIGURES
clc %% CLEAR COMMAND WINDOW

NO_OF_TIMESTAMPS=10000; %% NUMBER OF TIMESTAMPS IN ORIGINAL DATA

TOLERANCE=2; %% TOLERANCE AROUND TIMESTAMP

A=sort(randi(NO_OF_TIMESTAMPS/10,NO_OF_TIMESTAMPS,1)); %% GENERATE ARTIFICIAL TIMESTAMPS

B=unique(sort(round(randi([NO_OF_TIMESTAMPS/2,NO_OF_TIMESTAMPS*5],[NO_OF_TIMESTAMPS/10,1])/10))); %% GENERATE ARTIFICIAL LIST OF BAD TIMESTAMPS

B_LB=B-TOLERANCE; %% CREATE A LIST OF LOWERBOUND BAD TIMESTAMPS
B_UB=B+TOLERANCE; %% CREATE A LIST OF UPPERBPUND BAD TIMESTAMPS
B_RANGE=[B_LB B_UB]; %% AUGMENTED MATRIX COMPOSED OF VECTORS B_LB and B_UB

A_ROWS=size(A,1); %% SIZE OF A;

B_ROWS=size(B,1); %% SIZE OF B;

tic; %% START TIMER

A_TO_CLEAN=ones(A_ROWS,1); %% BOOLEAN VECTOR TO BE USED IN FILTERING
for ii=1:A_ROWS

    for jj=1:B_ROWS

        if A(ii)>=B_RANGE(jj,1) && A(ii)<=B_RANGE(jj,2) %% CHECK EACH MEMBER OF A VERSUS EACH MEMBER OF B_RANGE

           A_TO_CLEAN(ii)=0; %% SET INDEX VECTOR A_TO_CLEAN = 0 SO THAT WE CAN DELETE LATER

           break; %% A(ii) CAN ONLY BE ERASED ONCE, SO BREAK jj LOOP AND GO TO NEXT ii

        end

    end

end

CLEAN=A(~~A_TO_CLEAN); %% DELETE A VIA LOGICAL INDEXING

toc; %% END TIMER

clearvars -except A B_RANGE CLEAN %% ONLY SHOW RELEVANT VARIABLES

Antworten auf die Frage(3)

Ihre Antwort auf die Frage