Matrix multiplication: Difference between revisions

Content added Content deleted
(Updated both D entries)
Line 312: Line 312:
}</lang>
}</lang>


=={{header|BASIC}}==
=={{header|LOGO}}==
{{works with|QuickBasic|4.5}}
{{works with|FMSLOGO}}
{{trans|Java}}


TO LISTVMD :A :F :C :NV
Assume the matrices to be multiplied are a and b
;LRCVS 10.04.12
IF (LEN(a,2) = LEN(b)) 'if valid dims
;PROCEDURE LISTVMD
n = LEN(a,2)
;A = LIST
m = LEN(a)
;F = ROWS
p = LEN(b,2)
;C = COLS
;NV = NAME OF MATRIX / VECTOR NEW
DIM ans(0 TO m - 1, 0 TO p - 1)
;this procedure transform a list in matrix / vector square or rect

FOR i = 0 TO m - 1
(LOCAL "CF "CC "NV "T "W)
FOR j = 0 TO p - 1
MAKE "CF 1
FOR k = 0 TO n - 1
MAKE "CC 1
ans(i, j) = ans(i, j) + (a(i, k) * b(k, j))
MAKE "NV (MDARRAY (LIST :F :C) 1)
NEXT k, j, i
MAKE "T :F * :C
FOR [Z 1 :T][MAKE "W ITEM :Z :A
'print answer
MDSETITEM (LIST :CF :CC) :NV :W
FOR i = 0 TO m - 1
MAKE "CC :CC + 1
FOR j = 0 TO p - 1
IF :CC = :C + 1 [MAKE "CF :CF + 1 MAKE "CC 1]]
PRINT ans(i, j);
OUTPUT :NV
NEXT j
END
PRINT
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
NEXT i
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ELSE

PRINT "invalid dimensions"

END IF
TO XX
; MAIN PROGRAM
; THIS PROGRAM multiplies two "square" matrices / vector ONLY!!!
; THE RECTANGULAR NOT WORK!!!

CT CS HT

; FIRST DATA MATRIX / VECTOR
MAKE "A [1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49]
MAKE "FA 5 ;"ROWS
MAKE "CA 5 ;"COLS

; SECOND DATA MATRIX / VECTOR
MAKE "B [2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50]
MAKE "FB 5 ;"ROWS
MAKE "CB 5 ;"COLS


IF (OR :FA <> :CA :FB <>:CB) [PRINT "Las_matrices/vector_no_son_cuadradas THROW
"TOPLEVEL ]
IFELSE (OR :CA <> :FB :FA <> :CB) [PRINT
"Las_matrices/vector_no_son_compatibles THROW "TOPLEVEL ][MAKE "MA LISTVMD :A
:FA :CA "MA MAKE "MB LISTVMD :B :FB :CB "MB] ;APPLICATION <<< "LISTVMD"

PRINT (LIST "THIS_IS: "ROWS "X "COLS)
PRINT []
PRINT (LIST :MA "=_M1 :FA "ROWS "X :CA "COLS)
PRINT []
PRINT (LIST :MB "=_M2 :FA "ROWS "X :CA "COLS)
PRINT []


MAKE "T :FA * :CB
MAKE "RE (ARRAY :T 1)


MAKE "CO 0
FOR [AF 1 :CA][
FOR [AC 1 :CA][
MAKE "TEMP 0
FOR [I 1 :CA ][
MAKE "TEMP :TEMP + (MDITEM (LIST :I :AF) :MA) * (MDITEM (LIST :AC :I) :MB)]
MAKE "CO :CO + 1
SETITEM :CO :RE :TEMP]]


PRINT []
PRINT (LIST "THIS_IS: :FA "ROWS "X :CB "COLS)
SHOW LISTVMD :RE :FA :CB "TO ;APPLICATION <<< "LISTVMD"
END


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\


M1 M2 RESULT / SOLUTION
1 3 5 7 9 2 4 6 8 10 830 1880 2930 3980 5030
11 13 15 17 19 12 14 16 18 20 890 2040 3190 4340 5490
21 23 25 27 29 X 22 24 26 28 30 = 950 2200 3450 4700 5950
31 33 35 37 39 32 34 36 38 40 1010 2360 3710 5060 6410
41 43 45 47 49 42 44 46 48 50 1070 2520 3970 5420 6870

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\


NOW IN LOGO!!!!


THIS_IS: ROWS X COLS

{{1 3 5 7 9} {11 13 15 17 19} {21 23 25 27 29} {31 33 35 37 39} {41 43 45 47
49}} =_M1 5 ROWS X 5 COLS

{{2 4 6 8 10} {12 14 16 18 20} {22 24 26 28 30} {32 34 36 38 40} {42 44 46 48
50}} =_M2 5 ROWS X 5 COLS


THIS_IS: 5 ROWS X 5 COLS
{{830 1880 2930 3980 5030} {890 2040 3190 4340 5490} {950 2200 3450 4700 5950}
{1010 2360 3710 5060 6410} {1070 2520 3970 5420 6870}}


=={{header|BBC BASIC}}==
=={{header|BBC BASIC}}==