Introduction au langage C/Tableau matrices complexes

Leçons de niveau 14
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Tableau matrices complexes
Icône de la faculté
Chapitre no 21
Leçon : Introduction au langage C
Chap. préc. :Matrices complexes 3
Chap. suiv. :Pointeurs d'entiers
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Introduction au langage C : Tableau matrices complexes
Introduction au langage C/Tableau matrices complexes
 », n'a pu être restituée correctement ci-dessus.


Introduction[modifier | modifier le wikicode]

  • Pour approfondir ce travail : "Mathc".

Le but[modifier | modifier le wikicode]

  • Des tableaux de matrices permet de travailler avec des boucles.

Les exemples[modifier | modifier le wikicode]

  • Le premier exemple montre la méthode.
  • Le second exemple automatise le travail (boucle for).
  • Le troisième exemple nous montre qu’il n'y a aucune raison que les matrices soient toutes de tailles identiques.


La librairie[modifier | modifier le wikicode]

  • Il faut utiliser la librairied'algèbre linéaire (n_1aa.zip).
  • Indispensable pour tester les exemples de cette page.
  • Le deuxième fichier n_1ab.zip donne des exemples sur les tableaux de matrices réelles et complexes.


Premier exemple[modifier | modifier le wikicode]

  • On créé un tableau de double pointeur fixe (double **A[3];)
  • On fait pointer chaque élément du tableau sur une matrice.
  • Ne pas oublier de libérer chaque élément du tableau.

Code source[modifier | modifier le wikicode]

/* ------------------------------------ */
#include "w_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;
double **A[3];

int r = rp_I(5);
int c = rp_I(5);

  srand(time(&t));

  A[0] = r_mZ(i_mZ(r,c),9);
  A[1] = r_mZ(i_mZ(r,c),9);
  A[2] =      i_mZ(r,c);

  printf(" A0 : ");
  p_mZ(A[0],5,0,5,0,6);

  printf(" A1 : ");
  p_mZ(A[1],5,0,5,0,6);

  printf(" A0plsA1 : ");
  p_mZ(add_mZ(A[0],A[1],A[2]),5,0,5,0,6);

  f_mZ(A[0]);
  f_mZ(A[1]);
  f_mZ(A[2]);

  return 0;
}


Deuxième exemple[modifier | modifier le wikicode]

  • L'intérêt des tableaux est d’utiliser une boucle.
  • Ici on initialise et on détruit le tableau dans une boucle for.
  • J’ai choisi de soulager la fonction main() en portant le maximum dans i_mZ_An()

Code source[modifier | modifier le wikicode]

/* ------------------------------------ */
#include "w_a.h"
/* ---------------------------------------------------  */
/* Initialisation d'un tableau de double pointeurs      */
/* Cette fonction dépend de la feuille de travail       */
/* Ici on veut des matrices de tailles alétoires [1..5] */
/* Initialiser avec des valeurs aléatoire [-9..9]       */
/* Ce travail est effectué ici pour soulager main()     */
/* ---------------------------------------------------  */
void i_mZ_An(
double **A[],
int n
)
{
int i = 0;

int r = rp_I(5);
int c = rp_I(5);

  for(;i<n;i++) A[i] = r_mZ(i_mZ(r,c),9);
}
/* ------------------------------------ */
void f_mZ_An(
double **A[],
int n
)
{
int i=0;

  for(;i<n;i++)f_mZ(A[i]);
}
/* ------------------------------------ */
int main(void)
{
double **A[3];
int i=0;

time_t t;

  srand(time(&t));

  i_mZ_An(A,3);

  add_mZ(A[0],A[1],A[2]);

  for(;i<3;)
      {
       printf(" A%d : ",i);
         p_mZ(A[i++],5,0,5,0,6);
      }

  f_mZ_An(A,3);

  printf(" Press return to continue \n");

  getchar();
  return 0;
}

Troisième exemple[modifier | modifier le wikicode]

  • Le tableau à 100 matrices de tailles différentes.
  • Ne pas oublier de libérer chaque élément du tableau.

Code source[modifier | modifier le wikicode]

/* ------------------------------------ */
#include "w_a.h"
/* ---------------------------------------------------  */
/* Initialisation d'un tableau de double pointeurs      */
/* Cette fonction dépend de la feuille de travail       */
/* Ici on veut des matrices de tailles alétoires [1..5] */
/* Initialiser avec des valeurs aléatoire [-9..9]       */
/*                                                      */
/*     LES MATRICES NON PAS TOUTES LA MEME TAILLE       */
/* ---------------------------------------------------  */
void i_mZ_An(
double **A[],
int n
)
{
int i = 0;

  for(;i<n;i++) A[i] = r_mZ(i_mZ(rp_I(5),rp_I(5)),9);
}
/* ------------------------------------ */
void f_mZ_An(
double **A[],
int n
)
{
int i=0;

  for(;i<n;i++)f_mZ(A[i]);
}
/* ------------------------------------ */
int main(void)
{
double **A[100];
int i=0;

time_t t;

  srand(time(&t));

  i_mZ_An(A,100);

  for(;i<100;)
      {
       printf(" A%d : ",i);
           p_mZ(A[i++],5,0,5,0,6);;
      }

  f_mZ_An(A,100);

  printf(" Press return to continue \n");

  getchar();
  return 0;
}