Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!sdd.hp.com!hp-pcd!hpcvra.cv.hp.com!rnews!hpcvbbs!akcs.tasmith From: akcs.tasmith@hpcvbbs.UUCP (Ted A Smith) Newsgroups: comp.sys.handhelds Subject: Re: HP-info/bugs/upgrade Message-ID: <27c1c56b:2100.1comp.sys.handhelds;1@hpcvbbs.UUCP> Date: 20 Feb 91 01:40:05 GMT References: <1991Feb18.222034.3132@bigsur.uucp> Lines: 106 I just happen to have some eigenvalue/eigenvector routines... Here is a quick and dirty eigenvalue/eigenvector decomposition for real symetric matricies. I used the Jacobi method. The termination test is a hack (I just test to see if the eigenvector matrix has changed in a given pass!) I don't have any idea if there is a possibility of non-termination. Eigen takes a real symetric matrix in level 1 and returns the matrix of eigenvectors in level 2 and the eigenvalues are along the diagonal of the matrix in level 1. (The offdiagonal values should be small in relation to the diagonal values.) EClr can be used to 0 the offdiagonal values. EFun takes a real symetric matrix (M) in level 2 and a function of 1 real arg (F) in level 1 and returns F(M) in level 1. For example in analogy with 'SIN(x)^2+COS(x)^2==1': [[ 1 2 3 ] [ 2 4 5 ] [ 3 5 6 ]] DUP \<< SIN \>> EFun DUP * OVER \<< COS \>> EFun DUP * + [[ .999999999981 9.89E-12 -1.881E-11 ] [ 1.188E-11 .999999999959 -3.3E-12 ] [ -1.801E-11 -2.3E-12 .999999999962 ]] Ted A Smith PO Box 6308 Longmont CO 80501 H) (303)651-2092 W) (303)447-1572 HPBBS - akcs user tasmith Feb 6, 1991 %%HP: T(3)A(D)F(.); DIR Eigen \<< DUP IDN SWAP DUP SIZE 1 GET \-> d \<< DO OVER SWAP 1 d 1 - FOR i i 1 + d FOR j DUP { j j } GET OVER { i i } GET - OVER { i j } GET 3 PICK { j i } GET + IF DUP THEN / IF DUP THEN DUP SIGN SWAP ABS DUP SQ 1 + \v/ + / ELSE DROP 1 END DUP SQ 1 + \v/ INV SWAP OVER * DUP NEG 4 PICK IDN { j i } ROT PUT { i j } ROT PUT { i i } 3 PICK PUT { j j } ROT PUT ROT OVER * OVER TRN 4 ROLL * ROT * ELSE DROP2 END NEXT NEXT UNTIL ROT 3 PICK SAME END 1 d FOR i 1 d FOR j IF i j SAME NOT THEN { i j } 0 PUT END NEXT NEXT \>> \>> EFun \<< \-> f \<< Eigen 1 OVER SIZE 1 GET FOR i { i i } DUP2 GET f EVAL PUT NEXT OVER TRN * * \>> \>> EClr \<< DUP SIZE 1 GET \-> d \<< 1 d FOR i 1 d FOR j IF i j SAME NOT THEN { i j } 0 PUT END NEXT NEXT \>> \>> END Sorry about the indentation... Must be a tab stop problem. A casual read indicates no problems however.