public class metodos{
	
	
	
	
	/*****************************************************************
	********   Operaciones de matrices "individuales"   **************
	*****************************************************************/
	
	
		
	// Mostrar en pantalla la matriz
		static public String mostrar(double[][] m){
			int n=m.length;
			String texto="\n";
     		   for(int i=0; i<n; i++){
      	      for(int j=0; j<n; j++){
      	          texto+="\t "+(double)Math.round(1000*m[i][j])/1000;
       	     }
      	      texto+="\n";
      	  }
      	  texto+="\n";
     	   return texto;
		}
	
	// Traza de la matriz
		static public double traza(double[][] m){
			int n=m.length;
			double traza=0.0;
			for(int i=0;i<n;i++){
				traza+=m[i][i];
			}
			return traza;
		}
	
	
		// Matriz traspuesta
		static public double[][] trasponer(double[][] m){
			int n=m.length;
			double[][] resultado=new double[n][n];
     	 	  for(int i=0; i<n; i++){
      		      for(int j=0; j<n; j++){
            		resultado[i][j]=m[j][i];
            	
      	 		 	}
    			}
      		  return resultado;
		}
	
	
		// Matriz triangular superior
		static public double[][] triansup(double[][] m){
			int n=m.length;
			double[][] resultado=new double[n][n];
     	   for(int i=0; i<n; i++){
        	    for(int j=0; j<n; j++){
            		if (i>j){
            			resultado[i][j]=0.0;
         		   	}
            		else{
            			resultado[i][j]=m[j][i];
            		}
            	
        		}
    		}
        	return resultado;
		}
	
	
	
	// Matriz triangular inferior
		static public double[][] trianinf(double[][] m){
		int n=m.length;
		double[][] resultado=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
            	if (i<j){
            		resultado[i][j]=0.0;
            	}
            	else{
            		resultado[i][j]=m[j][i];
            	}
            	
        	}
    	}
        return resultado;
	}
	
	
	
	// Inversa aditiva
		static public double[][] inversa(double[][] m){
		int n=m.length;
		double[][] resultado=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
            	
            		resultado[i][j]=-m[i][j];
            	            	
        	}
    	}
        return resultado;
	}
	
	
	// Determinante
		static public double determinante(double[][] m){
			int n=m.length;
			double x=0.666;
			if (n==1){
				x=m[0][0];
			}
			else if(n==2){
				x=m[0][0]*m[1][1]-m[1][0]*m[0][1];
			}
			else if(n==3){
				x=(m[0][0]*m[1][1]*m[2][2]+m[0][1]*m[1][2]*m[2][0]+m[0][2]*m[1][0]*m[2][1]);
				x=x-(m[2][0]*m[1][1]*m[0][2]+m[0][1]*m[1][0]*m[2][2]+m[0][0]*m[1][2]*m[2][1]);
					
		}
			return x;
		}
	
	
	
	// Ponderar por un escalar
		static public double[][] ponderar(double[][] m,double x){
			int n=m.length;
			double[][] resultado=new double[n][n];
			for(int i=0; i<n; i++){
      	      for(int j=0; j<n; j++){
      	        resultado[i][j]=m[i][j]*x;  
       	     }
      	      
      	  }
      	  
     	   return resultado;
		}
		
		
		
		
		
	
	
	
	
	
	
	
	
	/*****************************************************************
	********   Operaciones entre dos matrices  (a y b)  **************
	*****************************************************************/	
	
	
	
		
	
	
	// Suma de matrices
		static public double[][] sumar(double[][] a, double[][] b){
		int n=a.length;
		double[][] resultado=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                resultado[i][j]=a[i][j]+b[i][j];
            }
        }
        return resultado;
	}
	
	
	// Resta de matrices
		static public double[][] restar(double[][] a, double[][] b){
		int n=a.length;
		double[][] resultado=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                resultado[i][j]=a[i][j]-b[i][j];
            }
        }
        return resultado;
	}
	
	// Multiplicacion de matrices
		static public double[][] multiplicar(double[][] a, double[][] b){
		int n=a.length;
		double[][] resultado=new double[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
            	for (int k=0; k<n; k++){
            		resultado[i][j]+=a[i][k]*b[k][j];
            	}
        	}
    	}
        return resultado;
	}
}	