Copier une matrice

Signaler
Messages postés
21
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
12 mai 2008
-
Messages postés
15021
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 avril 2021
-
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

Messages postés
286
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
27 décembre 2009
2
salut,

quel est ton problème en fait ?

Loki
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
"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++
Messages postés
21
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
12 mai 2008

c'est pas performants les new?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
15021
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 avril 2021
94
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...
Messages postés
21
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
12 mai 2008

je suis pas stupide,
je veux pas faire ça car c'est pas performant, c'est pourquoi je cherche une méthode de copiage.
Messages postés
15021
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 avril 2021
94
???
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...