[C++] Grandes matrices

Fermé
Omega_55 - 23 juil. 2006 à 20:16
 nadia09 - 11 mai 2008 à 12:26
Salut à tous,

Je bidouille un code de calcul scientifique qui requiert de gérer de grandes matrices. Actuellement je parviens à faire une matrice carrée de taille 10 000 sans trop de problème, mais au delà il semble que la mémoire ne suive pas.

Comme mes matrices ont toutes beaucoup de zeros, je me demandais quelle solution il serait optimal d'utiliser por ne stocker QUE les éléments non nuls de la matrice, avec les deux indices (i,j) y correspondant. Il faudrait pouvoir accéder à tous les éléments de la matrice, mais que seuls les éléments non nuls soient stockés, pour éviter de surcharger la mémoire.

Je sais que la STL comprend des containers performants, mais je ne les connais pas bien. Quelqu'un aurait-il une idée ?

Merci d'avance

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juil. 2006 à 08:37
Salut.
si tu fait une martice 10^4×10^4, il est clair que tu va avoir des problèmes mémoires.
Une première solution "evidente" est d'optimiser la taille du type de matrice : short à la place d'int, etc.
peut être qu'une matrice de pointeur prendrai moins de place, comme ça tu ne crée pas tout les éléments qui sont nuls, et tu gagne de la place.
Ils sont où tes zéros? réparti, ou tu a une matrice diagonale en block?
0
Salut CharSnipeur,

En fais je pense que je viens de trouver la solution: il y a dans la STL une template "map" qui permet d'associer deux types.

Par exemple ici j'aurais
map<int,float> matrice;
matrice[0]=1.5;
matrice[20]=1.687;

Ce qui est super avec les map, c'est que si je fais

float a=matrice[10];

il retourne zero, par ce que je n'ai pas défini l'élément n°10. Donc ça résout parfaitement le problème, à condition que je stocke les éléments de ma matrice "linéairement" (pas de tableau à 2 dimensions), mais ça ne me dérange pas, j'ai déja fait comme ça.

Sinon, j'ai bien pensé à remplacer les double par des float, mais ça prenait encore une place mémoire énorme.

Je vais essayer mon algorithme de résolution matricielle (Gauss) avec les map pour être sûr que ça n'entraîne pas de ralentissement. Si ça ralentit trop, je tenterai ta solution des pointeurs.

A+
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juil. 2006 à 16:40
Ok, bonne chance.
Je vien de regarder des aides sur map car je ne m'y suis jamais intéresser.
J'ai l'impression que tu pourrai utiliser map<int[2],float>
ou alors struct pos_mat{unsigned int ligne;unsigned int colonne;...}
puis map<pos_mat,float> matrice.
ensuite matrice[pos_mat(1,10)]=...;
Un point important d'un programme, est de pouvoir le relire facilement.
0
Salut
comment vous avez créer une matrice carrée de 10000 je suis encore a 100 et ça ne marche pas encore mon ordinateur se plante. Si vous programmez en C merci de m'aider et de m'envoyer comment vous y arriver a créer une matrice de 10000.
Merci
0