samer@0: function p=mc_fixpt(Pt) samer@0: % mc_fixpt - fixed point of Markov chain (stationary state distribution) samer@0: % samer@0: % mc_fixpt :: [[K,K]]~'transition matrix'-> [[K]]. samer@0: samer@0: samer@0: % for ergodic HMM we want to get stationary distribution samer@0: % use eigenvalues of transition matrix. samer@0: [V,D]=eig(Pt); samer@0: samer@0: % one of the eigenvalues should be 1 samer@0: [dummy,k]=max(-abs(diag(D)-1)); samer@0: samer@0: % check that it is really close samer@0: if abs(D(k,k)-1)>0.001 samer@0: disp('mc_fixpt: failed to find eigenvalue of 1 in '); samer@0: disp(Pt) samer@0: error('mc_fixpt:noeig','failed to find eigenvalue of 1'); samer@0: end samer@0: samer@0: % get eigenvector and flip it over if all negative samer@0: v=V(:,k); if sum(v)<0, v=-v; end samer@0: samer@0: if ~isreal(v) samer@0: disp('mc_fixpt: discarding complex parts of eigenvector'); samer@0: v=real(v); samer@0: end samer@0: if any(v<0) samer@0: %fprintf('mc_fixpt: discarding negative parts of eigenvector: %s\n',mat2str(v(v<0))); samer@0: v=max(0,v); samer@0: end samer@0: samer@0: % final normalisation samer@0: p=v/sum(v);