Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 23-05-2011 19:12:07
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Matlab: test répétitif dans while
Bonsoir,
J'aimerais savoir comment si le MAXC ou bien le MINA change,j'applique pas cette ligne:
Le programme:
epsilon = 0.005;
MASQUE=ones(256,256);
somme = sum(MASQUE(:));
while(abs(somme)>epsilon)
A_Auto_Cor1=fftshift(ifft2(A_Auto_Cor1.*MASQUE));
G1=abs(A_Auto_Cor1).^2;
A_Auto_Cor2=fftshift(ifft2(A_Auto_Cor2.*MASQUE));
G2=abs(A_Auto_Cor2).^2;
A_Auto_Cor3=fftshift(ifft2(A_Auto_Cor3.*MASQUE));
G3=abs(A_Auto_Cor3).^2;
X_XCor1=fftshift(ifft2(X_XCor1.*MASQUE));
G4=abs(X_XCor1).^2;
X_XCor2=fftshift(ifft2(X_XCor2.*MASQUE));
G5=abs(X_XCor2).^2;
X_XCor3=fftshift(ifft2(X_XCor3.*MASQUE));
G6=abs(X_XCor3).^2;
[A1 ID1] = max(G1(:));
[A2 ID2] = max(G2(:));
[A3 ID3] = max(G3(:));
[M1 id1] = max(G4(:));
[M2 id2] = max(G5(:));
[M3 id3] = max(G6(:));
M123=[M1 M2 M3];
A123=[A1 A2 A3];
MAXC=max(M123)
MINA=min(A123)
if MAXC==M1
trans_four_C=TF7;
elseif MAXC==M2
trans_four_C=TF8;
else
trans_four_C=TF9;
end
if MINA==A1
trans_four_A=TF1;
elseif MINA==A2
trans_four_A=TF2;
else
trans_four_A=TF3;
end
%% DC
Matrice=abs(trans_four_C).*cos(angle(trans_four_C) - angle(trans_four_A))-epse*abs(trans_four_A);
Matrice=Matrice.*MASQUE;
somme = sum(Matrice(:));
if (abs(somme)<epsilon),break,end
if somme>0
[maximum indice] = max(Matrice(:));
Matrice(indice) = 0;
MASQUE(indice) = 0;
else
[minimum indice] = min(Matrice(:));
Matrice(indice) = 0;
MASQUE(indice) = 0;
end
somme = sum(Matrice(:));
end
Dernière modification par stormin (23-05-2011 19:13:16)
Hors ligne
#2 23-05-2011 20:12:12
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
Re,
Avant il faut que je comprenne quelque chose...
Ta boucle while, elle s'arrête bien ici :
somme = sum(Matrice(:));
end ?
Si oui, je t'en dirai plus demain.
L'idée est la suivante,
juste avant les lignes MAXC= et MINA=, introduire deux variables supplémentaires comme ça par ex :
MAXIC=MAXC
MINIA=MINA
Pourquoi faire ?
Parce que les lignes d'après tu récupères les valeurs de MAXC et MINA tu disposes donc des anciennes et nouvelles valeurs des MAX et MIN...
Ce qui te permettra de poser un test conditionnel juste avant ta ligne, genre :
if MAXC not = MAXIC or MINA not = MINIA
Matrice=Matrice.*MASQUE;
J'arrête ce soir, je vais aller lire...
@+
Hors ligne
#4 24-05-2011 11:03:56
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
Bonjour,
Ah, l'indentation fantaisiste, c'est pénible.
J'ai longuement programmé en Turbo Basic, l'indentation n'y était pas obligatoire comme en Python : je le faisais quand même spontanément, c'est bien plus lisible.
Je crois que ce n'est pas la peine que je refasse les essais que tu as déjà fait : si ce n'est pas satisfaisant chez toi, ça ne le sera pas che moi non plis.
Si le résultat n'est pas satisfaisant donc, c'est que probablement l'idée du programme, l'algorithme est à revoir, pas le programme lui-même qui fait bien ce qu'on lui dit de faire...
Et j'ai bien l'impression, au vu de ta dernière demande, que tu es aussi arrivé à cette conclusion.
Donc tu m'as demandé :
J'aimerais savoir comment si le MAXC ou bien le MINA change,j'applique pas cette ligne:
Matrice=Matrice.*MASQUE;
Ainsi que je te l'ai dit hier soir pour savoir, à chaque tour, si le MAXC ou bien le MINA a changé il te faut posséder le MAXC et le MINA du tour précédent, d'où
* avant d'entrer mon introduction dans la boucle While de valeurs fantaisistes des mini et maxi suffisamment fortes en valeurs absolues pour ne pas interférer avec l'algorithme,
* dans la boucle while, avant d"écrire MAXC= et MINA =, le transfert des valeurs antérieures dans 2 variables MAXIC et MINIA - par exemple) :
MAXIC=MAXC;
MINIA=MINA;
* l'insertion du test :
if MAXC=MAXIC or MINA=MINI
Matrice=Matrice.*MASQUE;
Ainsi tu n'appliques la ligne que si MAXC ou MINA sont restés les mêmes d'un tour sur l'autre...
Petit inconvénient de mes modifs : au premier tour, il n'y aura JAMAIS d'application de la ligne.
C'est gênant ?
Quelques détails :
1. En fin de programme :
end
somme = sum(Matrice(:));
end
me paraît totalement inutile...
2. Presque à la fin :
if somme>0
[maximum indice] = max(Matrice(:));
Matrice(indice) = 0;
MASQUE(indice) = 0;
else
[minimum indice] = min(Matrice(:));
Matrice(indice) = 0;
MASQUE(indice) = 0;
end
somme = sum(Matrice(:));
Tu peux "factoriser" ton code ainsi :
if somme>0
[maximum indice] = max(Matrice(:));
else
[minimum indice] = min(Matrice(:));
end
Matrice(indice) = 0;
MASQUE(indice) = 0;
somme = sum(Matrice(:));
@+
Hors ligne
#5 24-05-2011 12:12:55
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
Bonjour,
Ainsi tu n'appliques la ligne que si MAXC ou MINA sont restés les mêmes d'un tour sur l'autre
J'applique la ligne si le MAXC et MINA sont restés les mêmes.
Il reste un truc à faire,il faut à chaque fois le max et le min change,que j'initialise MASQUE et conserver le dernier MASQUE.
Lorsque,je vérifie Test à la fin,je trouve seulement les 1,sachant que c'est la variable où je stocke les MASQUES.
Le programme:
epsilon = 0.005;
MAXC=0 ;
MINA=0 ;
Test=ones(256,256);
MASQUE=ones(256,256);
somme = sum(MASQUE(:));
while(abs(somme)>epsilon)
A_Auto_Cor1=fftshift(ifft2(A_Auto_Cor1.*MASQUE));
G1=abs(A_Auto_Cor1).^2;
A_Auto_Cor2=fftshift(ifft2(A_Auto_Cor2.*MASQUE));
G2=abs(A_Auto_Cor2).^2;
A_Auto_Cor3=fftshift(ifft2(A_Auto_Cor3.*MASQUE));
G3=abs(A_Auto_Cor3).^2;
X_XCor1=fftshift(ifft2(X_XCor1.*MASQUE));
G4=abs(X_XCor1).^2;
X_XCor2=fftshift(ifft2(X_XCor2.*MASQUE));
G5=abs(X_XCor2).^2;
X_XCor3=fftshift(ifft2(X_XCor3.*MASQUE));
G6=abs(X_XCor3).^2;
[A1 ID1] = max(G1(:));
[A2 ID2] = max(G2(:));
[A3 ID3] = max(G3(:));
[M1 id1] = max(G4(:));
[M2 id2] = max(G5(:));
[M3 id3] = max(G6(:));
M123=[M1 M2 M3];
A123=[A1 A2 A3];
MAXIC=MAXC ;
MINIA=MINA ;
MAXC=max(M123)
MINA=min(A123)
if MAXC==M1
trans_four_C=TF7;
elseif MAXC==M2
trans_four_C=TF8;
else
trans_four_C=TF9;
end
if MINA==A1
trans_four_A=TF1;
elseif MINA==A2
trans_four_A=TF2;
else
trans_four_A=TF3;
end
%% DC
Matrice=abs(trans_four_C).*cos(angle(trans_four_C) - angle(trans_four_A))-epse*abs(trans_four_A);
if (MAXIC==MAXC) && (MINIA==MINA)
Matrice=Matrice.*MASQUE;
else
Test=Test.*MASQUE;
MASQUE=ones(256,256);
end
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
MASQUE=MASQUE.*Test;
Q=fftshift(ifft2(CC.*MASQUE));
G=abs(Q).^2;
Hors ligne
#6 24-05-2011 12:35:18
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
Re,
Il reste un truc à faire,il faut à chaque fois le max et le min change,que j'initialise MASQUE et conserver le dernier MASQUE.
Voulais -tu dire :
Il reste un truc à faire,il faut à chaque fois que le max et le min change,que j'initialise MASQUE et conserver le dernier MASQUE
ou
l reste un truc à faire,il faut que à chaque fois[/b] le max et le min change, et que j'initialise MASQUE et conserver le dernier MASQUE...
Désolé ta phrase n'est pas claire.
Reprenons :
A chaque fois que min ou le max changeront tu veux réinitialiser le Masque et conserver l'ancien.
C'est correct ?
Réinitialiser le masque, c'est ça : MASQUE=ones(256,256); ?
@+
Hors ligne
#8 24-05-2011 14:53:28
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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
@+
Hors ligne
#10 24-05-2011 17:10:58
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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...
@+
Hors ligne
#11 24-05-2011 17:31:31
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
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.
Hors ligne
#12 24-05-2011 17:42:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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 ?
Dernière modification par yoshi (24-05-2011 18:11:13)
Hors ligne
#13 24-05-2011 22:24:56
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
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.
Hors ligne
#14 25-05-2011 09:07:06
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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...
Dernière modification par yoshi (25-05-2011 09:22:18)
Hors ligne
#15 25-05-2011 11:58:36
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
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.
@+
Hors ligne
#16 25-05-2011 12:12:30
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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é ?
@+
Dernière modification par yoshi (26-05-2011 13:29:23)
Hors ligne
#17 26-05-2011 13:30:32
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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
@+
Hors ligne
#18 26-05-2011 14:21:39
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
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.
@+
Hors ligne
#19 26-05-2011 14:49:21
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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...
@+
Hors ligne
#20 26-05-2011 21:56:21
- stormin
- Membre
- Inscription : 03-12-2009
- Messages : 124
Re : Matlab: test répétitif dans while
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
Dernière modification par stormin (26-05-2011 21:59:24)
Hors ligne
#21 31-05-2011 13:50:50
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Matlab: test répétitif dans while
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 ?
@+
Hors ligne
Pages : 1







