2012-04-09 4 views
0

Ich simuliere die Diffusion von Partikeln. Simulierte Koordinaten werden in einer Matrix mit einem Format Format gespeichert wie folgt:Matlab: Verschiebung Berechnung für mehrere Trajektorien

data(:, 1) % overall track number 
data(:, 2) % dataset number 
data(:, 3) % individual track number (within dataset) 
data(:, 4) % frame number 
data(:, 5) % xcoordinate 
data(:, 6) % ycoordinate 

Was ich tun möchte, ist eine andere Matrix speichern squared Verschiebungen zu erstellen. Format wird wie:

SD(:, 1) % overall track number (like in data matrix) 
SD(:, 2:n) % squared displacement between 1st and n-th frame 

Beachten Sie, dass Anzahl der Frames innerhalb jeden Datensatz nicht gleich ist. Wenn die Anzahl der Frames in jeder Trajektorie kleiner als n + 1 ist, lassen Sie sie als NaN erhalten.

Ich Berechnung es die schlechteste und langsamste Methode auf der Erde mit - von mehrer für Schleifen:

SD(:, 1) = data(:, 1); 

for i=1:length(data(:, 1)) % I am taking each row 
    for j=1:lagsToCalculate % then every timelag (or n as described above) 
     if j<i % check if enough data from the 1st point 
      if data(i, 3) == data(i-j, 3) % and if it is still the same trajectory 

       % calculate square displacement 
       SD(i,j+1) = (data(i, 5)-data(i-j, 5))^2+(data(i, 6)-data(i-j, 6))^2; 

      else 

       SD(i, j+1) = NaN; % or set to NaN 
      end 
     else 
      SD(i, j+1) = NaN; 
     end 
    end 
end 

Ich bin sicher, dass es eine Milliarde Mal mehr wirksame Methode ist, das zu tun, aber ich bin nicht sehr fließend in Matlab (und Programmierung überhaupt) und konnte nicht mit einer Idee kommen :) Kann jemand etwas vernünftiges vorschlagen? Vielleicht hilft eine Datenreorganisation? Dank für jede Idee :)

Antwort

1

Versuchen Sie folgendes:

SD(:,1) = data(:,1) %as you already have 

dann

SD(2:n,1) = sum(diff(data(:,5:6)).^2,2) 

Ich bin nicht sicher, wie Sie SD initialisieren, aber so etwas wie

SD = zeros(size(data)) 

Macht sei anständig. Ich überlasse es dir, die zweite Zeile oben zu verstehen, wie immer mit 'elegantem' Matlab am innersten Ausdruck beginnen und nach außen bauen.

+0

danke für die antwort. Aber ich verstehe Ihre Zeile nicht vollständig: SD (2: n, 1) = Summe (diff (Daten (:, 2: Ende)).^2,2). Koordinaten werden in Daten (:, 5) und Daten (:, 6) gespeichert. Ein anderes Problem ist, dass jeder neue Track von einem anderen Punkt aus startet (also muss man sie unterscheiden oder diese sinnlosen Verschiebungen eliminieren - in meinem Code verwende ich NaNs). – Art

+0

oh und sorry, sollte SD (:, 2: n) nicht SD (2: n, 1), so in SD erste Spalte Spur # und dann Verschiebung für 1., 2., 3. .... n Verzögerung. Danke – Art

+0

Entschuldigung, mein Codeausschnitt benutzte einen Testdatensatz, den ich auf Matlab laufen ließ. Wird bald bearbeiten. –

0

Ok, es ist vielleicht nicht die beste Lösung, aber vielleicht wird jemand findet es hilfreich:

nData = size(data,1); 
numberOfDeltaT = 10; % use whatever works for you 
squaredDisplacement = zeros(nData, numberOfDeltaT); 
squaredDisplacement(:, 1) = data(:, 1); 

for track=1:max(data(:, 1)) 
    for dt = 1:numberOfDeltaT 
     trackStart = find(data(:, 1)==track,1, 'first'); 
     trackEnd = find(data(:, 1)==track,1, 'last'); 
     deltaCoords = data(trackStart+dt:trackEnd,5:6) - data(trackStart:trackEnd-dt,5:6); 
     squaredDisplacement(trackStart+dt:trackEnd, dt+1) = sum(deltaCoords.^2,2); 
     squaredDisplacement(trackStart:trackStart+dt-1, dt+1) = NaN; 
    end 
end 

(basierend auf dieser Antwort: Calculating mean-squared displacement (msd) with MATLAB)

Art.