Transition Matrix that compares two elements to the next two elements.
    4 次查看(过去 30 天)
  
       显示 更早的评论
    
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 个评论
  Walter Roberson
      
      
 2015-7-28
				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().
采纳的回答
  Azzi Abdelmalek
      
      
 2015-7-27
        
      编辑:Azzi Abdelmalek
      
      
 2015-7-27
  
      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 个评论
更多回答(0 个)
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Numeric Types 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


