/*
  Basic Matrix class
  ------------------
  create by milan ramaiya
  last updated: 10.9.01

  the scalar addition/multiplication and additional constructors
  were written simply for future use ... not all of the functionality
  of this class is actually being used in this project
*/

class Matrix
{
    private double matrix[][];

    // constructor: prompt user for dimensions
    public Matrix(String sPrompt)
    {
        out.println(sPrompt);
        int m = in.readInt(" rows: "); // get rows
        int n = in.readInt(" cols: "); // get cols
        matrix = new double[m][n];
    }
    
    // constructor: create matrix with specified dimensions
    public Matrix(int m, int n)
    { matrix = new double[m][n]; }

    // constructor: clone from another matrix
    public Matrix(Matrix m)
    { matrix = (double[][]) m.matrix.clone(); }
    
    // get/set item
    public double getItem(int m, int n)
    { return matrix[m][n];  }

    public void setItem(int m, int n, double v)
    { matrix[m][n]=v; }
    
    // prompt user for items
    public void promptValues(String sMatrix)
    {
        out.println(sMatrix);
        for(int i=0; i<matrix.length; i++)
            for(int j=0; j<matrix[0].length; j++)
                matrix[i][j]=in.readInt("["+(i+1)+", "+(j+1)+"]:");
    }

    // get row/col count
    public int rows()
    { return matrix.length; }

    public int cols()
    { return matrix[0].length; }

    // convert to string
    public String toString()
    {
        // output in format:
        // [[a,b,c,d]
        //  [e,f,g,h]
        //  [i,j,k,l]]
        String s;
        s="[";
        for(int i=0; i<matrix.length; i++) {
            if(i>0) s+="\n [";
            else s+="[";
            for(int j=0; j<matrix[0].length; j++) {
                if(j>0) s+=", ";
                s+=matrix[i][j];
            }
            s+="]";
        }
        s+="]\n";
        return s;
    }

    // matrix addition
    public static Matrix add(Matrix a, Matrix b)
    {
        // check if dimensions match
        if( (a.rows()!=b.rows()) || (a.cols()!=b.cols()) )
            return null;

        // initialize new matrix
        Matrix c = new Matrix(a.rows(), a.cols());
        double ma[][] = a.matrix; // matrix A
        double mb[][] = b.matrix; // matrix B
        double mc[][] = c.matrix; // matrix C
        int ra = ma.length;    // rows in A
        int rb = mb.length;    // rows in B
        int ca = ma[0].length; // cols in A
        int cb = mb[0].length; // cols in B

        // add contents of matrices and create result matrix
        for(int i=0; i<ra; i++)
            for(int j=0; j<ca; j++)
                mc[i][j] = ma[i][j] + mb[i][j];

        return c;
    }

    // scalar addition
    public static Matrix add(Matrix a, double b)
    {
        Matrix c = new Matrix(a);
        double mc[][] = c.matrix;
        for(int i=0; i<mc.length; i++)
            for(int j=0; j<mc[0].length; j++)
                mc[i][j]+=b;
        return c;
    }

    // scalar multiplication
    public static Matrix mult(Matrix a, double b)
    {
        Matrix c = new Matrix(a);
        double mc[][] = c.matrix;
        for(int i=0; i<mc.length; i++)
            for(int j=0; j<mc[0].length; j++)
                mc[i][j]*=b;
        return c;
    }    
}
