61 lines
1.7 KiB
Text
61 lines
1.7 KiB
Text
Module CheckIt {
|
|
Class cArray {
|
|
a=(,)
|
|
Function Power(n as integer){
|
|
cArr=This ' create a copy
|
|
dim new()
|
|
new()=cArr.a ' get a pointer from a to new()
|
|
Let cArr.a=new() ' now new() return a copy
|
|
cArr.a*=0 ' make zero all elements
|
|
link cArr.a to v()
|
|
for i=dimension(cArr.a,1,0) to dimension(cArr.a, 1,1) : v(i,i)=1: next i
|
|
while n>0
|
|
let cArr=cArr*this ' * is the operator "*"
|
|
n--
|
|
end while
|
|
=cArr
|
|
}
|
|
Operator "*"{
|
|
Read cArr
|
|
b=cArr.a
|
|
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)
|
|
.a<=c()
|
|
}
|
|
Module Print {
|
|
link .a to v()
|
|
for i=dimension(.a,1,0) to dimension(.a, 1,1)
|
|
for j=dimension(.a,2,0) to dimension(.a, 2,1)
|
|
print v(i,j),: next j: print : next i
|
|
|
|
}
|
|
Class:
|
|
\\ this module used as constructor, and not returned to final group (user object in M2000)
|
|
Module cArray (r) {
|
|
c=r
|
|
Dim a(r,c)
|
|
For i=0 to r-1 : For j=0 to c-1: Read a(i,j): Next j : Next i
|
|
.a<=a()
|
|
}
|
|
}
|
|
Print "matrix():"
|
|
P=cArray(2,3,2,2,1)
|
|
P.Print
|
|
For i=0 to 9
|
|
Print "matrix()^"+str$(i,0)+"="
|
|
K=P.Power(i)
|
|
K.Print
|
|
next i
|
|
}
|
|
Checkit
|