FUNCTION ORTHO_RANK,A,TAU=tau,H,R,K ;+ ;rankA=Ortho_Rank(A,TAU=tau) is the rank of a matrix A. ;If A is a scalar then rankA=0. tau is the threshold ;for zero values. Default: tau=1e-6. ; ;Uses QR,A,Q,R and counts the number rows of R ;that contain at least one value GE tau. ; ;Arrays H,R,K such that A=H##R##Transpose(K) are ;returned through the arguments if ortho_rank is called ;with rankA=Ortho_Rank(A,TAU=tau,H,R,K) ; ;H. Rhody ;June, 2004 ;- IF N_elements(tau) LE 0 THEN tau=1e-6 sa=Size(A) IF (sa[0] EQ 0) THEN BEGIN H=[1] & R=[A] & K=[1] RETURN,0 ENDIF IF (sa[0] EQ 1) THEN BEGIN QR,Transpose(A),Q,R H=[1] R=Transpose(R) K=Q return,1 ENDIF IF sa[0] EQ 2 THEN BEGIN IF sa[1] LE sa[2] THEN BEGIN ;n <= m case QR,A,Q,R s=total(Abs(R) GE tau,1) rankA=fix(total(s GT 0)) IF rankA LT sa[1] THEN BEGIN QR,transpose(R),QQ,RR H=Q R=Transpose(RR) K=QQ Return,rankA ENDIF K=Identity(s[0]) H=Q Return,rankA ENDIF ELSE BEGIN ;n>m case QR,Transpose(A),Q,R s=total(Abs(R) GE tau,1) rankA=fix(total(s GT 0)) IF rankA LT sa[2] THEN BEGIN QR,transpose(R),QQ,RR H=QQ R=RR K=Q return,rankA ENDIF H=Identity(sa[2]) R=Transpose(R) K=Q Return,rankA ENDELSE ENDIF RETURN,-1 ;Array dimension failure end