0

粒子の拡散をシミュレートしています。シミュレートされた座標は、次のような形式でマトリックスに格納されます。

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(およびプログラミング)にあまり精通しておらず、アイデアを思いつきませんでした:)誰か合理的なことを提案できますか? たぶん、データの再編成が役立つでしょうか?すべてのアイデアをありがとう:)

4

2 に答える 2

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))

適切かもしれません。いつものように、「エレガントな」Matlabは最も内側の式から始まり、外側に向かって構築されます。

于 2012-04-09T09:42:16.000 に答える
0

わかりました、それはおそらく最良の解決策ではありませんが、誰かがそれを役立つと思うかもしれません:

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

(この回答に基づく:MATLABを使用した平均二乗ゆらぎ(msd)の計算

美術。

于 2012-04-12T05:36:03.673 に答える