2012-04-09 18 views
0

私は粒子の拡散をシミュレートしています。次のようにシミュレートされた座標は、フォーマット形式で行列に格納されています。matlab:複数の軌道の変位計算

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 

私が何をしたいのか、二乗変位を保存する別のマトリックスを作成することです。フォーマットは次のようになります:

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

各データセット内のフレーム数は等しくないことに注意してください。各軌跡のフレーム量がn + 1より小さい場合は、NaNとして保持します。

私は地球上で最悪と最も遅いメソッドを使用して、それを計算しています - いくつかのことでforループ:

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 

私はそれを行うために10億回より効果的な方法があると確信している、しかし、私はmatlabに流暢ではありません(とプログラミングで)と任意のアイデアを来ることができなかった:)誰かが妥当な何かを提案することができますか?場合によっては、データの再編成が役に立ちますか?すべてのアイデアのための 感謝:)

答えて

1

これを試してみてください。そして、

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

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

私はあなたがSDを初期化する方法がわからないんだけど、何か

よう
SD = zeros(size(data)) 

かもしれません適切である。上記の2行目を理解するためにあなたを残しておきます。いつものように、「エレガントな」Matlabは最奥の表現から始まり、外側に構築します。

+0

回答ありがとうございます。しかし、私は完全にあなたのラインを取得していない:SD(2:n、1)=合計(diff(data(:、2:end))。座標はデータ(:5)とデータ(:6)に格納されます。別の問題は、すべての新しいトラックが異なる点から始まっていることです(コードを区別したり、ナンセンスの変位を排除する必要があります。私のコードではNaNを使用しています)。 – Art

+0

ああ、申し訳ありませんが、SD(2、n:1)ではなくSD(2、n:1)なので、SDの最初の列のトラック#では1位、2位、3位...ありがとう – Art

+0

申し訳ありませんが、私のコードスニペットはMatlabで実行したテストデータセットを使用していました。 soonmostを編集します。 –

0

[OK]を、それはおそらく最良の解決策ではないですが、多分誰かがそれが役に立つでしょう:

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 

(この回答に基づいて:Calculating mean-squared displacement (msd) with MATLAB

アートを。