systematicR.m
上传用户:hfch80
上传日期:2007-10-25
资源大小:3637k
文件大小:2k
源码类别:

行业发展研究

开发平台:

Matlab

  1. function outIndex = systematicR(inIndex,wn);
  2. % PURPOSE : Performs the resampling stage of the SIR
  3. %           in order(number of samples) steps. It uses the
  4. %           systematic sampling scheme of Carpenter and Clifford.
  5. % INPUTS  : - inIndex = Input particle indices.
  6. %           - wn = Normalised importance ratios.
  7. % OUTPUTS : - outIndex = Resampled indices.
  8. % AUTHORS  : Arnaud Doucet and Nando de Freitas - Thanks for the acknowledgement.
  9. % DATE     : 08-09-98
  10. if nargin < 2, error('Not enough input arguments.'); end
  11. wn=wn';
  12. [arb,N] = size(wn);  % N = Number of particles.
  13. % SYSTEMATIC RESAMPLING:
  14. % ====================
  15. N_children=zeros(1,N);
  16. label=zeros(1,N);
  17. label=1:1:N;
  18. s=1/N;
  19. auxw=0;
  20. auxl=0;
  21. li=0;   % Label of the current point
  22. % Initialisation
  23. T=s*rand(1);
  24. j=1;
  25. Q=0;
  26. i=0;
  27. % Sampling before
  28. u=rand(1,N);
  29. while (T<1)
  30.    if (Q>T)
  31.       T=T+s;
  32.       N_children(1,li)=N_children(1,li)+1;
  33.    else
  34.       % select i uniformly between j and N
  35.       i=fix((N-j+1)*u(1,j))+j;
  36.       % save the associate characteristic
  37.       auxw=wn(1,i);
  38.       li=label(1,i);
  39.       % update the cfd
  40.       Q=Q+auxw;
  41.       % swap 
  42.       wn(1,i)=wn(1,j);
  43.       label(1,i)=label(1,j);
  44.       %wn(1,j)=auxw;
  45.       %label(1,j)=li;
  46.       j=j+1;
  47.    end
  48. end
  49. % COPY RESAMPLED TRAJECTORIES:  
  50. % ============================
  51. index=1;
  52. for i=1:N
  53.   if (N_children(1,i)>0)
  54.     for j=index:index+N_children(1,i)-1
  55.       outIndex(j) = inIndex(i);
  56.     end;
  57.   end;   
  58.   index= index+N_children(1,i);   
  59. end