matlab:多轨迹的位移计算

时间:2012-04-09 08:26:58

标签: arrays matlab matrix organization

我在模拟粒子的扩散。模拟坐标以矩阵形式存储,格式如下:

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(和编程)并且无法提出任何想法:)任何人都可以提出合理的建议吗?也许一些数据重组会有所帮助? 谢谢你的每一个想法:)

2 个答案:

答案 0 :(得分: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从最里面的表达开始并向外构建。

答案 1 :(得分: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

艺。