! examples of matrix operations ! ============================= USE cbmat USE rtchecks COMPLEX M(0..4,0..4),t(0..4),x(0..4) DO M(i,j)=(1.+j*I)**(i) FOR ALL i,j t=0; t(4)=24 ! initialize some arrays and matrices TYPEOF(M(3,*)) temp=M(3,*) M(3,*)=M(0,*) M(0,*)=temp ! swap 0th and 3rd row Lanczos(x,M,t,1E-10) ! solve linear system by Lanczos method WRITE x WRITE ABS(t-M*x) ! and test the result plu=PLU(M) ! Perform LU decomposition with pivoting x=plu\t ! and apply it to solve a linear system WRITE x ! This is faster than storing the inverse. WRITE ABS(t-M*x) ! Test the result TYPEOF(M) M1,M2 ! prepare for copies M1=M;LUdecomp M1 ! LU decomposition (no pivoting) in place x=M1\t ! division to the left, with no stored inverse WRITE ABS(t-M*x) ! and test x=t/M1 ! division to the right WRITE ABS(t-x*M) ! and test DO M2(i,*)=M(i,*)/plu FOR ALL i; WRITE M2 ! divide each row, equivalent to ! right multiplication with the inverse M1=INV(M) ! M1 is the inverse matrix M2($i,$j)=CONJG(M1($i,$k))*M($k,$j); WRITE M2 ! matrix product in Einstein notation STORED ARRAY(0..4,-2..2) OF COMPLEX Ms ! Same operations can be performed ! on STORED arrays Ms(*,*)=M(*,*+2);LUdecomp Ms ! LU decomposition on disk x=Ms\t ! right division WRITE ABS(t-M(*,*+2)*x) ! test x=t/Ms ! left division WRITE ABS(t-x*M(*,*+2)) ! test Ms(*,*)=M(*,*+2);LUdecomp M(*,*+2) x=M(*,*+2)\t ! opposite roles WRITE ABS(t-Ms*x) x=t/M(*,*+2) WRITE ABS(t-x*Ms) ARRAY(1..5,1..5) OF COMPLEX A=1,B=1,C C=A*B ! direct matrix multiplication (use sparingly!) LUdecomp A B=A\C ! and division