Matrice blocs homogènes

Fermé
haikei00X Messages postés 67 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 11 janvier 2016 - 22 juil. 2014 à 15:12
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 sept. 2014 à 21:37
Bonjour c'est encore moi. Je crois qu'il y a eu un mal entendu la dernière fois. En fait je ne vous demande pas de faire mes devoirs à ma place, mais de m'expliquer la dernière question de l'exercice qui me semble un peu flou. J'ai fait tout le reste. Voilà je répète la question .

-> A partir des blocs homogènes trouvés par la question 1, générer une matrice qui sera une approximation de la matrice M initiale.

Je ne vous demande pas de me donner la réponse mais de m'expliquer le principe sur lequel je dois me baser pour construire cette matrice finale à partir des blocs homogènes.

Merci d'avance.

8 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
23 juil. 2014 à 13:52
Bonjour,
que veux-tu dire par bloc homogène ?
a tu à des éléments de même natures, même forment, de même taille , où tous simplement parmi pas mal d'objets tu dois créé une matrice qui représente l'ensemble des objets homogène ?
bref tu peux nous en dire plus .
à bientôt
0
haikei00X Messages postés 67 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 11 janvier 2016 3
Modifié par haikei00X le 23/07/2014 à 15:10
Bonjour sambia39,
Voilà je m'explique un peu. On a une matrice de dimension " puissance de 2" on doit dans un premier lieu vérifier si l'écart type de la matrice est inférieur à un seuil fixé si c'est le cas on s'arrête, si non on divise la matrice en 4 blocs et on refait la même chose avec chaque bloc. La division des blocs des blocs s'arrête si l'écart type est inférieur au seuil ou si la dimension atteinte est 2 . Un bloc est dit homogène si son écart type est inférieure au seuil fixé. A la fin quand on aura rassemblé tous les blocs homogènes , et c'est là ou je bloque, on doit construire une matrice finale approximative à la matrice initiale à partir de ces blocs homogènes trouvés.
Ma question est la suivante:
Sur quoi je dois me baser pour générer cette matrice finale à partir des blocs homogènes?
Merci d'avance.
P.S Les blocs sont représentés de la manière suivante :{ligne,colonne,taille,moyenne}
Par exemple le bloc {0,0,2,10} est le bloc qui commence par la ligne 0,la colonne 0 est de taille 2 et de moyenne 10.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 25/07/2014 à 14:14
Bonjour,

Là, c'est plus un problème de compréhension que de C...
on doit construire une matrice finale approximative à la matrice initiale à partir de ces blocs homogènes trouvés.
C'est à nous de te poser la question :-). Si tu ne sais pas, peut-être, voir avec ton prof (s'il s'agit d'un exercice).

Cdlt,

Google is your friend
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 juil. 2014 à 16:47
Je crois que tu as mal saisi mon message...
Nous, on est là pour aider à partir d'un énoncé clair.
Si l'énoncé n'est pas clair au départ, on ne peut pas faire grand chose... Seul le rédacteur peut aider...
Bref, tant que tu ne seras plus clair, je crains que tu obtiennes de l'aide...
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
25 juil. 2014 à 20:44
Bonsoir, alors d'après tes explications, ta matrice approximative doit être l'ensemble de tes blocs homogènes c'est-à-dire le résultat de ta division et elle doivent toutes avoir une taille identique et dont l'ensemble doit plus ou moins être l'équivalent de ta matrice initiale voir la moitié de celle-ci (je pense)
Cependant est-il possible de voir le code, le pseudo-code ou l'algorithme dont as-tu à écris ?

à bientôt
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 25/07/2014 à 23:11
sambia39, c'est ce que je comprends aussi. Mais en l'assemblant ainsi, on obtient exactement la matrice initiale, non ?
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
27 juil. 2014 à 14:02
Bonjour
oui, je le pense aussi mais, j'ai des forts doutes, car il faut également prendre en compte l'autre facteur (tous les autres blocs que l'on ne désire pas) et c'est justement là qu'il peut y avoir un hic, car au final, si on a plus de mauvais bloc que le contraire, l'ensemble des blocs ne formerait pas (plus ou moins) sa matrice initiale vue que l'on cherche à s'en approcher.

Cependant, je suis d'accord avec toi sur ce point que c'est plutôt une question de logique que de langage C, de plus je dirais avec précision que c'est plus un exercice mathématique que l'on doit appliquer à l'informatique, ça fait penser aux réducteurs de matrice, sans rentré dans les détaille qui est utilisé pour donner une autre matrice semblable ou qui s'en approche, grâce au changement de base de la matrice dans un état fini (algèbre linéaire les matrice endomorphisme/ polynômes d'endomorphismes).

Bref, ce qui m'amène à poser les questions suivantes à @haikei00X :
jusque-là qu'est-ce que tu as déjà faite et surtout quel est l'algorithme que tu à utiliser ?
Peux-tu poster ton algorithme et ton code sources ?
et surtout peux-tu nous fournir l'énoncé exact de ton problème car, sans lui on ne peut pas t'aider voir même à coup sûr ont fait dur hors sujet.
à bientôt
0
haikei00X Messages postés 67 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 11 janvier 2016 3
4 août 2014 à 15:31
Bonjour, voilà l'énoncé exact:
On suppose qu'on a une matrice M de valeurs entières supposée carrée de taille n (n est une puissance de 2). On veut chercher les blocs homogènes de la matrice M et les stocker dans un tableau ou dans une liste chaînée. Chaque bloc homogène est identifié par ses coordonnées i et j, sa taille et sa moyenne. Les blocs homogènes sont les blocs qui ont un écart-type inférieur à un seuil S fixé.
Pour trouver les blocs homogènes, on procède de la manière suivante:
1 - Si ecart-type(M) < S (seuil fixé) on arrête
2- Sinon divisez la matrice en 4 blocs : M1, M2, M3, M4 et pour chaque bloc Mi (i=1, 2, 3, 4), refaire la même procédure jusqu'à trouver un bloc homogène ou la taille du bloc atteint 2x2.
M1 M2
M3 M4
Exemple:
int M[max][max]={ {10,10,20,20,40,40,40,40},
{10,10,20,20,40,40,40,40},
{30,30,50,50,40,40,40,40},
{30,30,50,50,40,40,40,40},
{60,60,60,60, 5, 5,20,20},
{60,60,60,60, 5, 5,20,20},
{60,60,60,60,20,20, 7,5},
{60,60,60,60,20,20, 7, 7}};
Les blocs homogènes de M, selon un seuil de valeur égale à 5, sont:
{0,0,2,10},{0,2,2,20},{2,0,2,30},{2,2,2,50},{0,4,4,40},{4,0,4,60},{4,4,2,5},{4,6,2,20},
{6,4,2,20},{6,6,2,7}.
Par exemple le bloc identifié par {2, 0, 2, 30} est le bloc qui commence à partir de la ligne n°2 et la colonne n°0, de taille 2 et de moyenne 30.

Travail demandé:
Utiliser les différentes structures de données manipulées en cours permettant de:
- De générer les blocs homogènes d'une matrice M donnée selon un seuil S fixé.
- A partir des blocs homogènes trouvés par la question 1, de générer une matrice qui sera une approximation de la matrice M initiale.
- Refaire le même travail, en supposant que la matrice sera remplie à partir d'un fichier contenant des données.
0
haikei00X Messages postés 67 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 11 janvier 2016 3
4 août 2014 à 15:41
Voilà mon code:



#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<math.h>

#define maxD 64
#define s 5



typedef double matD[maxD][maxD];
typedef struct noeud *ptr;

matD I,J,K,L;

typedef struct bloc{
int ligne;
int colonne;
int taille;
float moyenne;
}bloc;

struct noeud {
bloc cont;
ptr suiv;
};



/****************************************************/
void inser_fin(ptr &liste,bloc a)
{ ptr p,q;

/* creer le noeud */
p=(ptr) malloc(sizeof(struct noeud));
if (p==0) {printf("Pas d'espace mémoire\n"); exit(1) ;}

/* remplir le noeud par les données */
p->cont.ligne=a.ligne;
p->cont.colonne=a.colonne;
p->cont.taille=a.taille;
p->cont.moyenne=a.moyenne;
p->suiv=NULL;
/* si la liste est vide */
if (liste==NULL)liste=p;
else
{// recherche le dernier du noeud
for(q=liste;q->suiv!=NULL;q=q->suiv);
//lier le dernier avec le noeud à insérer
q->suiv=p;

}
}
/*************************************************/


/*******************************************************/
void affiche(ptr liste)
{
ptr p;

for(p=liste;p!=NULL;p=p->suiv)
printf("%d\t%d\t%d\t%f ",p->cont.ligne,p->cont.colonne,p->cont.taille,p->cont.moyenne);

printf("\n");

}
/*************************************************************/


/*********************************************************************/
void saisir_mat(matD M,int &n)
{int i,j;
printf("Donnez la dimension de la matrice M puissance de 2:\n");
scanf("%d",&n);

for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
M[i][j]=rand()%10;
printf("M[%d][%d]=%lf\n",i,j,M[i][j]);

}
}
/**********************************************************************/


/****************************************************/
float moyenne(matD M,int i,int j,int n)
{int p,q;
float moy=0;

for(p=i;p<n;p++)
for(q=j;q<n;q++)
moy=moy+M[p][q];
moy=moy/(n*n);

return(moy);

}
/****************************************************/


/**************************************************/
float ecart_type(matD M,int i,int j,int n)
{int p,q;
float ect=0;

for(p=i;p<n;p++)
for(q=j;q<n;q++)
ect=ect+pow( (M[p][q]-moyenne(M,i,j,n)),2 );
ect=ect/(n*n);
ect=sqrt(ect);


return(ect);

}
/**************************************************/


/****************************************************************/
void parcourt(matD M,matD N,int i,int j,int &n)
{int p,q;

for(p=i;p<n/2;p++)
for(q=j;q<n/2;q++)
{ N[p][q]=M[p][q];
//printf("N[%d][%d]= %lf\n",p,q,N[p][q]);
}

n=n/2;
}
/***********************************************************************/


/******************************************************/
void homogene(matD M,int i,int j,int n,ptr homog)
{ int m;
bloc b;
matD N;

if(ecart_type(M,i,j,n) < s)
{
b.ligne=i;
b.colonne=j;
b.taille=n;
b.moyenne=moyenne(M,i,j,n);
inser_fin(homog,b);
affiche(homog);
}
else
{
parcourt(M,N,i,j,n);
m=n;

/***Bloc 1***/
do
homogene(N,i,j,n,homog);
while( n>2 && n!=m) ;
n=m;

/***Bloc 2***/
do
{
j=j+2;
homogene(N,i,j,n,homog);
}
while( n>2 && n!=m) ;
n=m;

/***Bloc 3***/
do
{
i=i+2;
j=j-2;
homogene(M,i,j,n,homog);
}
while( n>2 && n!=m) ;
n=m;

/***Bloc 4***/
do
{
j=j+2;
homogene(M,i,j,n,homog);
}
while( n>2 && n!=m) ;


}


}
/******************************************************************************/


//programme principal
main()
{ matD M={ {10,10,20,20,40,40,40,40},
{10,10,20,20,40,40,40,40},
{30,30,50,50,40,40,40,40},
{30,30,50,50,40,40,40,40},
{60,60,60,60, 5, 5,20,20},
{60,60,60,60, 5, 5,20,20},
{60,60,60,60,20,20, 7, 5},
{60,60,60,60,20,20, 7, 7}};
int n=8;
int i=0,j=0;
ptr homog;

//saisir_mat(M,n);
printf("Les blocs homogenes de M sont :\n");
homogene(M,i,j,n,homog);


getch();

}


c'est le code qui répond à la première question.Le problème avec ce code c'est que lorsque j'exécute la moyenne du premier bloc homogène trouvé est calculée mais pour les autres blocs homogènes j'ai une moyenne de 0.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
11 août 2014 à 15:54
Bonjour,
Je n'ai pas eu le temps de voir en profondeur ton énoncer et ton code, mais avant tout as- tu corriger ton code source et où est-ce que tu es arrêté ?
à bientôt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 août 2014 à 23:54
Bonjour,

Lorsque tu postes ton code, il faut utiliser la balise "code" et seulement celle-ci (pas de gras).
Exemple :
<"code c">/*ici ton code*/<"/code"> : sans les guillemets.

#include<conio.h>
Non standard. De fait, getch() et cie sont à éviter. Tu peux utiliser getchar(); à la place.

#define s 5
Non obligatoire mais conventionnel. On utilise une majuscule généralement pour définir une macro. Et accessoirement avec un nom plus intelligible.

matD I,J,K,L;
On évite les variables globales en C. Déclare-les plutôt dans ton main() et tu passes ces variables en argument de tes fonctions.

main()
Le bon prototype du main() sans argument est : int main(void)
De fait, il faut mettre : return 0; en fin de main().

Je te conseille d'éviter de mélanger les double et les float. D'une manière générale, et sauf cas particulier (comme l'embarqué), je te conseille de n'utiliser que des doubles.

void inser_fin(ptr &liste,bloc a)
Pas correct en C. Plutôt : void inser_fin(ptr *liste, bloc a);
Bien sûr, il faut modifier l'appel pour envoyer l'adresse de liste.

De même pour void saisir_mat(matD M,int &n)
Corrige pour les autres prototypes de fonctions.

</ital>printf("M[%d][%d]=%lf\n",i,j,M[i][j]); </ital>
Il faut utiliser "%f" pour afficher un double (et non %lf).

Attention sqrt() (voir aussi pour les autres fonctions) prend un double en argument (et non un float)...

Voilà pour ce que j'ai vu. Le reste n'est pas trop lisible sans balise.
Je te laisse donc corriger tout ça, et reposte-le avec la bonne balise.

Bon courage.
0
haikei00X Messages postés 67 Date d'inscription dimanche 20 juillet 2014 Statut Membre Dernière intervention 11 janvier 2016 3
1 sept. 2014 à 20:05
slt fiddy.
Merci d'avoir pris la peine de voir mon code.J'ai effectué les rectifications que vous m'avez demandé sauf pour celle de la macro , j'ai essayé la majuscule et j'ai une erreur,et pour celle où je devais remplacer &liste par *liste car je n'ai pas compris pourquoi.
Bref voilà mon code avec la bonne valise:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define maxD 64
#define s 5

 

typedef double matD[maxD][maxD];
typedef  struct noeud *ptr;


typedef struct bloc{
int ligne;
int colonne;
int taille;
double moyenne;
}bloc; 

struct noeud {
bloc cont;
ptr suiv;
};      



/****************************************************/
void inser_fin(ptr &liste,bloc a)
{ ptr p,q;

/* creer le noeud */
p=(ptr) malloc(sizeof(struct noeud));
if (p==0) {printf("Pas d'espace mémoire\n"); exit(1) ;}

/* remplir le noeud par les données */
 p->cont.ligne=a.ligne;
 p->cont.colonne=a.colonne;
 p->cont.taille=a.taille;
 p->cont.moyenne=a.moyenne;
 p->suiv=NULL;
/* si la liste est vide */
if (liste==NULL)liste=p;
else
{// recherche le dernier du noeud
 for(q=liste;q->suiv!=NULL;q=q->suiv);
//lier le dernier avec le noeud à insérer
 q->suiv=p;

}
}
/*************************************************/


/*******************************************************/
void affiche(ptr liste)
{
ptr p;

for(p=liste;p!=NULL;p=p->suiv)
printf("%d\t%d\t%d\t%f ",p->cont.ligne,p->cont.colonne,p->cont.taille,p->cont.moyenne);

printf("\n");

}
/*************************************************************/


/*********************************************************************/
void saisir_mat(matD M,int &n)
{int i,j;
     printf("Donnez la dimension de la matrice M puissance de 2:\n");
   scanf("%d",&n);

   for(i=0;i<n;i++)
     for(j=0;j<n;j++)
    {  
       M[i][j]=rand()%10;               
      printf("M[%d][%d]=%f\n",i,j,M[i][j]);
                  
    }
} 
/**********************************************************************/

   
/****************************************************/    
float moyenne(matD M,int i,int j,int n)
{int p,q;
 double moy=0;

  for(p=i;p<n;p++)
    for(q=j;q<n;q++)
         moy=moy+M[p][q];
         moy=moy/(n*n);
       
       return(moy);
         
 }
/****************************************************/ 
 
 
/**************************************************/     
float ecart_type(matD M,int i,int j,int n)
{int p,q;
 double ect=0;
   
   for(p=i;p<n;p++)
    for(q=j;q<n;q++)
     ect=ect+pow(  (M[p][q]-moyenne(M,i,j,n)),2   );
     ect=ect/(n*n);
     ect=sqrt(ect);
     
     
       return(ect);
     
 }  
/**************************************************/ 
 
 
/****************************************************************/ 
void parcourt(matD M,matD N,int i,int j,int &n)
{int p,q;
       
  for(p=i;p<n/2;p++)
    for(q=j;q<n/2;q++)
    { N[p][q]=M[p][q];
    //printf("N[%d][%d]= %lf\n",p,q,N[p][q]);
     }
        
    n=n/2;
}   
/***********************************************************************/


/******************************************************/    
void homogene(matD M,int i,int j,int n,ptr homog)
{ int m; 
  bloc b;
  matD N;

     if(ecart_type(M,i,j,n) < s)
      { 
         b.ligne=i;
         b.colonne=j;
         b.taille=n;
         b.moyenne=moyenne(M,i,j,n);
        inser_fin(homog,b);
        affiche(homog);  
      }  
     else
         {
            parcourt(M,N,i,j,n);            
            m=n;
                                
            /***Bloc 1***/
            do
            homogene(N,i,j,n,homog);
            while( n>2 && n!=m) ;                         
            n=m;
              
           /***Bloc 2***/  
             do
             { 
               j=j+2;
               homogene(N,i,j,n,homog);
             }
             while( n>2 && n!=m) ;                         
             n=m;
            
            /***Bloc 3***/    
            do
             {
               i=i+2;      
               j=j-2;
               homogene(M,i,j,n,homog);
             }
             while( n>2 && n!=m) ;                         
             n=m;
             
           /***Bloc 4***/      
          do
             {
               j=j+2;
               homogene(M,i,j,n,homog);
             }
             while( n>2 && n!=m) ;                   
          
                       
     }
    
   
}      
/******************************************************************************/


//programme principal
int main()
{ matD M={ {10,10,20,20,40,40,40,40},
           {10,10,20,20,40,40,40,40},
           {30,30,50,50,40,40,40,40},
           {30,30,50,50,40,40,40,40},
           {60,60,60,60, 5, 5,20,20},
           {60,60,60,60, 5, 5,20,20},
           {60,60,60,60,20,20, 7, 5},
           {60,60,60,60,20,20, 7, 7}};
  int n=8;         
  int i=0,j=0;
  ptr homog;
  
     //saisir_mat(M,n);
       printf("Les blocs homogenes de M sont :\n");  
       homogene(M,i,j,n,homog);  
       
      getchar();            
    return 0; 

}



J'ai toujours le même problème.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 1/09/2014 à 21:43
Ben normal, tu n'as pas corrigé tout ce que j'ai dit (prototype void inser_fin(ptr &liste,bloc a). Refait une passe pour bien tout prendre en compte.
Reposte ton code une fois que c'est corrigé et met également le message d'erreur que tu obtiens.
0