wolffd@0: function S = sample_mc_endstate(startprob, trans, endprob) wolffd@0: % SAMPLE_MC_ENDSTATE Generate a random sequence from a Markov chain until enter the endstate. wolffd@0: % seq = sample_mc(startprob, trans, endprob) wolffd@0: wolffd@0: % add an end state wolffd@0: Q = size(trans,1); wolffd@0: transprob = zeros(Q,Q+1); wolffd@0: end_state = Q+1; wolffd@0: for i=1:Q wolffd@0: for j=1:Q wolffd@0: transprob(i,j) = (1-endprob(i)) * trans(i,j); wolffd@0: end wolffd@0: transprob(i,end_state) = endprob(i); wolffd@0: %assert(approxeq(sum(transprob(i,:)), 1)) wolffd@0: end wolffd@0: wolffd@0: S = []; wolffd@0: S(1) = sample_discrete(startprob); wolffd@0: t = 1; wolffd@0: p = endprob(S(t)); wolffd@0: stop = (S(1) == end_state); wolffd@0: while ~stop wolffd@0: S(t+1) = sample_discrete(transprob(S(t),:)); wolffd@0: stop = (S(t+1) == end_state); wolffd@0: t = t + 1; wolffd@0: end wolffd@0: S = S(1:end-1); % don't include end state