Transition Matrix that compares two elements to the next two elements.
    4 views (last 30 days)
  
       Show older comments
    
    Ellie
 on 27 Jul 2015
  
    
    
    
    
    Commented: Walter Roberson
      
      
 on 28 Jul 2015
            Hi all, I am trying to modify this code to create a transition matrix that compares two elements to the next two elements. As of now the code successfully compares two elements to the next one element. I have been trying to modify it, but have not had any luck. Any help would be greatly appreciated. Thanks.
close all
clc
dataset = [1 2 1 1 1 2 2 2 1 1 1 2 2];
precision = 1;
markovChain = (round(dataset/precision)).*precision;
%number of states
Nstates = max(markovChain);
      %get Norder-contiguous sequences of the markov chain
      ngrams = [];
      for i = 0:1
          ngrams = [ngrams, circshift(markovChain,[0 -1*(i)])'];
      end
      ngrams = cellstr(num2str( ngrams));
      ngrams = ngrams(1:end-2);
      %create  all combinations of Norder-contiguous sequences
      [x{1:2}] = ndgrid(1:Nstates);
      %format x to cell
      evalStr = ['xCell = cellstr(num2str(['];
      for i = 1:2
          evalStr = [evalStr 'x{' num2str(i) '}(:) '];            
      end
      evalStr = [evalStr ']));'];
      eval(evalStr);
      %map ngrams to numbers
      [gn,~,g]=unique([xCell;ngrams]);
      s1 = g(Nstates^2+1:end);
      %states following the ngrams
      s2 = markovChain(3:end);
      %get transition matrix
      tm = full(sparse(s1,s2,1,Nstates^2,Nstates^2) );
transitionMatrix = bsxfun(@rdivide, tm, sum(tm,2));
9 Comments
  Walter Roberson
      
      
 on 28 Jul 2015
				I have given a solution in http://uk.mathworks.com/matlabcentral/answers/231381-error-using-accumarray-third-input-sz-must-be-a-full-row-vector-with-one-element-for-each-column-of to the form of the question presented there, which does not use those messy eval().
Accepted Answer
  Azzi Abdelmalek
      
      
 on 27 Jul 2015
        
      Edited: Azzi Abdelmalek
      
      
 on 27 Jul 2015
  
      a=[1 2 1 1 1 2 2 2 1 1 1 2 2];
b=[0 1 0 0; 0.5 0 0 0.5; 1 0 0 0; 0.5 0 0.5 0];
state=[1 1;1 2;2 1;2 2];
q=zeros(4);
for k=1:4
  for p=1:4
        q(p,k)=numel(strfind(a,[state(k,:)  state(p,:)]));
  end
  q(:,k)=q(:,k)/sum(q(:,k));
end
q
The result
q =
         0    0.5000    1.0000    0.5000
    0.5000         0         0         0
         0         0         0    0.5000
    0.5000    0.5000         0         0
0 Comments
More Answers (0)
See Also
Categories
				Find more on Numeric Types in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

