【发布时间】:2019-09-15 11:21:57
【问题描述】:
我从头开始创建了这段代码。我想绘制我的“观察到的”和“状态”的图和/或直方图(这些是 2 个矩阵)。在第 200 次迭代时出现了一些问题,其中我的状态矩阵变为全 0,没有数据输入到状态矩阵中。任何人都可以对代码进行故障排除吗?我可能的状态是 {1,2,3}。
更新: 当我调整我的 n 值时,它会调整它将填充多少长度 T。因此,n=5,只运行 T 的 1/5,n=1,运行整个 T 长度。我需要一个 nxT 矩阵最后(5X1000)。问题在于我设置 for 循环的方式。 我仍然无法解决错误。
%Initialize A,pi,T
N = 3; # of states
%A is transition prob matrix
A = [.99,.005,.005;.005,.990,.005;.005,.005,.990];
%pi is initial state vector
pi = [1/3,1/3,1/3];
%T is # of observations per simulation
T = 1000;
%n is # of simulations
n = 5;
%Allocate space for the state matrix
State = zeros(n,T);
Observe = zeros(n,T);
%Create dummy emission matrix, must be row stochastic
B = ones(n,T)./T;
%loop over # of simulations
for i=1:1:n
x = rand(1);
if x <= (1/3)
State(i,1) = 1;
elseif x > (1/3) && x <= (2/3)
State(i,1) = 2;
else
State(i,1) = 3;
end
if State(i,1) == 1
b = -1;
elseif State(i,1) == 2
b = 0;
else
b = 1;
end
Observe(i,1)= normrnd(b,1);
for k=2:1:T
%Possible state 1,2,3
State(k) = randsample(N, 1, true, A(State(k-1),:));
if State == 1
c = -1;
elseif State == 2
c = 0;
else
c = 1;
end
Observe(i,k)= normrnd(c,1);
end
end
【问题讨论】:
-
我刚刚再次运行 T = 200,它停止在第 40 列输入数据。因此,该程序仅适用于状态矩阵长度的前 1/5。我似乎无法弄清楚为什么。
-
if State == 1很可能不会做你想做的事。而State(k)也可能是错误的,应该是State(i,k)。 -
@CrisLuengo 我认为它应该是 State(i,k),但我收到了这个错误:
-
位置 1 的索引无效。数组索引必须是正整数或逻辑值。 hm 中的错误(第 36 行) State(i,k) = randsample(3, 1, true, A(State(k-1),:));
-
确实,
State == 1也是一个大矩阵,而不是布尔值。您在那里也缺少索引。
标签: matlab loops random hidden-markov-models