Newsgroups: comp.lang.apl
Path: watmath!watserv2.uwaterloo.ca!torn!cs.utexas.edu!usc!sdd.hp.com!elroy.jpl.nasa.gov!decwrl!csus.edu!sfsuvax1.sfsu.edu!vpcsc4
From: vpcsc4@sfsuvax1.sfsu.edu (Emmett McLean)
Subject: Re: Numerical Analysis + APL/J
Message-ID: <1992Aug6.011943.21335@csus.edu>
Sender: news@csus.edu
Organization: San Francisco State University
References: <BEVAN.92Aug3165658@jaguar.cs.man.ac.uk>
Date: Thu, 6 Aug 1992 01:19:43 GMT
Lines: 75

Here is a LU factorization (Gaussian Elimination) routine.
I am sure it can be improved on.  Attached also is a routine
to check the results. Just save this file, invoke J, and then
type 0!:3<'your_file' name to run these programs. (I posted
and cancelled an earlier version which had a bug in the ck
routine.)

Emmett vpcsc4@sfsuvax1.sfsu.edu


   catb =. 'y.' : ' 1 |. y. ; x. '
   com=. ' ''NB. '',y. ': ' 1 |. (com y.); x. '
   print =. 1!:2&2
   m=. com ' z =. lu y.'
   m =. m com  ' <=-><=-> <=-><=-> <=-><=-> <=-><=-> <=-><=-> <=-><=->'
   m =. m com  ' '
   m =. m com  ' Emmett McLean               5 August 92'
   m =. m com  ' Vanilla LU Matrix factorization routine'
   m =. m com  ' Returns a four element vector with boxed elements:
   m =. m com  ' 
   m =. m com  ' Component 0  -:-  L - Lower triangular matrix '
   m =. m com  ' Component 1  -:-  U - Upper triangular matrix '
   m =. m com  ' Component 2  -:-  R - Row exchange matrix '
   m =. m com  ' Component 3  -:-  M - multiply the product of the diagonal'
   m =. m com  '                       elements of U by the scalar M to '
   m =. m com  '                       calculate the determinate of y.'
   m =. m com  '                       if y. is square'
   m =. m com  ' '
   m =. m com  ' ' R +/ .* L +/ .* U  is y. if y. is square'
   m =. m com  ' '
   m =. m com  ' <=-><=-> <=-><=-> <=-><=-> <=-><=-> <=-><=-> <=-><=->'
   m =. m catb ' a =. y.'
   m =. m catb ' l =. u =. 0 0 $ '''''
   m =. m catb ' i =. 0'
   m =. m catb ' id =. =i.   {. $ a'
   m =. m catb ' bv =.  i. , {. $ id'
   m =. m catb ' sign  =.   1'
   m =. m catb 'loop) ".(0 = <./ $ a)# ''$.=. done'''
   m =. m catb ' ".(-. *./0 =, }. {."1 a )#''$.=.s1'''
   m =. m com '  left column of a is all zeros'
   m =. m catb ' u   =. u, < (i # 0 ) ,{. a'
   m =. m catb ' l   =. l, < 1 (i) } ($ {. }. y. )# 0 '
   m =. m catb ' a  =. }."1 }. a'
   m =. m catb ' i   =. >: i'
   m =. m catb ' $.=.loop'
   m =. m catb 's1)'
   m =. m com  ' exchange rows if necessary'
   m =. m catb ' ". ( -. 0 = {. {."1 a)#''$.=.s2'''
   m =. m catb ' s=.''''$ ( </\ -. 0 = ,  {."1 a) # i. {. $ a '
   m =. m catb ' a =.( s, }. 0 (s) } i. , {. $ a) { a'
   m =. m catb ' v =. i (s+i) } bv'
   m =. m catb ' v =. (s+i) i } v'
   m =. m catb ' id =. v { id'
   m =. m catb ' sign  =. sign * _1 '
   m =. m catb 's2)'
   m =. m com  '  update a , l, and u'
   m =. m catb ' l   =. l, < (i # 0 ), f =.  , ({."1 a) % ({. {. a)'
   m =. m catb ' u   =. u, < (i # 0 ) ,{.a'
   m =. m catb ' a  =. (}."1 }. a) - (}.{.a)*"(1 0) }. f'
   m =. m catb ' i   =. >: i'
   m =. m catb ' $.=.loop'
   m =. m catb 'done)'
   m =. m catb ' y.  =. ( < |: >,l ), (< >,u),(<id),(<sign) '
   lu =. m : ''
   n =. com ' ck '''''
   n =. com ' checks lu for random square matrix'
   n =. n catb ' ss =. lu s =. 3 3 $ 9 ? 10'
   n =. n catb ' print s'
   n =. n catb ' print ss'
   n =. n catb ' a =. > 0&{ ss'
   n =. n catb ' b =. > 1&{ ss'
   n =. n catb ' c =. > 2&{ ss'
   n =. n catb ' print '' '''
   n =. n catb ' y. =. c +/ .* (a +/ .* b) '
   ck =. n : ''
