Optymalizacja filtra znaczników czasu w programie MATLAB - Praca z bardzo dużymi zestawami danych

Piszę program w MATLAB (musi używać MATLAB-a i nie może naprawdę używać MEX-a) do filtrowania bardzo dużych ilości danych.

Jeden z filtrów, które muszę zaimplementować, wymaga porównania wektora znacznika czasu z listą znanych „złych” czasów, wokół których nie mogą wystąpić inne znaczniki czasu.

Typowy wektor znacznika czasu ma około 2 000 000 wpisów i mam listę około 300 000 „złych czasów”.

Oto przykład pracy, jeśliTIME=[1, 2.3, 5.5, 9.1, 10];, iBAD_TIMES=[5.2, 9.3];i mamy tolerancjętolerance=0.25;, a następnie wszystkie znaczniki czasu wTIME pomiędzy4.95 and 5.45 i9.05 and 9.55 należy usunąć. Oznacza to, że oczyszczony wektorTIME_CLEAN powinien być równyTIME_CLEAN=[1, 2.3, 5.5, 10];.

Ten problem jest prosty do rozwiązania i rozwiązałem go na około 4 lub 5 różnych sposobów. Jednak w przypadku zadania ze znacznikiem czasu o wartości 1 000 000 ten problem może z łatwością potrwać godzinę.

Staram się rozwiązać ten typ problemu w czasie krótszym niż 2 minuty na typowej stacji roboczej Core-i7, aby ten filtr był opłacalny dzięki wielu wejściom czasu.

Zawarłem roboczą wersję tego kodu. Rozumiem wektoryzację kodu i funkcje takie jakbsxfun() może pomóc, ale poprawa jest marginalna w stosunku do rodzaju wydajności wymaganej dla tego filtra.

Czy są jakieś sprytne sposoby na rozwiązanie tego problemu w bardzo skuteczny sposób? Każda pomoc byłaby bardzo mile widziana.

P.S. Poniższy kod jest kompletny; generuje wszystkie dane potrzebne do ustawienia problemu i rozwiązuje go (chociaż BARDZO powoli!). ZmienićNO_OF_TIMESTAMPS zmienna na coś większego (np. 1 000 000), aby zobaczyć, jak się czołga!

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

questionAnswers(3)

yourAnswerToTheQuestion