2012-11-09 273 views
3

如何在matlab中編寫遞歸函數,它基本上是一個馬爾可夫鏈! 我試圖寫它和僞代碼新MATLABmatlab中的遞歸函數

的功能發生是這樣的:

P= Probability 
    x= status(0,1) 
    Dij= probability to pick a site 
    P(Status of Site(i) being x at next time step)= Summation[P(Status of Site(i) being x at previous time step)*Dij] 

我已經試過代碼,任何人都可以電話我是否其右:

function [t,index]= CopyingInfluenceModel 
%%Define constants 
StatusP1=rand(1,0); 
StatusP0=rand(1,0); 

% Initializing the variables 
t=[]; 
index=[]; 
i=[]; 
%assigining the initial conditions 
t(1)=0; 
%set index no i to 1(initial condition for i=1) 
i=1; 
%% If the probability is zero, terminate while loop 
while p(i)>=0 
%calculate time step for given index no 
t(i+1)= t(i); 
%calculate the status_probability at given time t=(i+1) 
StatusP1(i+1)=StatusP1(i)+sum(StatusP1(i)*Dij); 

%index i increases by 1 to calculate next probability 
i=i+1; 
end 
end 
+0

如果我可能如此大膽(也可能不正確),在我看來,這將更順利地完成沒有遞歸,因爲在生成斐波那契序列的線性解決方案(這是你似乎試圖做的) –

+0

不是斐波那契! – happyme

回答

3

首先在matlab中遞歸的「Hello World」階乘函數:

function result=f(x) 
if (x<=0) 
    result=1; 
else 
    result=x*f(x-1); 
end 

end 

可以這樣調用:

>> f(4) 
ans = 
    24 

不知道太多關於馬爾可夫鏈,我在你的功能是應該做的做一個猜測這裏。首先代碼:

function yourmainscript 
    % state 1 -> state 1: 50% 
    % state 1 -> state 2: 50% 
    % state 2 -> state 1: 25% 
    % state 2 -> state 2: 75% 
    D=[0.5 0.5; 0.25 0.75]; 
    p0=[1; 0]; 

    % Get probability that the system is in state number 1 at time step number 4 
    % given the transition matrix D and the initial probabilities p0 
    P(1,4,D,p0) 
end 

function result=P(state, t, D, p0) 
if t==0 
    result=p0(state); 
else 
    possible_states=(1:length(D))'; 
    result=D(state,:)*arrayfun(@(x) P(x, t-1, D, p0), possible_states); 
end 
end 

參數D和p0描述系統,只是通過未經修改。只要可訪問,使用全局變量或使用函數嵌套功能也適用於它們。

state是一個介於1和你處理的狀態總數之間的整數,t是一個表示時間步長的整數。

在t == 0時,我們可以使用狀態作爲p0的索引來獲得概率。 對於t> 0,我把這個總和改寫爲一個矩陣乘法:

我們需要Dij的行(它是由當前狀態給出的D(state,:))並將它乘以所有概率的向量在最後時間步長可能的狀態。

possible_states=(1:length(D))'; 

是含有1,2,3,列向量...,最後的狀態,並且需要在下一行。Arrayfun調用一個函數(第一個參數)作爲數組的每個元素(第二個參數)並將結果填充到一個向量中。第一個參數是定義下面的函數的簡寫nction:

function result=wrapperfunction(x) 
    % Assume t, D and p0 are in scope and the function P is known 
    result=P(x, t-1, D, p0); 
end 

請注意,MATLAB是大小寫敏感的,所以如果你定義一個函數「馬氏」,那麼MATLAB還沒有現在關於「馬氏」。

編輯:對不起,我在撰寫答案時更新了代碼,因此它可能適用於更新的版本,也可能不適用。