Partage
  • Partager sur Facebook
  • Partager sur Twitter

stockage de matrices

Sujet résolu
    10 juin 2019 à 12:39:19

    Bonjour. J'ai besoins d'enregistrer une matrice dans un fichier. Pour la compresser, j'ai choisi une méthode où la ligne:

    0 0 3 3 3 3 3 5 6 5 4 5 deviens

    2*0 5*3 5 6 5 4 5.

    Voci le code:

    template<typename T, typename Transtyp>
    	void ligne(Matrice<T>& mat,std::wostream& flux, bool separervv=1, char separateurcv='-',char separateurvv=' ') {//separervv: sépare le nombre d'occurence de la valeur ou non
    		                                                                                       //separateurcv: separateur le nombre d'occurence de la valeur
    		                                                                                       //seprateurvv: separateur entre les valeurs d'une même ligne
    		int j, cpt;
    		flux <<  mat.h << ' ' << mat.w << ' ';
    		for (size_t i = 0; i < mat.h; i++) {
    			j = 0;
    			while (j+1<mat.w) {
    				cpt = 0;
    				while (mat(i, j) == mat(i, j + 1)) {//tq on a le même symbole
    					j++;
    					cpt++;//1 val de +
    					if (j + 1 == mat.w) {//si j est le dernier de la ligne
    						break;
    					}
    					else if (j + 1 == mat.w - 1) {//si j+1 est le dernier de la ligne
    						cpt++;
    						break;
    					}
    				}
    				if (cpt == 0) {
    					flux << (Transtyp)mat(i, j) << separateurvv;
    					if (j + 1 == mat.w - 1) {
    						flux << (Transtyp)mat(i, j+1) << separateurvv;
    					}
    				}
    				else {
    					if (separervv) {
    						flux << cpt + 1 << separateurcv << (Transtyp)mat(i, j) << separateurvv;
    					}
    					else {
    						flux << cpt + 1 << (Transtyp)mat(i, j) << separateurvv;
    					}
    					
    				}
    				j++;
    			}
                            flux << '\n'; 
    		}
    	}

    Mais alors pour le décodage, je ne veut pas perdre la généralité sur les types de données de la matrice. Sauf que ce qui se trouve dans le fichier peut être du type 5*9-2*3-6-7-4-5*5.

    Alors je pourrais me débrouiller en mettant chaque ligne dans un string et utiliser strtol, mais ça supposerait qu'on ait une matrice d'entiers.

    J'aimerais alors savoir comment décoder de manière générale, ou un moyen d'encoder de manière compressée un std::vector (qui est le conteneur de la matrice) et le décompresser par une bibliothèque ou la stl

    • Partager sur Facebook
    • Partager sur Twitter
    Le basheur
      11 juin 2019 à 11:37:19

      Pourquoi ne pas utiliser des librairies spécialisées en calcul matriciel qui gèrent normalement elles-mêmes ce genre de détail ?
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        11 juin 2019 à 11:42:18

        Salut,

        Je t'avoue que je n'ai pas tout compris. Quand tu lis le fichier, il suffit de convertir le nombre en entier/double ( strtod par exemple, qui te donne l'adresse de fin, à laquelle tu peux continuer de parser). Si tu veux des entiers, strtol par exemple.

        Si tu veux que le type soit automatique, c'est un peu plus compliqué je pense : si tu as 10 entiers et 1 double, tu veux que ta matrice soit de type double, or tu ne le sais pas au début. Un manière serait de stocker le type de la matrice au début de ligne, sinon, tu peux garder des entiers, et les convertir en double si tu rencontre un double. Pour savoir s'il sagit d'un double ou long, tu peux faire un strtol, et regarder si au caractère d'après tu as un '.'

        Enfin, il est possible de compresser n'importe quoi (en utilisant zlib par exemple). Et dans ton cas, il me semble que ta 'compression' ne soit pas optimale : tu écrire dans le fichier octet par octet pour avoir un fichier de poids minimal.

        Un exemple:

        1er byte -> Type de la matrice (long, double, int, char, etc.) -> influe sur la taille de chaque element

        2e byte -> Nb de colonnes (0-255)

        3e byte à fin du fichier -> Valeurs de la matrice (chaque valeur est sur 1 byte si c'est une matrice de char, 4 bytes pour int, etc.)

        Enfin, ce que je te dis est surtout bien à mettre en place d'un point de vue pédagogique, mais je suis sûr qu'il existe des bibliothèques qui font ça très bien, sans bricoler un truc qui sera pas très efficace (cf ce que dit @bacelar)
        • Partager sur Facebook
        • Partager sur Twitter

        J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

        stockage de matrices

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown