Copier une matrice

diable007 Messages postés 21 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 12 mai 2008 - 7 oct. 2007 à 03:08
BunoCS Messages postés 15474 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 22 avril 2024 - 8 oct. 2007 à 14:08
bonjour,
j'ai besoin de copier une matrice dans une autre
exemple copier cette matrice d'ordre 2
11
10
dans une matrice d'ordre 4
 donc copier 4 fois cette matrice puisque la nouvelle matrice contient 4 lignes et 4 colonnes donc ma nouvelle matrice:
11   11
10   10

11   11
10   10

sachant que j'ai la fonction suivante pour construire une matrice et j'utilise pas de pointeur

Matrice(unsigned int nl, unsigned int nc)
{
   n = nl;
   m = nc;
   lignes = new ligne[n];  // allocations
   for (unsigned int i=0; i<n; i++)
   {   
      lignes[i] = new double[m];
      for(unsigned int j=0; j<m; j ++)
         lignes[i][j] = 0;  //initialisation à '0'
   }
}

merci d'avance

7 réponses

Loki6 Messages postés 286 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 27 décembre 2009 2
7 oct. 2007 à 19:24
salut,

quel est ton problème en fait ?

Loki
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 oct. 2007 à 19:34
"j'utilise pas de pointeur"
c'est quoi d'autre qu'un pointeur le retour de 'new' ???

Tu es certain que ce sera performant avec tous ces new en boucle ? sans compter les delete correspondants qu'il faudra.

ciao...
BruNews, MVP VC++
0
diable007 Messages postés 21 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 12 mai 2008
7 oct. 2007 à 20:21
c'est pas performants les new?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 oct. 2007 à 20:47
En boucle aucun appel d'alloc n'est performant, surtout si on peut s'en passer.


TON CODE:
  lignes = new ligne[n];  // allocations
  for(unsigned int i=0; i<n; i++) {  
    lignes[i] = new double[m];
    for(unsigned int j=0; j<m; j ++) lignes[i][j] = 0;
  }


Donc le but est d'obtenir un tableau de:
n * m * sizeof(double)
S'obtient idem en 1 seule alloc:
doubles *lignes = (double*) malloc(n * m * sizeof(double));


Les temps d'accès aux éléms seront ensuite nettement meilleurs, aucun besoin de déréférencer des adresses, on y pointe dirrct.
Il y aura aussi 1 seule désalloc, tout benef.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15474 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 22 avril 2024 103
8 oct. 2007 à 11:06
Salut,
Encore des problèmes avec tes matrices?
C'est quoi le souci? Tu as une matrice 2x2 et tu veux en faire une 4x4 en recopiant les valeurs?
Si tu sais construire une 2x2, tu répètes le processus en décalant les indices de boucles...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
diable007 Messages postés 21 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 12 mai 2008
8 oct. 2007 à 12:19
je suis pas stupide,
je veux pas faire ça car c'est pas performant, c'est pourquoi je cherche une méthode de copiage.
0
BunoCS Messages postés 15474 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 22 avril 2024 103
8 oct. 2007 à 14:08
???
Loin de moi l'idée de t'insulter, rassures-toi! Si tu l'as pris comme tel, je te prie de m'excuser...
Qu'entends-tu par "copiage"?
Tu peux avoir une fonction de ce type (pas du tout testé, plutôt du pseudo-code sur lequel s'appuyer):

Matrice::copie(int HauteurSousMatrice, int LargeurSousMatrice, Matrice & sousMatrice, int NbCopie)
{
  // Allocation de la matrice
  // Hauteur = HauteurSousMatrice*NbCopie
  // Largeur = LargeurSousMatrice*NbCopie

  // Remplissage
  for (int i=0; i<NbCopie, i++)
  {
    // Copie de la sous matrice "à la bonne place"
    // indexLargeur de départ:  i*LargeurSousMatrice
    // indexHauteur de départ: i*HauteurSousMatrice
    for (int x=0; x<LargeurSousMatrice; x++)
      for (int y=0; y<HauteurSousMatrice; y++)
        this->matrice[i*LargeurSousMatrice+x][i*HauteurSousMatrice+y]=sousMatrice[x][y];
  }
}

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous