111 lines
2.9 KiB
Rexx
111 lines
2.9 KiB
Rexx
/*REXX program multiplies two matrices together, */
|
|
/* displays the matrices and the result. */
|
|
Signal On syntax
|
|
x.=0
|
|
a=.matrix~new('A',4,2,1 2 3 4 5 6 7 8) /* create matrix A */
|
|
b=.matrix~new('B',2,3,1 2 3 4 5 6) /* create matrix B */
|
|
If a~cols<>b~rows Then
|
|
Call exit 'Matrices are incompatible for matrix multiplication',
|
|
'a~cols='a~cols'<>b~rows='||b~rows
|
|
-- say a~name'[2,2] changed from' a~set(2,2,4711) 'to 4711' ; Pull .
|
|
c=multMat(a,b) /* multiply A x B */
|
|
a~show
|
|
b~show
|
|
c~show
|
|
Exit
|
|
|
|
multMat: Procedure
|
|
Use Arg a,b
|
|
c.=0
|
|
Do i=1 To a~rows
|
|
Do j=1 To b~cols
|
|
Do k=1 To a~cols
|
|
c.i.j=c.i.j+a~element(i,k)*b~element(k,j)
|
|
End /*k*/
|
|
End /*j*/
|
|
End /*i*/
|
|
mm=''
|
|
Do i=1 To a~rows
|
|
Do j=1 To b~cols
|
|
mm=mm C.i.j
|
|
End /*j*/
|
|
End /*i*/
|
|
c=.matrix~new('C',a~rows,b~cols,mm)
|
|
Return c
|
|
/*--------------------------------------------------------------------*/
|
|
Exit:
|
|
Say arg(1)
|
|
Exit
|
|
Syntax:
|
|
Say 'Syntax raised in line' sigl
|
|
Say sourceline(sigl)
|
|
Say 'rc='rc '('errortext(rc)')'
|
|
Say '***** There was a problem!'
|
|
Exit
|
|
|
|
::class Matrix
|
|
/********************************************************************
|
|
* Matrix is implemented as an array of rows
|
|
* where each row is an arryay of elements.
|
|
********************************************************************/
|
|
::Attribute name
|
|
::Attribute rows
|
|
::Attribute cols
|
|
|
|
::Method init
|
|
expose m name rows cols
|
|
Use Arg name,rows,cols,elements
|
|
If words(elements)<>(rows*cols) Then Do
|
|
Say 'incorrect number of elements ('words(elements)')<>'||(rows*cols)
|
|
m=.nil
|
|
Return
|
|
End
|
|
m=.array~new
|
|
Do r=1 To rows
|
|
ro=.array~new
|
|
Do c=1 To cols
|
|
Parse Var elements e elements
|
|
ro~append(e)
|
|
End
|
|
m~append(ro)
|
|
End
|
|
|
|
::Method element /* get an element's value */
|
|
expose m
|
|
Use Arg r,c
|
|
ro=m[r]
|
|
Return ro[c]
|
|
|
|
::Method set /* set an element's value and return its previous */
|
|
expose m
|
|
Use Arg r,c,new
|
|
ro=m[r]
|
|
old=ro[c]
|
|
ro[c]=new
|
|
Return old
|
|
|
|
::Method show /* display the matrix */
|
|
expose m name rows cols
|
|
z='+'
|
|
b6=left('',6)
|
|
Say ''
|
|
Say b6 copies('-',7) 'matrix' name copies('-',7)
|
|
w=0
|
|
Do r=1 To rows
|
|
ro=m[r]
|
|
Do c=1 To cols
|
|
x=ro[c]
|
|
w=max(w,length(x))
|
|
End
|
|
End
|
|
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* top border */
|
|
Do r=1 To rows
|
|
ro=m[r]
|
|
line='|' right(ro[1],w) /* element of first colsumn */ /* start with long vertical bar */
|
|
Do c=2 To cols /* loop for other columns */
|
|
line=line right(ro[c],w) /* append the elements */
|
|
End /* c */
|
|
Say b6 b6 line '|' /* append a long vertical bar. */
|
|
End /* r */
|
|
Say b6 b6 '+'copies('-',cols*(w+1)+1)'+' /* bottom border */
|
|
Return
|