需要解释关于moran进程的matlab代码片段

时间:2012-08-24 06:47:15

标签: matlab

我是Matlab的新手。我正在阅读这段代码片段,但在某些部分(标有星号)我不明白这意味着什么,所以如果有人能提供帮助将非常感激

function [A1nmb] = moran(initsize, popsize) 
% MORAN generates a trajectory of a Moran type process 
%  which gives the number of genes of allelic type A1 in a population 
%  of haploid individuals that can exist in either type A1 or type A2.
%  The population size is popsize and the initial number of type A1 
%  individuals os initsize. 
%  Inputs: initsize - initial number of A1 genes
%          popsize - the total population size (preserved)

if (nargin==0)
  initsize=10;
  popsize=30;
end

A1nmb=zeros(1,popsize);
A1nmb(1)=initsize;

**lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');
mu = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');**

x=initsize;
i=1;
while  (x>1 & x<popsize+1)
  if (lambda(x,popsize)/(lambda(x,popsize)+mu(x,popsize))>rand)
   x=x+1;
   A1nmb(i)=x;
  else
   x=x-1;
   A1nmb(i)=x;
  end;
  i=i+1;
end;
nmbsteps=length(A1nmb);
***rate = lambda(A1nmb(1:nmbsteps-1),popsize) ...
        +mu(A1nmb(1:nmbsteps-1),popsize);***  

**jumptimes=cumsum(-log(rand(1,nmbsteps-1))./rate);**
jumptimes=[0 jumptimes];

stairs(jumptimes,A1nmb);
axis([0 jumptimes(nmbsteps) 0 popsize+1]);

2 个答案:

答案 0 :(得分:2)

您标记的第一行

lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');

创建一个称为内联函数的东西。它等同于定义数学函数。示例:

y = inline('x^2')

允许你这样做

>> y(2)
4

这会立即解释您标记的第二行。

rate = lambda(A1nmb(1:nmbsteps-1),popsize) ...
    +mu(A1nmb(1:nmbsteps-1),popsize);

将计算lambda(x,N)x = A1nmb(1:nmbsteps-1)处的函数N = popsize的值。

我将在此立即说明您应该查看anonymous functions,这是一种与inline完全相同的格式。只是,匿名函数通常得到更好的支持,并且通常比inline函数快得多。

然后,对于最后一行,

jumptimes = cumsum(-log(rand(1,nmbsteps-1))./rate);

是嵌套命令。 rand将创建一个包含伪随机数的矩阵,log是自然对数("ln"),cumsum创建一个新矩阵,其中新矩阵中的所有元素都是输入矩阵中元素的累积和。

您会发现命令dochelp非常有用。尝试输入

doc cumsum 

help inline

在Matlab命令提示符下。使用形成前一个语句的命令再次尝试。

作为一般建议:花费 疯狂大量时间阅读文档。实际上,对于您遇到的每个新命令,请阅读它并在沙盒中使用它,直到您感觉到它为止。如果你知道它的所有命令,Matlab只会变得强大,并且有一个很多来了解。

答案 1 :(得分:0)

它定义了一个内联函数对象。例如这个

 lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N')

将lambda定义为具有2个变量的函数。当您调用lambda(A,n)时,Matlab只需展开您在第一个字符串中定义的函数。因此lambda(A,n)使用您在函数调用中提供的变量。 lambda(A,n)会评估为:

 (A-1).*(1-(A-1)./n)

它只是使用您提供的参数扩展功能。请查看此链接以获取更具体的详细信息http://www.mathworks.co.uk/help/techdoc/ref/inline.html

cumsum函数只返回沿特定维度的矩阵的累积和。假设我们在向量X上调用cumsum,那么结果中元素i的值等于X中从索引1到i的元素总和。例如X = [1 2 1 3]我们会得到

  AA = cumsum(X);

我们会有

  AA = [1 3 5 8]

有关详细信息和示例http://www.mathworks.co.uk/help/techdoc/ref/cumsum.html

,请参阅此链接