这是生物学家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 3进行比较
位置4 ......
这样每个dt会有更多的数据点。对其他人这样做是否有意义?这会使计算减少“嘈杂”(即使msd与时间的关系曲线更平滑吗?)也许有一些方便的matlab函数可以使这个问题更容易?我真的很感激一些意见。
答案 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;