Advertisement
Guest User

Untitled

a guest
Jan 18th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. ( matrix multiplcation in forth :^]
  2. make matrix A with '[numbers] columns rows create-mat-a'
  3. then matrix B with '[numbers] columns rows create-mat-b'
  4. then do 'multiply' to multiply
  5.  
  6. matrix A and B are both 1x1 identity matricies by default
  7.  
  8. )
  9.  
  10. create matrix-a 100 cells allot
  11. create matrix-b 100 cells allot
  12. create matrix-r 100 cells allot
  13.  
  14. variable a-cols 0 a-cols !
  15. variable a-rows 0 a-rows !
  16. variable b-cols 0 b-cols !
  17. variable b-rows 0 b-rows !
  18. variable r-cols 0 r-cols !
  19. variable r-rows 0 r-rows !
  20.  
  21. : mat-a ( col row -- addr ) a-cols @ * + cells matrix-a + ;
  22. : mat-b ( col row -- addr ) b-cols @ * + cells matrix-b + ;
  23. : mat-r ( col row -- addr ) r-cols @ * + cells matrix-r + ;
  24.  
  25. : def-mat-a ( rows cols -- )
  26. a-cols ! a-rows ! ;
  27.  
  28. : def-mat-b ( cols rows -- )
  29. b-cols ! b-rows ! ;
  30.  
  31. : def-mat-r ( rows col -- )
  32. r-cols ! r-rows ! ;
  33.  
  34. : put-mat-a
  35. cr a-rows @ 0 do ." |" a-cols @ 0 do i j mat-a @ 4 .r loop ." |" cr loop ;
  36. : put-mat-b
  37. cr b-rows @ 0 do ." |" b-cols @ 0 do i j mat-b @ 4 .r loop ." |" cr loop ;
  38. : put-mat-r
  39. cr r-rows @ 0 do ." |" r-cols @ 0 do i j mat-r @ 4 .r loop ." |" cr loop ;
  40.  
  41. : fill-mat-a ( excepts a-cols a-rows * numbers on stack to fill matrix-a
  42. eg. for a 3x3 , 1 2 3 4 5 6 fill-mat-a on the stack fills matrix-a like
  43. [ 1 2 3 ]
  44. matrix-a = [ 4 5 6 ]
  45. [ 7 8 9 ] )
  46. 0 -1 a-rows @ + do
  47. 0 -1 a-cols @ + do
  48. i j mat-a !
  49. -1 +loop
  50. -1 +loop ;
  51.  
  52. : fill-mat-b ( same as fill-mat-a but for matrix-b )
  53. 0 -1 b-rows @ + do
  54. 0 -1 b-cols @ + do
  55. i j mat-b !
  56. -1 +loop
  57. -1 +loop ;
  58.  
  59. : create-mat-a ( numbers... cols rows-- ) def-mat-a fill-mat-a ;
  60. : create-mat-b ( numbers... cols rows-- ) def-mat-b fill-mat-b ;
  61.  
  62. : can-multiply ( -- result) a-cols @ b-rows @ = ;
  63. : def-mat-r ( -- ) a-rows @ r-rows ! b-cols @ r-cols ! ;
  64.  
  65. : r-get-result ( col row -- result )
  66. 0 >r \ accumulator
  67. 0 >r \ counter
  68. begin
  69. over r@ mat-b @ over r@ swap mat-a @ *
  70. \ put counter accumulator onto stack
  71. r> r> swap >r + r> swap >r 1 + dup >r b-rows @ =
  72. until
  73. r> r> ( put result on stack ) ;
  74.  
  75. : r-multiply ( -- )
  76. r-rows @ 0 do
  77. r-cols @ 0 do
  78. i j r-get-result i j mat-r !
  79. loop
  80. loop ;
  81.  
  82. : multiply
  83. can-multiply if
  84. def-mat-R
  85. r-multiply
  86. put-mat-a
  87. ." multiplied by "
  88. put-mat-b
  89. ." = "
  90. put-mat-r
  91. else
  92. cr ." Can't multiply" cr
  93. then ;
  94.  
  95. 1 0 0 1 2 2 create-mat-a
  96. 1 0 0 1 2 2 create-mat-b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement