program matr1; { -> 50 } { pascal program to perform matrix multiplication } const rmax = 9; cmax = 3; type ary = array[1..rmax] of real; arys = array[1..cmax] of real; ary2 = array[1..rmax,1..cmax] of real; ary2s = array[1..cmax,1..cmax] of real; var y : ary; g : arys; x : ary2; a : ary2s; nrow,ncol : integer; external procedure cls; procedure get_data(var x: ary2; var y: ary; var nrow,ncol: integer); { get the values for nrow, ncol, and arrays x,y } var i,j : integer; begin nrow:=5; ncol:=3; for i:=1 to nrow do begin x[i,1]:=1; for j:=2 to ncol do x[i,j]:=i*x[i,j-1]; y[i]:=2*i end end; { procedure get_data } procedure write_data; { print out the answeres } var i,j : integer; begin cls; writeln; writeln(' X Y'); for i:=1 to nrow do begin for j:=1 to ncol do write(x[i,j]:7:1,' '); writeln(':',y[i]:7:1) end; writeln(' A G'); for i:=1 to ncol do begin for j:=1 to ncol do write(a[i,j]:7:1,' '); writeln(':',g[i]:7:1) end end; { write_data } procedure square(x: ary2; y: ary; var a: ary2s; var g: arys; nrow,ncol: integer); { matrix multiplication routine } { a= transpose x times x } { g= y times x } var i,k,l : integer; begin { square } for k:=1 to ncol do begin for l:=1 to k do begin a[k,l]:=0; for i:=1 to nrow do begin a[k,l]:=a[k,l]+x[i,l]*x[i,k]; if k<>l then a[l,k]:=a[k,l] end end; { l-loop } g[k]:=0; for i:=1 to nrow do g[k]:=g[k]+y[i]*x[i,k] end { k-loop } end; { square } begin { MAIN program } get_data(x,y,nrow,ncol); square(x,y,a,g,nrow,ncol); write_data end.