3

基本的にマルコフ連鎖である、matlab で再帰関数を記述する方法 私はそれとMATLABの新しい疑似コードを書いてみました:

関数は次のようになります。

   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
4

1 に答える 1

3

まず、MATLABの再帰的な「HelloWorld」階乗関数:

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、...、last状態を含む列ベクトルであり、次の行で必要です。Arrayfunは、配列の各要素(2番目の引数)に対して関数(最初の引数)を呼び出し、結果をベクトルに詰め込みます。最初の引数は、次の関数を定義するための省略形です。

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では大文字と小文字が区別されるため、関数 "Markov"を定義した場合でも、matlabは"markov"については認識しません。

編集:申し訳ありませんが、私がこの回答を作成している間にコードを更新したため、更新されたバージョンに適用される場合とされない場合があります。

于 2012-11-09T17:45:54.930 に答える