2012-04-09 2 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으로 유지하십시오.

나는 지구상에서 최악의 느린 방법을 사용하여 계산하고 있습니다 - 몇몇에 의해 루프 :

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) = 합계 (diff (data (:, 2 : end)). 2,2,2). 좌표는 데이터 (:, 5) 및 데이터 (:, 6)에 저장됩니다. 또 다른 문제는 모든 새로운 트랙이 다른 지점에서 시작한다는 것입니다. (그래서 코드를 차별화하거나 이러한 넌센스 변위를 제거해야합니다 - 코드에서 NaN을 사용하고 있습니다). – Art

+0

아, 죄송합니다. SD (2, n : 1)가 SD가 아니어야합니다 (SD (2 : n, 1)). 따라서 SD 첫 번째 열의 트랙 #에서 첫 번째, 두 번째, 세 번째 ... 감사합니다. – Art

+0

죄송합니다, 내 코드 조각은 Matlab에서 실행 한 테스트 데이터 세트를 사용했습니다. soonmost를 편집 할 것입니다. –

0

좋아, 그것은 아마도 최선의 해결책은 아니지만, 어쩌면 누군가는 도움이됩니다

(이 답변에 따라 : Calculating mean-squared displacement (msd) with MATLAB)
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 

예술.