2012-04-09 128 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 

我敢肯定有做的十億倍更有效的方法,但我不是很流利的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)) 

威力適當。我會讓你找出上面的第二行,就像往常一樣,'優雅'的Matlab從最內層的表達開始,然後向外擴展。

+0

謝謝你的回答。但是我完全沒有得到你的行:SD(2:n,1)= sum(diff(data(:,2:end))。^ 2,2)。座標存儲在數據(:,5)和數據(:,6)中。另一個問題是,每一個新的軌道是從不同的角度出發(所以你必須區分它們或消除這些無意義的位移 - 在我的代碼中我使用NaN)。 – Art 2012-04-09 10:08:24

+0

哦,對不起,應該是SD(:, 2:n)而不是SD(2:n,1),所以在SD第一列軌道#中,然後是第一,第二,第三...... n滯後位移。謝謝 – Art 2012-04-09 10:10:21

+0

對不起,我的代碼片段使用了我在Matlab上運行的測試數據集。將盡快編輯。 – 2012-04-09 10:10:36

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 

(基於這樣的回答:Calculating mean-squared displacement (msd) with MATLAB

藝術。