type Matrix dim as double m( any , any ) declare constructor ( ) declare constructor ( byval x as uinteger , byval y as uinteger ) end type constructor Matrix ( ) end constructor constructor Matrix ( byval x as uinteger , byval y as uinteger ) redim this.m( x - 1 , y - 1 ) end constructor operator * ( byref a as Matrix , byref b as Matrix ) as Matrix dim as Matrix ret dim as uinteger i, j, k if ubound( a.m , 2 ) = ubound( b.m , 1 ) and ubound( a.m , 1 ) = ubound( b.m , 2 ) then redim ret.m( ubound( a.m , 1 ) , ubound( b.m , 2 ) ) for i = 0 to ubound( a.m , 1 ) for j = 0 to ubound( b.m , 2 ) for k = 0 to ubound( b.m , 1 ) ret.m( i , j ) += a.m( i , k ) * b.m( k , j ) next k next j next i end if return ret end operator 'some garbage matrices for demonstration dim as Matrix a = Matrix(4 , 2) a.m(0 , 0) = 1 : a.m(0 , 1) = 0 a.m(1 , 0) = 0 : a.m(1 , 1) = 1 a.m(2 , 0) = 2 : a.m(2 , 1) = 3 a.m(3 , 0) = 0.75 : a.m(3 , 1) = -0.5 dim as Matrix b = Matrix( 2 , 4 ) b.m(0 , 0) = 3.1 : b.m(0 , 1) = 1.6 : b.m(0 , 2) = -99 : b.m (0, 3) = -8 b.m(1 , 0) = 2.7 : b.m(1 , 1) = 0.6 : b.m(1 , 2) = 0 : b.m(1,3) = 21 dim as Matrix c = a * b print c.m(0, 0), c.m(0, 1), c.m(0, 2), c.m(0, 3) print c.m(1, 0), c.m(1, 1), c.m(1, 2), c.m(1, 3) print c.m(2, 0), c.m(2, 1), c.m(2, 2), c.m(2, 3) print c.m(3, 0), c.m(3, 1), c.m(3, 2), c.m(3, 3)