Noninvasive Fetal ECG: The PhysioNet/Computing in Cardiology Challenge 2013 1.0.0
(1,379 bytes)
function [pcM, Ucomp] = findPrinComp(Y,blocksize)
[nrow,ncol]=size(Y);
if ncol < nrow % make sure Y is a row matrix
Y=Y';
temp=nrow;
nrow=ncol;
ncol=temp;
end
nblocks=ncol/blocksize;
pcM=zeros(nrow,ncol);
Yred=zeros(ncol,nrow);
Ucomp=zeros(ncol,nrow);
kset=1:4;
epsilon=1e-5;
Ynormalized=Y';
i=1;
[U,S,V]=svd(Ynormalized((i-1)*blocksize+1:i*blocksize,:));
Yrot= U(:,1:4)'*Ynormalized((i-1)*blocksize+1:i*blocksize,:);
[aa,bb]=max(abs(Yrot),[],2);
sg=ones(1,4);
for j=1:4
sg(j)=sign(Yrot(j,bb(j)));
end
Ucomp((i-1)*blocksize+1:i*blocksize,:)=U(:,1:4)*diag(sg);
Yrot= Yrot*diag(1./(diag(S)+epsilon));
Yred((i-1)*blocksize+1:i*blocksize,:)=U(:,kset)*Yrot(kset,:);
[pc,score,latent] = princomp(Y(:,(i-1)*blocksize+1:i*blocksize));
pcM(1:4,(i-1)*blocksize+1:i*blocksize)=pc(:,1:4)';
for i = 2:nblocks
[U,S,V]=svd(Ynormalized((i-1)*blocksize+1:i*blocksize,:));
Yrot= U(:,1:4)'*Ynormalized((i-1)*blocksize+1:i*blocksize,:)*diag(1./(diag(S)+epsilon));
for j=1:4
sg(j)=sign(Yrot(j,bb(j)));
end
Ucomp((i-1)*blocksize+1:i*blocksize,:)=U(:,1:4)*diag(sg);
Yred((i-1)*blocksize+1:i*blocksize,:)=U(:,kset)*Yrot(kset,:);
pc = princomp(Y(:,(i-1)*blocksize+1:i*blocksize));
pcM(1:4,(i-1)*blocksize+1:i*blocksize)=pc(:,1:4)';
end
Ucomp=Ucomp';
end