私は粒子の拡散をシミュレートしています。次のようにシミュレートされた座標は、フォーマット形式で行列に格納されています。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に流暢ではありません(とプログラミングで)と任意のアイデアを来ることができなかった:)誰かが妥当な何かを提案することができますか?場合によっては、データの再編成が役に立ちますか?すべてのアイデアのための 感謝:)
回答ありがとうございます。しかし、私は完全にあなたのラインを取得していない:SD(2:n、1)=合計(diff(data(:、2:end))。座標はデータ(:5)とデータ(:6)に格納されます。別の問題は、すべての新しいトラックが異なる点から始まっていることです(コードを区別したり、ナンセンスの変位を排除する必要があります。私のコードではNaNを使用しています)。 – Art
ああ、申し訳ありませんが、SD(2、n:1)ではなくSD(2、n:1)なので、SDの最初の列のトラック#では1位、2位、3位...ありがとう – Art
申し訳ありませんが、私のコードスニペットはMatlabで実行したテストデータセットを使用していました。 soonmostを編集します。 –