Calcul matriciel en C: multiplication, division, addition et soustraction

Les opérations arithmétiques sur les matrices : addition, soustraction, multiplication et division, puissance, ainsi que le calcul de la transposée, l'inverse et le déterminant.

/*
* www.codeurjava.com Copyright - tous droits réservés
*/
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include <iostream>

typedef struct matrice
{
    int ligne;
    int colonne;
    float data[99][99];
}matrice;

void afficher_matrice(matrice M){
     for(int i = 0; i < M.ligne; i++) {
        for(int j = 0; j < M.colonne; j++) {
            cout << M.data[i][j] ;
            cout << "\t";
        }
        //retour à la ligne
        cout << "\n";
     }
     cout << "\n";
}

//Additionner A et B
struct matrice addition(matrice A, matrice B)
{
      matrice C;
      C.ligne = A.ligne;
      C.colonne = A.colonne;
      if(A.ligne==B.ligne && A.colonne==B.colonne)
      {
        for (int I = 0; I < A.ligne; I++)
          for (int J = 0; J < B.colonne; J++)
          {
              C.data[I][J] = A.data[I][J] + B.data[I][J];
          }
      }
      else
          printf("Dimensions illegales\n");
      return C;
}

//Soustraire B de A
struct matrice soustraction(matrice A, matrice B)
{
      matrice C;
      C.ligne = A.ligne;
      C.colonne = A.colonne;
      if(A.ligne==B.ligne && A.colonne==B.colonne)
      {
        for (int I = 0; I < A.ligne; I++)
          for (int J = 0; J < B.colonne; J++)
          {
              C.data[I][J] = A.data[I][J] + B.data[I][J];
          }
      }
      else
          printf("Dimensions illegales\n");
      return C;
}

//Produit de A et B
struct matrice produit(matrice A, matrice B)
{
      matrice C;
      C.ligne = A.ligne;
      C.colonne = A.colonne;
      for (int I = 0; I < A.ligne; I++)
      for (int J = 0; J < B.colonne; J++)
      {
          C.data[I][J] = 0;
          for (int K = 0; K < A.colonne; K++)
          {
              C.data[I][J] += A.data[I][K] * B.data[K][J];
          }
      }
      return C;
}

//puissance de A 
struct matrice puissance(matrice A, int n)
{
      matrice C;
      C.ligne = A.ligne;
      C.colonne = A.colonne;
      for (int I = 0; I < A.ligne; I++)
      for (int J = 0; J < B.colonne; J++)
      {
          if(A.data[I][J]!=0)
             C.data[I][J] = 1;
          for (int K = 0; K < n; K++)
          {
              C.data[I][J] = C.data[I][J] * A.data[I][J];
          }
      }
      return C;
}

//Calcul récursif de déterminant 
double det(matrice A){
double somme = 0;
int signe;

if(A.ligne==1){//point d'appuis si la taille de la matrice est égale 1
return(A.data[0][0]);
}

for (int i=0;i<A.ligne;i++){ 
          //trouver le determinant en utilisant le developpement ligne par ligne
          //créer une sous matrice qui n'est pas dans la meme ligne et colonne
          matrice SM;
          SM.ligne = A.ligne-1;
          SM.colonne = A.colonne-1;
          for (int a=1;a<A.ligne;a++){
for (int b=0;b<A.ligne;b++){
                  if(b<i)
    SM.data[a-1][b]=A.data[a][b];
                  else if(b>i)
                     SM.data[a-1][b-1]=A.data[a][b];
              }
           }
           if(i%2==0) //changement de signe est basé sur i
signe=1;
           else
signe=-1;
           // appel recursif.
           somme+=signe*A.data[0][i]*(det(SM));
}
//retourner la valeur final du déterminant
return (somme); 
}

//Matrice transposée
matrice transposee(matrice A){
matrice T;
T.ligne = A.colonne;
            T.colonne = A.ligne;
for (int i = 0; i < A.ligne; i++)
                 for (int j = 0; j < A.ligne; j++)
                       T.data[j][i] = A.data[i][j];
return T;
}

//Matrice des cofacteurs
matrice coMatrice(matrice A){
  matrice T;
T.ligne = A.ligne;
T.colonne = A.colonne;
int signe;

if(A.ligne==1){//point d'appuis si la taille de la matrice est égale 1
  return A;
}

for (int i = 0; i < A.ligne; i++){
                 for (int j = 0; j < A.colonne; j++){
                   //sous matrice
                      matrice SM;
                      SM.ligne = A.ligne-1;
SM.colonne = A.ligne-1;
                     for (int a=0;a<A.ligne;a++){
                         for (int b=0;b<A.ligne;b++){
                               if(a<i && b<j)
                                 SM.data[a][b]=A.data[a][b];
                               else if(a<i && b>j)
        SM.data[a][b-1]=A.data[a][b];
        else if(a>i && b<j)
                                     SM.data[a-1][b]=A.data[a][b];
                               else if(a>i && b>j)
        SM.data[a-1][b-1]=A.data[a][b];
                         }
                     }
            if((i+j)%2==0)
            signe = 1;
                else
                           signe = -1;
                      if(SM.ligne <= 2 )
            T.data[i][j]=signe*(SM.data[0][0]*SM.data[1][1]-SM.data[0][1]*SM.data[1][0]);
            else
            // appel recursif.
            coMatrice(SM);
                 }
             }
return T;
}

//Matrice multipliée par un scalaire
matrice produitScalaire(matrice A, double scalaire)
{
        for (int I = 0; I < A.ligne; I++)
            for (int J = 0; J < A.colonne; J++)
A.data[I][J] = A.data[I][J] * scalaire;
return A;
}

//Matrice inverse A^-1
matrice inverse(matrice A)
{
        return produitScalaire(transposee(coMatrice(A)), 1/det(A));
}


//tester si la matrice est inversible
bool estInversible(matrice A){
/*
 A est inversible si A * A^-1 = 1
*/
matrice r = produit (A, inverse(A));
/*
* si le produit donne une matrice identité
* alors A est inversible
*/
for (int i = 0; i < A.ligne ; i++)
          if(r.data[i][i]!=1)
return false;
return true;
}

//Division de A sur B
struct matrice division(matrice A, matrice B)
{
      matrice C;
      C.ligne = A.ligne;
      C.colonne = A.colonne;
      if(A.ligne != A.colonne && estInversible(B))
         printf("Dimension illégales ou B est inversible");
      else
    return produit(A,inverse(B));
}

int main(int argc, char *argv[])
{
      matrice A,B,C;
      A.ligne=3;
      A.colonne=3;
      for (int i=0; i<A.ligne ;i++)
        for (int j=0; j<A.colonne; j++)
        {
            printf("A[%d][%d] ",i,j);
            scanf("%d",&A.data[i][j]);
        }
      printf("A = \n");
      afficher_matrice(A);

      /*
      2ème matrice
      */
      B.ligne=3;
      B.colonne=3;
      for (int i=0; i<B.ligne ;i++)
         for (int j=0; j<B.colonne; j++)
         {
            printf("B[%d][%d] ",i,j);
            scanf("%d",&B.data[i][j]);
         }
      printf("B = \n");
      afficher_matrice(B);

      //additioin
      printf("***********************\n");
      printf("      addition         \n");
      printf("***********************\n");
      C = addition(A,B);
      afficher_matrice(C);
      //soustraction
      printf("***********************\n");
      printf("     soustraction      \n");
      printf("***********************\n");
      C = soustraction(A,B);
      afficher_matrice(C);
      //produit
      printf("***********************\n");
      printf("      produit          \n");
      printf("***********************\n");
      C = produit(A,B);
      afficher_matrice(C);
      //divisioin
      printf("***********************\n");
      printf("      divisioin        \n");
      printf("***********************\n");
      C = division(B,A);
      afficher_matrice(C);
      
      return 0;
}