Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
- Accueil
- » Programmation
- » Matlab: test répétitif dans while
- » Répondre
Répondre
Résumé de la discussion (messages les plus récents en premier)
- yoshi
- 31-05-2011 13:50:50
Re,
J'en ai bientôt fini avec la revue que je suis en train de préparer.
D'ici peu, je vais pouvoir installer Octave et tester ton prog...
Mon objectif est de rassembler tous les MASQUES,en enregistrant à chaque fois le dernier MASQUE
Enregistrer tous les masques ? Où ça ? Sur le disque dur ? une clé USB ?
@+
- stormin
- 26-05-2011 21:56:21
Re,
Mon objectif est de rassembler tous les MASQUES,en enregistrant à chaque fois le dernier MASQUE.
Test=Test.*MASQUE;
MASQUE=ones(256,256);
compteur=compteur+1; %% Inisialisé à zéro
end
Merci
- yoshi
- 26-05-2011 14:49:21
RE,
D'abord, tu dis :
Test est dans une boucle,donc je garde chaque fois le dernier MASQUE dans Test :
J'avais bien compris...
Mais après tu refuses ma suggestion parce que :
car il va garder le dernier MASQUE et écrase les précédents.
Et là, je dois dire que je ne te comprends plus... C'est bien ce que tu veux, non ?
Ensuite tu dis que Test=Masque
cumule les MASQUES
cumuler = les garder tous, ce qui est faux...
Test=Masque garde seulement le dernier masque, il faudrait savoir ce que tu veux...
@+
- stormin
- 26-05-2011 14:21:39
Re,
1. Quel est l'intérêt de remplir la matrice Test avec des 1, puis de multiplier Test par la matrice Masque pour en conserver l'ancienne valeur.
Test est dans une boucle,donc je garde chaque fois le dernier MASQUE dans Test:
Par exemple,je procède de la manière suivante:
Test= 1 1 1
1 1 1
1 1 1
MASQUE= 0 1 1
1 0 0
1 1 1Test= 0 1 1
1 0 0
1 1 1
MASQUE= 1 1 0
1 1 1
1 1 1
Test= 0 1 0
1 0 0
1 1 1
Avec :
Je peux pas trouver mon Test ,dont il cumule les MASQUES.car il va garder le dernier MASQUE et écrase les précédents.
@+
- yoshi
- 26-05-2011 13:30:32
Re,
1. Quel est l'intérêt de remplir la matrice Test avec des 1, puis de multiplier Test par la matrice Masque pour en conserver l'ancienne valeur.
C'est un peu comme, si pour garder l'ancienne valeur d'une variable a, tu posais b=1, puis b = b*a...
Pourquoi pas directement Test=Masque ; ?
2. matlab est un logiciel propriétaire payant et assez cher...
J'ai donc téléchargé un clone de matlab : Octave. Et deux interfaces grahiques Qtoctave et Xoctave...
Je verrai ça un plus tard
@+
- yoshi
- 25-05-2011 12:12:30
Salut,
Pour Test,je l'affiche continuellement lors du calcul,il est toujours remplie des 1.
Arf... Là, ça m'en bouche un coin...
Et pourtant Masque contient bien des 0 as-tu dit !
Diantre !
La multiplication élément par élément par buguerait-elle ? après après après
Là, je suis sec.
Je n'ai plus qu'une solution, je vais être obligé d'installer matlab pour pouvoir tester...
Es-tu pressé ?
@+
- stormin
- 25-05-2011 11:58:36
Salut,
Donc tu vas essayé de mettre un "mouchard" entre le else et le end, un simple compteur que tu unitialises à zéro au tout début...
if (MAXIC==MAXC) && (MINIA==MINA)
Matrice=Matrice.*MASQUE;
else
Test=Test.*MASQUE;
MASQUE=ones(256,256);
compteur=compteur+1; %% Inisialisé à zéro
end
Il m'a donné à fin de la boucle comme résultat: 69
C'est à dire que dans le cas où MAXIC~=MAXC, il ne contrôle pas si MINIA==MINA et passe à else...
Bizarre...
Moi ,je cherche à faire cela,si l'un des deux conditions n'est pas vérifiée,je passe à else.
Pour Test,je l'affiche continuellement lors du calcul,il est toujours remplie des 1.
@+
- yoshi
- 25-05-2011 09:07:06
Re,
J'ai vérifie MASQUE, il contient des 0 et des 1.
Ah....
Ça c'est fort...Dans le fond, je préfère.
Alors, reprenons
Test est initialisé à ones(256,256), à la fin il n'a pas changé.
Cherchons donc où il est censé être modifié
Ici :
Matrice=Matrice.*MASQUE;
else
Test=Test.*MASQUE;
MASQUE=ones(256,256);
end
Donc tu vas essayé de mettre un "mouchard" entre le else et le end, un simple compteur que tu unitialises à zéro au tout début...
Parce que je suis curieux de savoir s'il parcourt ce bloc : en effet, ton if (MAXIC==MAXC) && (MINIA==MINA), ne me plaît pas et plus précisément le &&.
La doc dit : opérateur logique ET court-circuit... Court-circuit ?
A moi, il me semblait que tu testais si l'un ou l'autre avait changé (ou inclusif), au pire le XOr le ou exclusif : soit l'un, soit l'autre...
Teste donc avec le mouchard pour savoir s'il passe par là ou pas.
Après tu chercheras s'il parcourt ce bloc au bon moment et éventuellement tu réfléchiras à quelle condition exacte ton prog doit faire Matrice=Matrice.*MASQUE; et à quelle condition exacte il doit parcourir le bloc else... end : et tu me l'écris en bon français sans ambiguïté.
Il faudra peut-être réécrire le if ... else ... end
@+
[EDIT]
La doc dit (bis) :
&& évalue A & B si et seulement si A est vrai...
C'est à dire que dans le cas où MAXIC~=MAXC, il ne contrôle pas si MINIA==MINA et passe à else...
Bizarre...
Pose des "mouchards" dans cette zone, fais des essais avec une matrice plus petite (c'est plus rapide) et regarde ce qui se passe.
Il est possible que le bloc else... end ne soit jamais parcouru, mais il faut soit le confirmer, soit l'infirmer...
- stormin
- 24-05-2011 22:24:56
Bonsoir,
Conclusion : la matrice MASQUE n'est composée que de 1 et ne comprend aucun 0.
J'ai vérifie MASQUE,il contient des 0 et des 1.
ES-tu vraiment obligé de préciser maximum indice et minimum indice au lieu de Indice tout court ?
Oui je suis obligé.
Vraiment,je vois pas pourquoi Test contient uniquement des 1.
- yoshi
- 24-05-2011 17:42:26
Re,
Question basique : à quoi ressemblerait la matrice 4x4 en Matlab définie par Test=ones(4,4);
Il y aurait quoi dedans des 0 ? des 1 ? autre chose ?
D'une part tu me récris que tu dois :
Conserver la dernière valeur de MASQUE.
D'autre part tu me dis que tu stockes Masque dans Test via Test=Test.*MASQUE ?
Quelque chose m'échappe...
Ou alors, c'est bien ce que tu pensais avoir fait, et après vérification tu constates que non, ça ne marche pas...
Et tu voudrais savoir pourquoi ça ne marche pas ce qui est une question totalement différente de celle posée...
@+
[EDIT] C'est bon, j'ai trouvé sur le Net : ones(256,256) donne une matrice remplie de 1...
Donc c'est la matrice MASQUE qui est en cause :
On sait que Test est une matrice composée seulement de 1.
Tu multiplies élément par élément la matrice Test par la matrice MASQUE, et tu n'obtiens que des 1...
Conclusion : la matrice MASQUE n'est composée que de 1 et ne comprend aucun 0.
Reste à trouver pourquoi...
Je vais voir.
[EDIT2]Le seul endroit où MASQUE est modifié c'est ici:
somme = sum(Matrice(:));
if (abs(somme)<epsilon),break,end
if somme>0
[maximum indice] = max(Matrice(:));else
[minimum indice] = min(Matrice(:));end
Matrice(indice) = 0;
MASQUE(indice) = 0;
somme = sum(Matrice(:));
end
Je m'en vais aller tester ce morceau sur matrice 4 x 4...
C'est fait, ça marche en Python...
Donc le problème ne peut venir que de là :
[maximum indice] = max(Matrice(:));
else
[minimum indice] = min(Matrice(:));
Et probablement à cause de ces déclarations :
[maximum indice] = et [minimum indice] =
ES-tu vraiment obligé de préciser maximum indice et minimum indice au lieu de Indice tout court ?
Donc ça deviendrait comme en Python :
indice = max(Matrice(:));
else
indice = min(Matrice(:));
end
Matrice(indice) = 0;
MASQUE(indice) = 0;
Et comment est Matrice à l'arrivée ? il y a des zéros ?
- stormin
- 24-05-2011 17:31:31
Salut,
A chaque fois que min ou le max changeront,je dois faire deux choses:
1-Conserver la dernière valeur de MASQUE.
.*:Permet de faire la multiplication élément par élément.
2- Initialiser MASQUE.
Au lieu que je trouve dans Test des 0 et 1,parce que à chaque fois min ou max changeront je met MASQUE dans Test, je vois qu'il y a présence seulement des 1.
- yoshi
- 24-05-2011 17:10:58
Salut,
J'ai testé vos propositions,mais je vois pas l’intérêt de MASQUEB , la dernière valeur de MASQUE, je la mets dans Test.
1. Désolé, mais moi, je ne connais pas Matlab, donc, j'ignorais le sens de la notation Test=Test.*MASQUE;
2. Désolé encore, mais dans ce cas, la question suivante est sans objet :
Il reste un truc à faire,il faut à chaque fois le max et le min change, que j'initialise MASQUE et conserver le dernier MASQUE.
Tu dis d'une part que tu conserves l'ancien masque dans Test, et d'autre part tu écris que tu veux "conserver l'ancien". Il faudrait savoir !
Donc, oui, mes propositions sont inutiles, mais tes demandes sont contradictoires...
Ou alors, si je n'ai pas compris ce que tu veux, essaie de t'expliquer clairement du 1er coup, parce que jouer aux devinettes ça m'amuse peu en ce moment...
@+
- stormin
- 24-05-2011 17:00:36
Salut,
J'ai testé vos propositions,mais je vois pas l’intérêt de MASQUEB ,la dernière valeur de MASQUE,je la mets dans Test.
Merci
- yoshi
- 24-05-2011 14:53:28
Salut,
Bon, alors au début juste après la déclaration MASQUE=ones(256,256);, tu ajoutes ça (par ex) :
MASQUEB=ones(256,256);
(même principe que pour les MINA et MAXC)
Puis au moment du test :
if (MAXIC==MAXC) && (MINIA==MINA)
Matrice=Matrice.*MASQUE;
else
Test=Test.*MASQUE;
MASQUEB=MASQUE
MASQUE=ones(256,256);
end
@+
- stormin
- 24-05-2011 12:56:30
Re?
A chaque fois que min ou le max changeront tu veux réinitialiser le Masque et conserver l'ancien
Oui,c'est ça.
Réinitialiser le masque, c'est ça : MASQUE=ones(256,256); ?
Oui.
@+







