用MATLAB计算均方位移(msd)

时间:2011-09-20 17:16:14

标签: matlab

这是生物学家matlab入门课程的一部分。我有一个矩阵的数据点(对于单个粒子!)有4列(时间,x,y,z)和几千行。我想要做的是使用所有时间步长的xyz坐标计算粒子的均方位移。 MSD定义为MSD = average(r(t)-r(0))^ 2其中r(t)是粒子在时间t的位置,r(0)是初始位置,所以在某种意义上它是粒子在时间间隔t内行进的距离。这就是我到目前为止所拥有的。我显然是一个MATLAB新手,我非常感谢som的帮助/输入。

dx=zeros(length(data),1);   %Create space for displacements.
dy=zeros(length(data),1);
dz=zeros(length(data),1);

for i=1:length(pos) 
    dx(i)=data(i+1,2)-data(1,2);   %Calculate the distance at each time step
    dy(i)=data(i+1,3)-data(1,3);   %back to the origin.
    dz(i)=data(i+1,4)-data(1,4);
end

接下来我需要做的是计算这些值的均方。但令我担心的一件事是,如果粒子的初始位置保持不变,那么数据矩阵中的大部分信息会被忽略。我认为沿着这些线的算法可以更好地使用(更准确,更好的统计数据)数据,但我不是一个经验丰富的程序员来实现它......

注意:dt = delta t =时间步长,Pos =位置

  • 计算Pos 2和Pos 1之间的位移(dt = 1)
  • 计算Pos 3和Pos 1之间的位移(dt = 2)
  • 计算Pos 4和Pos 1之间的位移(dt = 3),依此类推......

现在将每个位置与Pos 2进行比较。

  • 计算Pos 3和Pos 2之间的位移(dt = 1)
  • 计算Pos 4和Pos 2之间的位移(dt = 2)
  • 计算Pos 5和Pos 2之间的位移(dt = 3),依此类推......

现在将每个位置与Pos 3进行比较

  • 计算Pos 4和Pos 3之间的位移(dt = 1)
  • 计算Pos 5和Pos 3之间的位移(dt = 2)
  • 计算Pos 6和Pos 4之间的位移(dt = 3),依此类推......

位置4 ......

  • 计算Pos 5和Pos 4之间的位移(dt = 1)
  • 计算Pos 6和Pos 4之间的位移(dt = 2)......等数千行。

这样每个dt会有更多的数据点。对其他人这样做是否有意义?这会使计算减少“嘈杂”(即使msd与时间的关系曲线更平滑吗?)也许有一些方便的matlab函数可以使这个问题更容易?我真的很感激一些意见。

2 个答案:

答案 0 :(得分:5)

如果你只计算相对于第一个位置的位移,那么你实际上没有平均值,因为MSD(1)是你的物体在一个时间步长内行进的平均距离。所以你的推理就是现实。

但是,我会以相反的方式计算MSD:获得dt = 1(1-2,2-3,3-4,...)和平均值的所有位移。这是MSD(1)。然后,你得到dt = 2(1-3,2-4,...)和平均值的所有位移。这是MSD(2)。等等。

Matlab的一个有用属性是你可以对一些计算进行矢量化,即对整个数组进行计算,而不是逐个元素地进行计算。因此,如果您有一个100乘1坐标的数组a,则每个坐标与下一个坐标之间的差异为b=a(2:100)-a(1:99),或更一般地b=a(2:end)-a(1:end-1),因此{{1} }是b(1)a(2)-a(1)b(2)等。

要从数组a(3)-a(2)计算MSD(我假设时间相等!),你会写

data

答案 1 :(得分:0)

请注意,可以使用MATLAB类进行MSD分析: MSD analyzer,包括extensive documentation and tutorials

基本用法:

ma = msdanalyzer(2, SPACE_UNITS, TIME_UNITS);
ma = ma.addAll(tracks);
ma = ma.computeMSD;