【问题标题】:matlab: displacement calculation for multiple trajectoriesmatlab:多轨迹的位移计算
【发布时间】:2012-04-12 13:36:03
【问题描述】:

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

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

【问题讨论】:

    标签: arrays matlab matrix organization


    【解决方案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 一样,从最里面的表达式开始向外构建。

    【讨论】:

    • 感谢您的回答。但是我完全不明白你的意思:SD(2:n,1) = sum(diff(data(:,2:end)).^2,2)。坐标存储在 data(:, 5) 和 data(:, 6) 中。另一个问题是每条新轨道都是从不同的点开始的(所以你必须区分它们或消除这些无意义的位移——在我的代码中我使用的是 NaN)。
    • 哦,对不起,应该是 SD(:, 2:n) 而不是 SD(2:n, 1),所以在 SD 的第一列 track# 中,然后是第 1、第 2、第 3 的位移。 ..n 滞后。谢谢
    • 对不起,我的代码 sn-p 使用了我在 Matlab 上运行的测试数据集。将尽快编辑。
    • 嗯,我的“答案”现在被降级为提示,直到我有时间再看一遍。
    • 谢谢 :) 样本数据集可以在这里下载:link
    【解决方案2】:

    好吧,这可能不是最好的解决方案,但也许有人会觉得它有帮助:

    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

    艺术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多