Task

Multiply two matrices together.

They can be of any dimensions, so long as the number of columns of the first matrix is equal to the number of rows of the second matrix.




/*REXX program multiplies two matrices together, displays the matrices and the results. */
                    x.=;       x.1= 1 2          /*╔═══════════════════════════════════╗*/
                               x.2= 3 4          /*║ As none of the matrix values have ║*/
                               x.3= 5 6          /*║ a sign,  quotes aren't needed.    ║*/
                               x.4= 7 8          /*╚═══════════════════════════════════╝*/
               do   r=1  while x.r\==''          /*build the "A" matrix from X. numbers.*/
                 do c=1  while x.r\=='';   parse var   x.r   a.r.c  x.r;        end  /*c*/
               end   /*r*/
Arows= r - 1                                     /*adjust the number of rows  (DO loop).*/
Acols= c - 1                                     /*   "    "     "    " cols    "   "  .*/
                    y.=;       y.1= 1 2 3
                               y.2= 4 5 6
               do   r=1  while y.r\==''          /*build the "B" matrix from Y. numbers.*/
                 do c=1  while y.r\=='';   parse var    y.r   b.r.c  y.r;       end  /*c*/
               end   /*r*/
Brows= r - 1                                     /*adjust the number of rows  (DO loop).*/
Bcols= c - 1                                     /*   "     "    "    " cols    "   "   */
w= 0                                             /*W  is max width of an matrix element.*/
c.= 0;    do      i=1  for Arows                 /*multiply matrix  A  and  B  ───►   C */
            do    j=1  for Bcols
              do k=1  for Acols;   c.i.j= c.i.j + a.i.k*b.k.j;   w= max(w, length(c.i.j) )
              end   /*k*/                        /*              ↑                      */
            end     /*j*/                        /*              └────────◄───────────┐ */
          end       /*i*/                        /*max width of the matrix elements─►─┘ */
 
call showMat  'A',  Arows,  Acols                /*display matrix  A ───►  the terminal.*/
call showMat  'B',  Brows,  Bcols                /*   "       "    B ───►   "     "     */
call showMat  'C',  Arows,  Bcols                /*   "       "    C ───►   "     "     */
exit                                             /*stick a fork in it,  we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
showMat: parse arg mat,rows,cols;    say;    say center(mat 'matrix', cols*(w+1) + 9, "─")
                 do   r=1  for rows;   _= '    '
                   do c=1  for cols;   _= _ right( value(mat'.'r"."c), w);  end;     say _
                 end   /*r*/;                               return