我是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]);
答案 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
创建一个新矩阵,其中新矩阵中的所有元素都是输入矩阵中元素的累积和。
您会发现命令doc
和help
非常有用。尝试输入
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
,请参阅此链接