/*
 * Matrix Operations: Product, Sum, Difference
 *
 * Author : Tom Kimber
 *
 */

public abstract class MatrixMath
{
   public static Matrix Product( Matrix m1 , Matrix m2 ) 
   {
      int n , m ;
      n = m1.getNumRows( ) ;
      m = m2.getNumCols( ) ;
      double x ; 
      x = m1.getEntry( 1 , 1 ) ;
      Matrix c = new Matrix( n , m , 0.0 ) ;
      for ( int i = 0 ; i < n ; i++ )
      {
	 for( int j = 0 ; j < m ; j++ )
	 {
	    c.setEntry( i , j , ComputeProductEntry( i , j , m1 , m2 ) ) ;
	 }
      }      
      return c ;
   }
   private static double ComputeProductEntry( int i , int j , Matrix m1 , Matrix m2 ) 
   {
      double x = 0.0 ;
      int n , m ;
      n = m1.getNumCols( ) ;  // # of cols of m1 ( must equal # of rows of m2 ) 
      for( int a = 0 ; a < n ; a++ )
      {
         x = x + m1.getEntry( i , a ) * m2.getEntry( a , j ) ;
      }
      return x ;
   }
   public static Matrix Sum( Matrix m1 , Matrix m2 )
   {  // m2 is assumed to be the same size as m1
      int n , m ;
      n = m1.getNumRows( ) ;
      m = m1.getNumCols( ) ; 
      Matrix c = new Matrix( n , m , 0.0 ) ;
      for( int i = 0 ; i < n ; i++ )
      {
         for ( int j = 0 ; j < m ; j++ )
	 {
            c.setEntry( i , j , m1.getEntry( i , j ) + m2.getEntry( i , j ) ) ; 
	 }
      }
      return c ;
   }
   public static Matrix Difference( Matrix m1 , Matrix m2 )
   {  // m2 is assumed to be the same size as m1
      int n , m ;
      n = m1.getNumRows( ) ;
      m = m1.getNumCols( ) ; 
      Matrix c = new Matrix( n , m , 0.0 ) ;
      for( int i = 0 ; i < n ; i++ )
      {
         for ( int j = 0 ; j < m ; j++ )
	 {
            c.setEntry( i , j , m1.getEntry( i , j ) - m2.getEntry( i , j ) ) ; 
	 }
      }      
      return c ;	   
   }
}