Gérer miex la memmoire pour le calcul matriciel

Signaler
Messages postés
38
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
20 février 2008
-
Messages postés
38
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
20 février 2008
-
salut,j'utilise une classe faite en C++ pour les calculs matriciels de grand taille la classe est le suivant:c'est le fichier .h[quote]/* Matrix.h*/#ifndef __TMATRIX H__ #define __TMATRIX H__   #include #include using namespace std;  class TMatrixException /* Exception class for TFloatMatix */ {     public:       enum Exception       {            DIM_TOO_SMALL ,            NOT_SAME_DIM ,            NOT_SQUARE ,            NOT_MULTIPLICABLE,           NOT_UNI_COLUMN      };         TMatrixException(Exception);       Exception Err; };   template class TMatrix {     public:       /* ---------------------- Attributes --------------------------- */       T *M;                              /* Linear matrix data storage */       T **P;                            /* Pointers on each rows */       int dimR;                        /* Number of rows ( column size ) */       int dimC;                       /* Number of columns ( row size ) */               /* ----------------------- Builders --------------------------- */       TMatrix(int );                             /* for square matrix */       TMatrix(int dimRow=10, int dimCol=1);        /* Default, For NxM matrix */       TMatrix(const TMatrix&);               /* Copy */       ~TMatrix();                             /* de-allocate memory */         /* -------------------- Utils procedures ----------------------- */       void clear();                            /* Reset to 0 all elements */       void destroy();                          /* de-allocate memory */       TMatrix resize(int,int);             /* Set a new dimension */       void resize(int dim=2);                /* The same, for square */       void in(T*);                         /* Input data in a matrix */       ostream& out(ostream&) const;          /* Display matrix on std::out */        /* ------------- Functions and procedure on this object ------- */       TMatrix ones();      TMatrix zeros();      TMatrix cofactor();                  /* Return cofactor matrix */       T cofactor(int, int);               /* 1 element cofactor */       T determinant();                  /* Determinant of a matrix */       void transpose();                   /* Transpose a matrix*/      TMatrix transpose1();          /* Transpose a matrix that returns a Mtarix*/       void reverse();                /* Reverse a matrix */       void TC();                    /* Transpose and cofactor matrix */       TMatrix mean();           /* mean value of array*/      T norm();                      /*matrix norms*/      TMatrix fill( const TMatrix&  ,const int ) ;     /* ---------------------- Operators ---------------------------- */       TMatrix& operator=(const TMatrix&);            TMatrix operator-()                  ;       TMatrix operator+(const TMatrix&) ;       TMatrix operator-(const TMatrix&) ;       TMatrix operator*(const TMatrix&) ;       TMatrix operator*(const T);       TMatrix operator*=(const T);       TMatrix operator*=(const TMatrix&  );      TMatrix operator/(const T );      TMatrix colonne(const int );      T det3x3();                            /* return the determinant of a 3x3 matrix */       T det2x2();                            /* return the determinant of a 2x2 matrix */       TMatrix mul(const TMatrix&);  /* Multiply two matrices */ };   template ostream& operator> (istream&, TMatrix&); #endif //===========================================================================/quotec'est le programme .CPP[quote]   // DernierMatrice11-7-06.cpp : définit le point d'entrée pour l'application console.//#include "stdafx.h"#include #include #include #include #include #include "Matrix.h" using namespace std;TMatrixException::TMatrixException(Exception e) : Err(e) {     if (e==DIM_TOO_SMALL)     {         cout

5 réponses

Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
M=new T[dimR*dimC*sizeof(T)];


Ici sizeof(T) est de trop, donc tu alloue sizeof(T) fois trop
de memoire. Je te conseil d'utilisée des bibliothèques spécialisée
comme NTL ou Blitz++ qui sont trés optimisées, a première vue ta classe
semble contenir quelque bug. A quoi sert le membre P ?
Messages postés
38
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
20 février 2008

le membre P est u tableau de 2 dimensions danslaquelle on rempli les elements deja sauvegardé dans M.j ai essayer de travailler sous Blitz++ mais j ai pas trouvé les fonction necessaire pour mes calculs et comme vous connaissez.c'est dificilede faire de changement dans une bibliotheque deja faite.
 j ai essayé ce programme avec plusieurs exemple et à priori j ai pas  trouvé de bugs.
donc vous ne trouvez pas de moyens pour améliorer ce programme?
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
Si la bibliotheque n'est pas aussi complete que ca, tu peux tout
simplement implementer la fonctionnalité manquante à l'aide de la
bibliotheque (sans la modifier, une couche au dessus). Et si tu as
besoin de performances tu peux te fier à Blitz++, l'utilisation des
templates C++ pour optimiser les calculs est loin d'etre évidente à
comprendre, trés lourde à écrire mais au niveau des performance ca
donne de bons résultats.


"j ai essayé ce programme avec plusieurs exemple et à priori j ai pas  trouvé de bugs."


Faut faire des tests poussés, tester tout les branchements...

Je vois plusieurs problemes comme la politique de propriété du buffer
alloué (RAII, implémentation du corps de copie) ou des fuites (méthode
resize) et surtout c'est trés loin au niveau performance et qualité de
l'interface des bibliothèques citées.


"le membre P est u tableau de 2 dimensions danslaquelle on rempli les elements deja sauvegardé dans M"


Je penses qu'il est inutile alors.
Messages postés
38
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
20 février 2008

j ai travillé sous blitz++ mais j ai pas trouvé des operation evident comme la multiplication de 2 matrices et la remplissage des matrices par ds milliers des elements.

comment ca sera la definition de P si je l utilise pas, je le trouve necessaire.

est ce que la place ou on met la destruction des matrice par l'opération peut aider pour la liberation de mémoire?

merci
Messages postés
38
Date d'inscription
jeudi 29 juin 2006
Statut
Membre
Dernière intervention
20 février 2008

par contre j ai utilisé la fonction destroy apres avoir plusieurs problme avec la destructeur.car il m'affiche beaucoup des exeptions.je ne sas si l utilisation du destructeur peut aider un peu.