0

我是 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]);
4

2 回答 2

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

我会马上在这里说你应该看看匿名函数,一种不同的格式用来完成与inline. 只是,匿名函数通常得到更好的支持,并且通常比inline函数快得多。

然后,对于最后一行,

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

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

doc您会发现这些命令help非常有用。尝试输入

doc cumsum 

或者

help inline

在 Matlab 命令提示符下。使用构成上一条语句的命令再试一次。

作为一般建议:花大量时间阅读文档。确实,对于您遇到的每个新命令,请阅读它并在沙盒中使用它,直到您觉得自己理解它为止。Matlab 只有在您了解它的所有命令时才会变得强大,并且有很多东西要了解。

于 2012-08-24T07:07:28.327 回答
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函数仅返回矩阵沿特定维度的累积和。假设我们在向量上调用 cumsum X,那么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

于 2012-08-24T06:58:45.490 回答