2 Stimmen

Wie kann ich diesen Timeline-Matching-Code in Matlab optimieren?

Ich habe derzeit zwei Zeitleisten (timeline1 und timeline2), mit passenden Daten (data1 und data2). Die Zeitleisten stimmen fast, aber nicht ganz überein (etwa 90 % der gemeinsamen Werte).

Ich versuche, Werte aus data1 und data2 zu finden, die identischen Zeitstempeln entsprechen (alle anderen Werte werden ignoriert)

Meine erste triviale Implementierung ist wie folgt (und ist offensichtlich furchtbar langsam, da meine Zeitleisten Tausende von Werten enthalten). Irgendwelche Ideen, wie man das verbessern kann? Ich bin sicher, es gibt einen intelligenten Weg, dies zu tun, während die for-Schleife oder die find-Operation zu vermeiden...

% We expect the common timeline to contain
% 0 1 4 5 9
timeline1 = [0 1 4 5 7 8 9 10];
timeline2 = [0 1 2 4 5 6 9];

% Some bogus data
data1 = timeline1*10;
data2 = timeline2*20;

reconstructedData1 = data1;
reconstructedData2 = zeros(size(data1));

currentSearchPosition = 1;

for t = 1:length(timeline1)
   % We only look beyond the previous matching location, to speed up find
   matchingIndex = find(timeline2(currentSearchPosition:end) == timeline1(t), 1);

   if isempty(matchingIndex)
      reconstructedData1(t) = nan;
      reconstructedData2(t) = nan;
   else
      reconstructedData2(t) = data2(matchingIndex+currentSearchPosition-1);
      currentSearchPosition = currentSearchPosition+matchingIndex;
   end   

end

% Remove values from data1 for which no match was found in data2
reconstructedData1(isnan(reconstructedData1)) = [];
reconstructedData2(isnan(reconstructedData2)) = [];

3voto

Itamar Katz Punkte 9454

Sie können die Matlab-Funktion intersect Funktion:

c = intersect(A, B)

2voto

Jonas Punkte 74252

Könnten Sie nicht einfach anrufen INTERSECT ?

commonTimeline = intersect(timeline1,timeline2);
commonTimeline =
     0     1     4     5     9

1voto

Rich C Punkte 3136

Sie müssen die Indizes verwenden, die von intersect .

[~ ia ib] = intersect(timeline1, timeline2);
recondata1 = data1(ia);
recondata2 = data2(ib);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X