68 lines
2.8 KiB
Plaintext
68 lines
2.8 KiB
Plaintext
Module CheckMatMult {
|
|
\\ Matrix Multiplication
|
|
\\ we use array pointers so we pass arrays byvalue but change this by reference
|
|
\\ this can be done because always arrays passed by reference,
|
|
\\ and Read statement decide if this goes to a pointer of array or copied to a local array
|
|
\\ the first line of code for MatMul is: Read a as array, b as array
|
|
\\ interpreter insert this at function construction.
|
|
\\ if a pointer inside function change to point to a new array, the this has no reflect to the passed array.
|
|
Function MatMul(a as array, b as array) {
|
|
if dimension(a)<>2 or dimension(b)<>2 then Error "Need two 2D arrays "
|
|
let a2=dimension(a,2), b1=dimension(b,1)
|
|
if a2<>b1 then Error "Need columns of first array equal to rows of second array"
|
|
let a1=dimension(a,1), b2=dimension(b,2)
|
|
let aBase=dimension(a,1,0)-1, bBase=dimension(b,1,0)-1
|
|
let aBase1=dimension(a,2,0)-1, bBase1=dimension(b,2,0)-1
|
|
link a,b to a(), b() ' change interface for arrays
|
|
dim base 1, c(a1, b2)
|
|
for i=1 to a1 : let ia=i+abase : for j=1 to b2 : let jb=j+bBase1 : for k=1 to a2
|
|
c(i,j)+=a(ia,k+aBase1)*b(k+bBase,jb)
|
|
next k : next j : next i
|
|
\\ redim to base 0
|
|
dim base 0, c(a1, b2)
|
|
=c()
|
|
}
|
|
\\ define arrays with different base per dimension
|
|
\\ res() defined as empty array
|
|
dim a(10 to 13, 4), b(4, 2 to 5), res()
|
|
\\ numbers from ADA task
|
|
a(10,0)= 1, 1, 1, 1, 2, 4, 8, 16, 3, 9, 27, 81, 4, 16, 64, 256
|
|
b(0,2)= 4, -3, 4/3, -1/4, -13/3, 19/4, -7/3, 11/24, 3/2, -2, 7/6, -1/4, -1/6, 1/4, -1/6, 1/24
|
|
res()=MatMul(a(), b())
|
|
for i=0 to 3 :for j=0 to 3
|
|
Print round(res(i,j)),
|
|
next j : Print : next i
|
|
}
|
|
CheckMatMult
|
|
Module CheckMatMult2 {
|
|
\\ Matrix Multiplication
|
|
\\ pass arrays by reference
|
|
\\ if we change a passed array here, to a new array then this change also the reference array.
|
|
Function MatMul(&a(),&b()) {
|
|
if dimension(a())<>2 or dimension(b())<>2 then Error "Need two 2D arrays "
|
|
let a2=dimension(a(),2), b1=dimension(b(),1)
|
|
if a2<>b1 then Error "Need columns of first array equal to rows of second array"
|
|
let a1=dimension(a(),1), b2=dimension(b(),2)
|
|
let aBase=dimension(a(),1,0)-1, bBase=dimension(b(),1,0)-1
|
|
let aBase1=dimension(a(),2,0)-1, bBase1=dimension(b(),2,0)-1
|
|
dim base 1, c(a1, b2)
|
|
for i=1 to a1 : let ia=i+abase : for j=1 to b2 : let jb=j+bBase1 : for k=1 to a2
|
|
c(i,j)+=a(ia,k+aBase1)*b(k+bBase,jb)
|
|
next k : next j : next i
|
|
\\ redim to base 0
|
|
dim base 0, c(a1, b2)
|
|
=c()
|
|
}
|
|
\\ define arrays with different base per dimension
|
|
\\ res() defined as empty array
|
|
dim a(10 to 13, 4), b(4, 2 to 5), res()
|
|
\\ numbers from ADA task
|
|
a(10,0)= 1, 1, 1, 1, 2, 4, 8, 16, 3, 9, 27, 81, 4, 16, 64, 256
|
|
b(0,2)= 4, -3, 4/3, -1/4, -13/3, 19/4, -7/3, 11/24, 3/2, -2, 7/6, -1/4, -1/6, 1/4, -1/6, 1/24
|
|
res()=MatMul(&a(), &b())
|
|
for i=0 to 3 :for j=0 to 3
|
|
Print round(res(i,j)),
|
|
next j : Print : next i
|
|
}
|
|
CheckMatMult2
|