首先是 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,:) ),并将其与最后一个时间步中所有可能状态的概率向量相乘。
The line
possible_states=(1:length(D))';
是包含 1,2,3,...,最后状态的列向量,并且在下一行中需要。 Arrayfun 为数组的每个元素(第二个参数)调用一个函数(第一个参数),并将结果填充到一个向量中。第一个参数是定义以下函数的简写:
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”。
编辑:抱歉,在我撰写此答案时您已经更新了代码,因此它可能适用也可能不适用于更新的版本。