public class Matrix{

	protected double[][] matrix;
	
	/*
	*Kontruktor, der eine Matrix der Dimension nXm anlegt
	*/ 
	public Matrix(int n, int m){
		matrix = new double[n][m];
	}

	public Matrix(Matrix m){
		matrix = new double[m.matrix.length][m.matrix[0].length];
		for(int i=0; i<m.matrix.length;i++)
			for(int j=0; j<m.matrix[i].length;j++)
				matrix[i][j]=m.matrix[i][j];
	}

	/*
	*gibt die Breite der Matrix zurueck
	*/
	public int getLengthN(){
		return matrix.length;
	}

    /*
	*gibt die Hoehe des Vektors zurueck
	*/
	public int getLengthM(){
		return matrix[1].length;
	}

	/*
	*Dies schreibt das Element x
	*in die (n,m)-te Komponente
	*/
	public void setElement(double x, int n, int m){
		matrix[n][m]=x;
		return;
	}
	

	/*
	*Dies gibt das (n,m)-te Element zurueck
	*/
	public double getElement(int n, int m){
		return matrix[n][m];
	}
   
     
    
 	/*
	*Berechnet das Matrix-Vektor-Produkt
	*	A*x
	*und gibt das Ergebnis in einem neuen Vektor zurueck
	*/
	public Vektor Ax(Vektor x){
		Vektor res = new Vektor(x.getLength());
		for(int i=0; i<matrix.length;i++)
			for(int j=0; j<matrix.length;j++)	
				res.setElement(res.getElement(i)+x.getElement(j)*matrix[i][j],i);
		return res;
	}
  
	/*
	*Multipliziert zu einer Matritx eine passende nach Batyrev Definition
	*gibt eine neue Matrix zurueck
	*/
	public static Matrix mult(Matrix A, Matrix B){
		Matrix tmp = new Matrix(A.matrix.length,B.matrix[0].length); //Hilfsvariable, in der das Ergebnis abgelegt wird
		for(int i=0; i<A.matrix.length; i++){
			for(int j=0; j<A.matrix[i].length; j++){
				double temp = 0.0;
				for(int k=0; k<A.matrix[0].length; k++)
					temp += A.matrix[i][k]*B.matrix[k][j];
				tmp.matrix[i][j]=temp;
			}
		}
		return tmp;
	}



    /*
    *gibt die Matrix A als Sting aus
    */
    public String toString(){
      	StringBuffer sb = new StringBuffer();
       	// alle Elemente in StringBuffer schreiben
       	for(int i=0; i<this.matrix.length; i++){
	    	sb.append(" < ");
	    	for(int j=0; j<this.matrix[i].length; j++){
				sb.append(" "+this.matrix[i][j]+" ");
	    	}
	    	sb.append(" > \n");
		}
		return sb.toString();
    }
	
}
