Noninvasive Fetal ECG: The PhysioNet/Computing in Cardiology Challenge 2013 1.0.0

File: <base>/sources/mhaghpanahi_at_gmail.com/findPrinComp.m (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