Matrice creuse avec les listes linéaires chainées

Fermé
Ra_Wa Messages postés 1 Date d'inscription lundi 21 mars 2016 Statut Membre Dernière intervention 21 mars 2016 - 21 mars 2016 à 17:19
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 - 30 mars 2016 à 19:06
Bonsoir tous le monde ,,

Je suis besoin de vos aides a propos de "Matrice creuse ".
Donc
On utilise les listes linéaires chainées (LLC) comme structure de données pour ne représenter que les éléments non nuls d'une matrice creuse . Une matrice A de taille NxM peut alors être représentée par un tableau de taille N ses indices indiquent les numéros de lignes de la matrice A. Chaque élément d'indice i du tableau contient
  • la taille
  • l'adresse du premier maillon d'une LLC des éléments non nuls de la ligne i de la matrice A,

un maillon de cette LLC contient alors le numéro de la colonne j ainsi que la valeur A[i,j], cette liste doit être triée selon le numéro de la colonne.
    • Construire une matrice creuse à partir d'une matrice pleine .//J'ai la fait c bon !!
    • Calculer la somme, produit de deux matrices creuse , la transposée, le déterminant, l'inverse d'une matrice creuse.


j'ai arrivé a la somme et j'ai un petit problème dans le parcourt des colonnes .. c-à-dire le problème c'est que mon programme fait uniquement la somme de la 1ere colonnes puis il saute directement vers la ligne suivante et il ne continue pas jusqu'à la fin de la ligne ..

merci d'avance !!

1 réponse

mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
Modifié par mamiemando le 30/03/2016 à 19:08
Bonjour,

Il faudrait nous donner la définition de tes structures pour plus de clarté. Si j'ai bien compris ça doit être quelque chose du genre :

typedef struct _cell_t {
  unsigned column_index;
  double value;
  struct _cell_t * next_cell; // NULL si dernière cellule de la ligne
};

typedef struct _line_t {
  unsigned line_index;
  cell_t * first_cell; // Non NULL si la ligne est non vide.
  struct _line_t * next_line; // NULL si dernière ligne
} line_t;

typedef struct _sparse_matrix_t {
  line_t * data;
} sparse_matrix_t;


Du coup itérer dessus revient à faire :

double sum(const sparse_matrix_t * m) {
  double sum = 0;
  for (line_t * line = m->data ; line ; line = line->next_line) {
    // unsigned i = line->line_index;
    for (cell_t * cell = line->cell ; cell ; cell = cell->next_cell) {
      // unsigned j = cell->column_index;
      sum += cell->value;
    }
  }
  return sum;
}


Bonne chance
0