/* Auteur: Nicolas JANEY          */
/* nicolas.janey@univ-fcomte.fr   */
/* Mars 2006                      */

import java.io.*;
import java.text.*;

public class ProduitsMatricesEnConsole {
  static DecimalFormat df = new DecimalFormat("0.0000 ");

  /* Creation d'une chaine de caracteres                  */
  /* representant un nombre reel complemente par          */
  /* des espaces pour obtenir une longueur totale fixee   */

  public static String format(float v) {
    if ( v < 10.0F )
      return("  "+df.format(v));
      else
      if ( v < 100.0F )
        return(" "+df.format(v));
        else
        return(df.format(v));
  }

  /* Affichage d'une matrice de reelss formatee           */
  /* en lignes et en colonnes                             */

  public static void affichageMatrice(float [][] m) {
    for ( int i = 0 ; i < m.length ; i++ ) {
      for ( int j = 0 ; j < m[i].length ; j++ )
        Console.out.print(format(m[i][j]));
      Console.out.println(); }
  }

  /* Creation d'une matrice de reels tires au sort entre  */
  /* 0 et une valeur limite pour un nombre arbitraire     */
  /* de lignes et de colonnes                             */

  public static float [][] matriceAuHasard(int lignes,int colonnes,float max) {
    float [][] m = new float[lignes][colonnes];
    for ( int i = 0 ; i < lignes ; i++ )
      for ( int j = 0 ; j < colonnes ; j++ )
        m[i][j] =(float) Math.random()*max;
    return(m);
  }

  /* Copie d'une matrice de reels dans une autre          */
  /* matrice d'entiers                                    */

  public static void copieMatrice(float [][] src,float [][] dst) {
    for ( int i = 0 ; i < src.length ; i++ )
      for ( int j = 0 ; j < src[i].length ; j++ )
        dst[i][j] = src[i][j];
  }

  /* Produit d'une matrice de reels 4x4 par une matrice   */
  /* de reels 4x4 avec stockage du resultat               */
  /* dans une 3eme matrice de reels 4x4                   */

  public static void produitMatrices4x4(float [][] m1,float [][] m2,float [][] t) {
    float [][] aux = new float[4][4];
    for ( int i = 0 ; i < 4 ; i++ )
      for ( int j = 0 ; j < 4 ; j++ ) {
        aux[i][j] = 0.0F;
        for ( int k = 0 ; k < 4 ; k++ ) {
          aux[i][j] += m1[i][k]*m2[k][j]; } }
    copieMatrice(aux,t);
  }

  /* Produit d'une matrice de reels quelconque            */
  /* par une matrice de reels quelconque avec stockage    */
  /* du resultat dans une 3eme matrice de reels           */
  /* (dimensions des 3 matrices compatibles               */
  /* avec le produit matriciel)                           */

  public static void produitMatrices(float [][] m1,float [][] m2,float [][] t) {
    float [][] aux = new float[m1.length][m2[0].length];
    for ( int i = 0 ; i < m1.length ; i++ )
      for ( int j = 0 ; j < m2[0].length ; j++ ) {
        aux[i][j] = 0.0F;
        for ( int k = 0 ; k < m1[0].length ; k++ ) {
          aux[i][j] += m1[i][k]*m2[k][j]; } }
    copieMatrice(aux,t);
  }

  /* Fonction principale                                  */

  public static void main(String [] args) {
    Console.setTitle("ProduitsMatrices");
    { float [][] mat1 = matriceAuHasard(4,4,1.0F);
      float [][] mat2 = matriceAuHasard(4,4,1.0F);
      Console.out.println("Matrice 1");
      affichageMatrice(mat1);
      Console.out.println();
      Console.out.println("Matrice 2");
      affichageMatrice(mat2);
      Console.out.println();
      float [][] mat = new float[4][4];
      produitMatrices4x4(mat1,mat2,mat);
      Console.out.println("Matrice destination apres produit 4x4");
      affichageMatrice(mat);
      Console.out.println();
      produitMatrices(mat1,mat2,mat);
      Console.out.println("Matrice destination apres produit");
      affichageMatrice(mat);
      Console.out.println(); }
    { float [][] mat1 = matriceAuHasard(4,2,1.0F);
      float [][] mat2 = matriceAuHasard(2,3,1.0F);
      Console.out.println("Matrice 1");
      affichageMatrice(mat1);
      Console.out.println();
      Console.out.println("Matrice 2");
      affichageMatrice(mat2);
      Console.out.println();
      float [][] mat = new float[4][3];
      produitMatrices(mat1,mat2,mat);
      Console.out.println("Matrice destination apres produit");
      affichageMatrice(mat);
      Console.out.println(); }
  }
}