120 COMMON P0%,N%,M%,P% 130 DEF FNR%(X)=INT(10*RND(X)+1) 140 DEF FNC(X1,X2)=ABS(X1-X2)-5.00000E-05 150 DIM P(11),F(11) 155 PRINT 160 PRINT "1) PASS ";P0%;" M=";M%;" N=";N%;" P=";P% 200 REM MATRIX TEST PROGRAM COMMON SEGMENT 210 PRINT "2) MATZER"; 220 GOSUB 2000 \ REM ZERO MATRIX A1 230 GOSUB 2100 \ REM RANDOMIZE MATRIX A 240 CALL "MATZER"(A(),M%,N%) 250 GOSUB 20000 \ REM COMPARE A & A1 300 PRINT "3) MATIDN"; 310 GOSUB 3200 \ REM SET S1 TO UNIT MATRIX 320 GOSUB 3100 \ REM RANDOMISE MATRIX S 330 CALL "MATIDN"(S(),M%) 340 GOSUB 20100 \ REM COMPARE S & S1 400 PRINT "4) MATCON"; 410 GOSUB 4000 \ REM SET A1 TO MATRIX OF 1'S 420 GOSUB 2100 \ REM RANDOMISE MATRIX A 430 CALL "MATCON"(A(),M%,N%) 440 GOSUB 20000 \ REM COMPARE 500 PRINT "5) MATTRN array to array"; 510 GOSUB 5100 \ REM RANDOMISE ARRAY A1 520 GOSUB 5000 \ REM TRANSPOSE A1 TO T 530 GOSUB 2100 \ REM RANDOMISE ARRAY A 540 CALL "MATTRN"(A(),T(),M%,N%) 550 GOSUB 20000 \ REM COMPARE 560 PRINT "5a) MATTRN in place"; 570 GOSUB 3100 \ REM RANDOMISE S 580 GOSUB 5200 \ REM TRANSPOSE S TO S1 585 CALL "MATTRN"(S(),S(),M%,M%) 590 GOSUB 20110 \ REM COMPARE S & S1 600 PRINT "6) MATADD"; 610 GOSUB 6000 \ REM RANDOMISE B 620 GOSUB 6100 \ REM RANDOMISE C 630 GOSUB 6200 \ REM A1=B+C 640 GOSUB 2100 \ REM RANDOMISE A 650 CALL "MATADD"(A(),B(),C(),M%,N%) 660 GOSUB 20000 \ REM COMPARE 700 PRINT "7) MATSUB"; 710 GOSUB 6000 720 GOSUB 6100 730 GOSUB 7200 \ REM A1=B-C 740 GOSUB 2100 750 CALL "MATSUB"(A(),B(),C(),M%,N%) 760 GOSUB 20000 \ REM COMPARE 800 PRINT "8) MATSCA"; 810 GOSUB 5100 \ REM RANDOMISE A1 815 S=RND(0) 820 CALL "MATSCA"(A(),A1(),M%,N%,S) 830 GOSUB 8000 \ REM MAT A1=A1*S 840 GOSUB 20000 \ REM COMPARE 900 PRINT "9) MATCOP"; 910 GOSUB 5100 \ REM RANDOMISE A1 920 CALL "MATCOP"(A(),A1(),M%,N%) 930 GOSUB 20000 1000 PRINT "10) MATMUL"; 1010 GOSUB 10000 \ REM RANDOMISE U(M,P) & U1(P,M)=~U(M,P) 1020 GOSUB 10100 \ REM RANDOMISE V(P,N) & V1(N,P)=~U(P,N) 1030 GOSUB 10200 \ REM MAT A1=U*V 1040 CALL "MATMUL"(A(),U(),V(),M%,P%,N%) 1050 GOSUB 20000 1100 REM MULTRA AND TRAMUL USE TRANSPOSE ARRAYS U1 & V1 GENERATED ABOVE. 1101 REM TO REDUCE ROUND-OFF ERRORS, COPY A TO A1 FIRST 1105 PRINT "11) TRAMUL"; 1110 CALL "MATCOP"(A1(),A(),M%,N%) 1120 CALL "TRAMUL"(A(),U1(),V(),M%,P%,N%) 1130 GOSUB 20000 1200 PRINT "12) MULTRA"; 1210 CALL "MULTRA"(A(),U(),V1(),M%,P%,N%) 1220 GOSUB 20000 1300 PRINT "13) MATINV"; 1310 GOSUB 3100 \ REM RANDOMISE S 1315 CALL "MATCOP"(S1(),S(),M%,M%) \ REM COPY TO S1 1320 GOSUB 13000 \ REM FIND INVERSE 1340 CALL "MATINV"(S(),M%) 1350 IF D4<>0 THEN GOSUB 20100 1400 PRINT "14) DETERMINANT"; 1405 IF D4<>0 THEN 1415 1407 IF S(0%,0%)=0 THEN 1450 1410 GO TO 1420 1415 IF FNC(S(0%,0%),D4)<0% THEN 1450 1420 PRINT \ PRINT "ERROR: DETERMINANT ";S(0%,0%);" SHOULD BE ";D4 1430 GO TO 1500 1450 PRINT " OK" 1500 PRINT "15) INPROD"; 1510 X=RND(0) \ F(0)=1 \ P(0)=1 1520 FOR I%=1% TO 11% \ F(I%)=F(I%-1%)/I% \ P(I%)=P(I%-1%)*X \ NEXT I% 1530 FOR I%=2% TO 10% STEP 4% \ P(I%)=-P(I%) \ P(I%+1%)=-P(I%+1%) \ NEXT I% 1540 CALL "INPROD"(S,2%,P(1%),2%,F(1%),6%) 1550 CALL "INPROD"(C,2%,P(),2%,F(),6%) 1560 GOSUB 15000 \ REM COMPARE WITH SIN & COS 1600 PRINT "16) SUM"; 1610 FOR I%=1% TO 11% \ P(I%)=P(I%)*F(I%) \ NEXT I% 1620 S=RND(0) \ C=RND(0) 1630 CALL "SUM"(C,2%,P(),6%) 1640 CALL "SUM"(S,2%,P(1%),6%) 1650 GOSUB 15000 1800 KILL "MATTST1.BAS" 1900 PRINT "END OF PASS";P0% 1902 PRINT \ PRINT "CONTINUE"; \ LINPUT L$ 1903 IF L$='N' THEN STOP 1904 IF L$<>'Y' THEN 1902 1910 REM GENERATE NEW M,N,P AND WRITE THE NEXT PROGRAM 1920 M%=FNR%(0) \ N%=FNR%(0) \ P%=FNR%(0) \ P0%=P0%+1% 1940 OPEN "MATTST1.BAS" FOR OUTPUT AS FILE 1% 1942 PRINT #1%,"101 DIM A(";M%;",";N%;"),A1(";M%;",";N%;"),S(";M%;",";M%;"),S1(";M%;",";M%;")" 1944 PRINT #1%,"102 DIM T(";N%;",";M%"),B("M%","N%"),C(";M%;",";N%;")" 1946 PRINT #1%,"103 DIM U(";M%;",";P%;"),U1(";P%;",";M%;"),V("P%;",";N%;"),V1(";N%;",";P%;")" 1948 PRINT #1%,"104 DIM D(";M%;"),E(";M%;"),Z%(";M%;")" 1950 OPEN "MATTSTOVL.BAS" FOR INPUT AS FILE 2% 1960 IF END #2% THEN 1990 1970 LINPUT #2%,L$ \ PRINT #1%,L$ 1980 GO TO 1960 1990 CLOSE 1995 CHAIN "MATTST1" 1999 STOP 2000 REM ZERO MATRIX A1 2010 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=0 \ NEXT J% \ NEXT I% 2020 RETURN 2100 REM RANDOMISE MATRIX A 2110 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 2120 RETURN 3100 REM RANDOMISE S(M%,M%) 3110 FOR I%=1% TO M% \ FOR J%=1% TO M% \ S(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 3120 RETURN 3200 REM SET S1 TO THE UNIT MATRIX 3210 CALL "MATZER"(S1(),M%,M%) 3220 FOR I%=1% TO M% \ S1(I%,I%)=1 \ NEXT I% 3230 RETURN 4000 REM ZERO MATRIX A1 4010 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=1 \ NEXT J% \ NEXT I% 4020 RETURN 5000 REM TRANSPOSE A1(M,N) TO T(N,M) 5010 FOR I%=1% TO M% \ FOR J%=1% TO N% \ T(J%,I%)=A1(I%,J%) \ NEXT J% \ NEXT I% 5020 RETURN 5100 REM RANDOMISE MATRIX A1 5110 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 5120 RETURN 5200 REM TRANSPOSE S(M,M) TO S1(M,M) 5210 FOR I%=1% TO M% \ FOR J%=1% TO M% \ S1(J%,I%)=S(I%,J%) \ NEXT J% \ NEXT I% 5220 RETURN 6000 REM RANDOMISE B(M,N) 6010 FOR I%=1% TO M% \ FOR J%=1% TO N% \ B(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 6020 RETURN 6100 REM RANDOMISE C(M,N) 6110 FOR I%=1% TO M% \ FOR J%=1% TO N% \ C(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 6120 RETURN 6200 REM MAT A1=B+C 6210 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=B(I%,J%)+C(I%,J%) \ NEXT J% \ NEXT I% 6220 RETURN 7200 REM MAT A1=B-C 7210 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=B(I%,J%)-C(I%,J%) \ NEXT J% \ NEXT I% 7220 RETURN 8000 REM MAT A1=A1*S 8010 FOR I%=1% TO M% \ FOR J%=1% TO N% \ A1(I%,J%)=A1(I%,J%)*S \ NEXT J% \ NEXT I% 8020 RETURN 10000 REM RANDOMISE U(M,P) & U1(P,M)=~U(M,P) 10010 FOR I%=1% TO M% \ FOR J%=1% TO P% 10020 U(I%,J%)=RND(0) \ U1(J%,I%)=U(I%,J%) 10030 NEXT J% \ NEXT I% 10040 RETURN 10100 REM RANDOMISE V(P,N) & V1(N,P)=~(P,N) 10110 FOR I%=1% TO P% \ FOR J%=1% TO N% 10120 V(I%,J%)=RND(0) \ V1(J%,I%)=V(I%,J%) 10130 NEXT J% \ NEXT I% 10140 RETURN 10200 REM MAT A1(M,N)=U(M,P)*V(P,N) 10210 FOR I%=1% TO M% \ FOR J%=1% TO N% 10230 S=0 10240 FOR K%=1% TO P% \ S=S+U(I%,K%)*V(K%,J%) \ NEXT K% 10250 A1(I%,J%)=S 10260 NEXT J% \ NEXT I% 10270 RETURN 13000 REM MAT S1=INV(S1) 13010 REM INVERTS MATRIX S1(M,M) IN PLACE. 13020 REM MATRIX INVERSION BY GAUSS-JORDAN ELIMINATION. 13030 REM DETERMINANT IS RETURNED IN D4 13040 REM CACM ALGORITHM 120 13050 D4=1 13060 FOR J4%=1% TO M% 13070 Z%(J4%)=J4% 13080 NEXT J4% 13090 FOR I4%=1% TO M% 13100 K4%=I4% 13110 Y4=S1(I4%,I4%) 13120 L4%=I4%-1% 13130 P4%=I4%+1% 13140 FOR J4%=P4% TO M% 13150 W4=S1(I4%,J4%) 13160 IF ABS(W4)<=ABS(Y4) THEN 13190 13170 K4%=J4% 13180 Y4=W4 13190 NEXT J4% 13200 D4=D4*Y4 13210 IF ABS(Y4)>1.00000E-06 THEN 13250 13220 PRINT "** SINGULAR MATRIX" 13230 D4=0 13240 RETURN 13250 Y4=1/Y4 13260 FOR J4%=1% TO M% 13270 D(J4%)=S1(J4%,K4%) 13280 S1(J4%,K4%)=S1(J4%,I4%) 13290 S1(J4%,I4%)=-D(J4%)*Y4 13300 E(J4%)=S1(I4%,J4%)*Y4 13310 S1(I4%,J4%)=E(J4%) 13320 NEXT J4% 13330 S1(I4%,I4%)=Y4 13340 J4%=Z%(I4%) 13350 Z%(I4%)=Z%(K4%) 13360 Z%(K4%)=J4% 13370 REM FOR K4%=1% TO L4%, P4% TO M% 13380 REM FOR J4%=1% TO L4%, P4% TO M% 13390 REM S1(K4%,J4%)=S1(K4%,J4%)-B(J4%)*D(K4%) 13400 REM SUBROUTINE 13630 DOES THE INNER LOOP 13410 FOR K4%=1% TO L4% 13420 GOSUB 13630 13430 NEXT K4% 13440 FOR K4%=P4% TO M% 13450 GOSUB 13630 13460 NEXT K4% 13470 NEXT I4% 13480 FOR I4%=1% TO M% 13490 K4%=Z%(I4%) 13500 IF K4%=I4% THEN 13610 13510 FOR J4%=1% TO M% 13520 W4=S1(I4%,J4%) 13530 S1(I4%,J4%)=S1(K4%,J4%) 13540 S1(K4%,J4%)=W4 13550 NEXT J4% 13560 P4%=Z%(I4%) 13570 Z%(I4%)=Z%(K4%) 13580 Z%(K4%)=P4% 13590 D4=-D4 13600 GO TO 13490 13610 NEXT I4% 13620 RETURN 13630 REM INNER LOOP(SEE REMARK 13370 FF) 13640 FOR J4%=1% TO L4% 13650 GOSUB 13710 13660 NEXT J4% 13670 FOR J4%=P4% TO M% 13680 GOSUB 13710 13690 NEXT J4% 13700 RETURN 13710 S1(K4%,J4%)=S1(K4%,J4%)-E(J4%)*D(K4%) 13720 RETURN 13900 REM RANDOMISE S(M,M) 13910 FOR I%=1% TO M% \ FOR J%=1% TO M% \ S1(I%,J%)=RND(0) \ NEXT J% \ NEXT I% 13920 RETURN 15000 REM COMPARE S & C WITH SIN(X) AND COS(X) 15010 IF FNC(S,SIN(X))>0 THEN PRINT USING "ERROR: S=#.#######^^^^ <> SIN(X)=#.#######^^^^";S,SIN(X) 15020 IF FNC(C,COS(X))>0 THEN PRINT USING "ERROR: C=#.#######^^^^ <> COS(X)=#.#######^^^^";C,COS(X) 15030 IF FNC(S,SIN(X))<=0 THEN IF FNC(C,COS(X))<=0 THEN PRINT " OK" 15040 RETURN 20000 REM COMPARE MATRICES A & A1 20010 T%=0% 20020 FOR I%=1% TO M% \ FOR J%=1% TO N% 20030 IF ABS(A(I%,J%))+ABS(A1(I%,J%))=0 THEN 20060 20035 IF FNC(A(I%,J%),A1(I%,J%))<0 THEN 20060 20037 IF T%=0% THEN PRINT 20040 PRINT USING "ERROR: A(##:##) = #.#######^^^^ <> A1(##:##) = #.#######^^^^",I%,J%,A(I%,J%),I%,J%,A1(I%,J%) 20050 T%=1% 20060 NEXT J% \ NEXT I% 20070 IF T%=0% THEN PRINT " OK" 20080 RETURN 20100 REM COMPARE S & S1 20110 T%=0% 20120 FOR I%=1% TO M% \ FOR J%=1% TO M% 20130 IF ABS(S(I%,J%))+ABS(S1(I%,J%))=0 THEN 20160 20135 IF FNC(S(I%,J%),S1(I%,J%))<0 THEN 20160 20137 IF T%=0% THEN PRINT 20140 PRINT USING "ERROR: S(##:##) = #.#######^^^^ <> S1(##:##) = #.#######^^^^",I%,J%,S(I%,J%),I%,J%,S1(I%,J%) 20150 T%=1% 20160 NEXT J% \ NEXT I% 20170 IF T%=0% THEN PRINT " OK" 20180 RETURN 32000 END