function B=jadeR(X,m); // The original jadeR.m was made programmed // by Jean-Francois Cardoso. // Translation of jadeR.m running under MATLAB. [n,T]=size(X);X=X-mean(X,2)*ones(1,T); [U,D]=spec((X*X')/T);[puiss,k]=sort(diag(D)); //SCILAB's sort is not equivalent to MATLABS's sort! puiss=puiss($:-1:1);k=k($:-1:1); rangeW=n-m+1:n;scales=sqrt(puiss(rangeW)); W=diag(ones(scales)./scales)*U(1:n,k(rangeW))'; //SCILAB's bug? 1./[2;2;2]=[0.5,0,0]! iW=U(1:n,k(rangeW))*diag(scales);X=W*X; dimsym=(m*(m+1))/2;nbcm=dimsym;CM=zeros(m,m*nbcm);R=eye(m,m); Qij=zeros(m,m);Xim=zeros(1,m);Xjm=zeros(1,m);scale=ones(m,1)/T;Range=1:m; for im=1:m; Xim=X(im,:);Qij=((scale*(Xim.*Xim)).*X)*X'-R-2*R(:,im)*R(:,im)'; CM(:,Range)=Qij;Range=Range+m; for jm=1:im-1;Xjm=X(jm,:); Qij=((scale*(Xim.*Xjm)).*X)*X'-R(:,im)*R(:,jm)'-R(:,jm)*R(:,im)'; CM(:,Range)=sqrt(2)*Qij;Range=Range+m;end;end; [V,D]=spec(CM(:,1:m)); for u=1:m:m*nbcm;CM(:,u:u+m-1)=CM(:,u:u+m-1)*V;end; seuil=1/sqrt(T)/100;CM=V'*CM;encore=1;sweep=0;updates=0;g=zeros(2,nbcm); gg=zeros(2,2);c=0;s=0;ton=0;toff=0;theta=0; while encore,encore=0;sweep=sweep+1; for p=1:m-1;for q=p+1:m;Ip=p:m:m*nbcm;Iq=q:m:m*nbcm; g=[CM(p,Ip)-CM(q,Iq);CM(p,Iq)+CM(q,Ip)]; gg=g*g';ton=gg(1,1)-gg(2,2);toff=gg(1,2)+gg(2,1); theta=0.5*atan(real(toff),real(ton+sqrt(ton*ton+toff*toff))); if abs(theta)>seuil; encore=1;updates=updates+1;c=cos(theta);s=sin(theta); G=[c,-s;s,c];pair=[p;q];V(:,pair)=V(:,pair)*G; CM(pair,:)=G'*CM(pair,:); CM(:,[Ip,Iq])=[c*CM(:,Ip)+s*CM(:,Iq),-s*CM(:,Ip)+c*CM(:,Iq)]; end;end;end;end; B=V'*W;A=iW*V;[vars,keys]=sort(sum(A.*A,1));vars=vars($:-1:1);keys=keys($:-1:1); B=B(keys,:);B=B(m:-1:1,:);b=B(:,1);signs=sign(sign(b)+0.1);B=diag(signs)*B; endfunction;