43 lines
1.0 KiB
Plaintext
43 lines
1.0 KiB
Plaintext
LOCAL ARRAY a[4,2], b[2,3], c[4,3]
|
|
CLOSE DATABASES ALL
|
|
*!* The arrays could be created directly but I prefer to do this:
|
|
CREATE CURSOR mat1 (c1 I, c2 I)
|
|
CREATE CURSOR mat2 (c1 I, c2 I, c3 I)
|
|
*!* Since matrix multiplication of integer arrays
|
|
*!* involves only multiplication and addition,
|
|
*!* the result will contain integers
|
|
CREATE CURSOR result (c1 I, c2 I, c3 I)
|
|
INSERT INTO mat1 VALUES (1, 2)
|
|
INSERT INTO mat1 VALUES (3, 4)
|
|
INSERT INTO mat1 VALUES (5, 6)
|
|
INSERT INTO mat1 VALUES (7, 8)
|
|
SELECT * FROM mat1 INTO ARRAY a
|
|
|
|
INSERT INTO mat2 VALUES (1, 2, 3)
|
|
INSERT INTO mat2 VALUES (4, 5, 6)
|
|
SELECT * FROM mat2 INTO ARRAY b
|
|
STORE 0 TO c
|
|
MatMult(@a,@b,@c)
|
|
SELECT result
|
|
APPEND FROM ARRAY c
|
|
BROWSE
|
|
|
|
|
|
PROCEDURE MatMult(aa, bb, cc)
|
|
LOCAL n As Integer, m As Integer, p As Integer, i As Integer, j As Integer, k As Integer
|
|
IF ALEN(aa,2) = ALEN(bb,1)
|
|
n = ALEN(aa,2)
|
|
m = ALEN(aa,1)
|
|
p = ALEN(bb,2)
|
|
FOR i = 1 TO m
|
|
FOR j = 1 TO p
|
|
FOR k = 1 TO n
|
|
cc[i,j] = cc[i,j] + aa[i,k]*bb[k,j]
|
|
ENDFOR
|
|
ENDFOR
|
|
ENDFOR
|
|
ELSE
|
|
? "Invalid dimensions"
|
|
ENDIF
|
|
ENDPROC
|