2012-08-24 24 views
0

我是Matlab新手。我讀這個代碼片斷,但在一些地區(標有星號),我不明白是什麼意思,所以,如果有人可以幫助將是非常讚賞需要解釋一下關於moran過程的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

您標記

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); 

將在x = A1nmb(1:nmbsteps-1)N = popsize計算功能lambda(x,N)的值。

我會立刻在這裏說,你應該看看anonymous functions,一種不同的格式用於完成相同的inline。只有匿名函數通常會得到更好的支持,並且通常比功能更快。

然後,對於最後一行,

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

是嵌套命令。 rand將創建一個包含僞隨機數的矩陣,log是自然對數("ln"),而cumsum創建一個新矩陣,其中新矩陣中的所有元素都是輸入矩陣中元素的累加和。

你會發現命令dochelp非常有用。嘗試在Matlab的命令提示輸入

doc cumsum 

help inline 

。再次嘗試使用構成前述語句的命令。

作爲建議的總體字:花瘋狂大量的時間通過文檔閱讀。真的,對於你遇到的每一個新命令,請閱讀並在沙箱中使用它,直到你感覺到你理解它。如果你知道所有的命令,Matlab只會變得強大,並且很多瞭解。

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處的值等於從索引1到iX中的元素總和。例如X = [1 2 1 3]我們會得到

AA = cumsum(X); 

我們將有

AA = [1 3 5 8] 

請參閱此鏈接更多細節和例子http://www.mathworks.co.uk/help/techdoc/ref/cumsum.html

+0

還有一個問題,在(A-1)。*(1-(A-1))./ n)中,該點的含義是什麼。在平等。是點complusory – user824624