0001 function [W,M,R] = gmmbvl_em_step_partial(X,W,M,R,P,n_all,plo)
0002
0003
0004
0005 [n,d] = size(X); n1=ones(n,1);d1=ones(1,d);
0006 if plo
0007 figure(1), plot(X(:,1),X(:,2),'g+');
0008 hold on;
0009 end
0010
0011 Psum = sum(P);
0012
0013 for j = 1:length(W)
0014 if Psum(j) > realmin
0015 W(j) = Psum(j) / n_all;
0016 M(j,:) = P(:,j)' * X ./ Psum(j);
0017 Mj = X-n1*M(j,:);
0018 Sj = (Mj .* (P(:,j)*d1))' * Mj / Psum(j);
0019
0020 L = svd(Sj);
0021 if L(d) > realmin
0022 [Rj,p] = chol(Sj);
0023 if p == 0
0024 R(j,:) = Rj(:)';
0025 end
0026 end
0027
0028 if plo
0029 [U,L,V] = svd(Sj);
0030 phi = acos(V(1,1));
0031 if V(2,1) < 0
0032 phi = 2*pi - phi;
0033 end
0034 plot(M(j,1),M(j,2),'k.',M(j,1),M(j,2),'k+');
0035
0036
0037
0038
0039
0040 end
0041
0042 end
0043 end
0044
0045 if plo
0046 a = (max(X(:,1)) - min(X(:,1))) / 10;
0047 b = (max(X(:,2)) - min(X(:,2))) / 10;
0048 drawnow;
0049 hold off;
0050 end
0051