Lack of documentation and good comments. Many comments are in Spanish. The program is very particular to the system analyzed here. I have difficulties understanding this code.

Ugly and poorly documented source code. It is not possible to learn from it. Something tells me that there is even a mistake in the PF code since you do not see anywhere where the weights of the sequential importance sampling are updated. Resampling is not programmed.

%reasmple
edges = min([0 cumsum(wk)'],1); % protect against accumulated round-off
edges(end) = 1; % get the upper edge exact
u1 = rand/Ns;

[~, idx] = histc(u1:1/Ns:1, edges);
xk = xk(:,idx); % extract new particles
wk = repmat(1/Ns, 1, Ns); % now all particles have the same weight

%according to Mussao et al., 2001
% compute empirical covariance of particles
emp_cov=cov(xk')';
% form D'*D=emp_cov
dd=cholcov(emp_cov);

nx=size(xk,1);
%unit sphere volume (in two dimensions)
cc=pi;
%form the optimal choice of bandwidth
aa=(8*(1/cc)*(nx+4)*(2*pi^.5)^nx)^(1/(nx+4));
hopt=aa*Ns^(-1/(nx+4));
% form an estimation of continuous pdf via epanechnikov kernel
[f,~] = ksdensity(wk,'npoints',length(wk),'kernel','epanechnikov');
f=f/sum(f);
% compute the cumulative of the continuous distribution
edges = min([0 cumsum(f)],1); % protect against accumulated round-off
edges(end) = 1; % get the upper edge exact
%sample from the inverse of cumulative of continuous density
u1 = rand/Ns;
[~, idx] = histc(u1:1/Ns:1, edges);
ee=xk(:,idx);
%move all samples to centre
ee=ee-repmat(mean(ee,2),1,length(ee));
% adjust resampled particles
xk = xk+hopt*dd*ee; % extract new particles
wk = repmat(1/Ns, 1, Ns);

Dear Dr. Alvarez,
I am using your Particle Filter code and that is great. Right now, I am changing that to solve my problem. The problem has observation likelihood with more than two dimensions. I was wondering how I can model observation likelihood "p_yk_given_xk". Any idea for that will be really appreciated.

add regularized PF
case 'regularized_pf'
%reasmple
edges = min([0 cumsum(wk)'],1); % protect against accumulated round-off
edges(end) = 1; % get the upper edge exact
u1 = rand/Ns;
[~, idx] = histc(u1:1/Ns:1, edges);
xk = xk(:,idx); % extract new particles
wk = repmat(1/Ns, 1, Ns); % now all particles have the same weight
%according to Mussao et al., 2001
% compute empirical covariance of particles
emp_cov=cov(xk')';
% form D'*D=emp_cov
dd=cholcov(emp_cov);
nx=size(xk,1);
%unit sphere volume (in two dimensions)
cc=pi;
%form the optimal choice of bandwidth
aa=(8*(1/cc)*(nx+4)*(2*pi^.5)^nx)^(1/(nx+4));
hopt=aa*Ns^(-1/(nx+4));
% form an estimation of continuous pdf via epanechnikov kernel
[f,~] = ksdensity(wk,'npoints',length(wk),'kernel','epanechnikov');
f=f/sum(f);
% compute the cumulative of the continuous distribution
edges = min([0 cumsum(f)],1); % protect against accumulated round-off
edges(end) = 1; % get the upper edge exact
%sample from the inverse of cumulative of continuous density
u1 = rand/Ns;
[~, idx] = histc(u1:1/Ns:1, edges);
ee=xk(:,idx);
%move all samples to centre
ee=ee-repmat(mean(ee,2),1,length(ee));
% adjust resampled particles
xk = xk+hopt*dd*ee; % extract new particles
wk = repmat(1/Ns, 1, Ns);

Dear Dr. Alvarez,
I am using your Particle Filter code and that is great. Right now, I am changing that to solve my problem. The problem has observation likelihood with more than two dimensions. I was wondering how I can model observation likelihood "p_yk_given_xk". Any idea for that will be really appreciated.
Regards,
Soheil

Comment only