je possède deux vecteurs x et y je veux trié leurs valeurs en utilisant des intervalles a fin de pouvoir éliminer le surplus comment faire !! merci d'avance
je possède deux vecteurs x et y je veux trié leurs valeurs en utilisant des intervalles a fin de pouvoir éliminer le surplus comment faire !! merci d'avance
Bonjour,
Pourrais-tu mettre un exemple de ce que tu veux faire (un apercu des vecteurs d'entrée et du résultat souhaité)?
Par exemple si tu veux supprimer toutes les valeurs inférieures à 0 d'un vecteur A tu peux faire de la façon suivante:
Duf
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 A(A<0) = [];
merci!!
voila un exemple:
deux vecteurs contenant 100 chiffres chaque un je veux tracer l'un en fonction de l'autre !! en utilisant des intervalles bien déterminer je dois éliminer les valeurs dont j'en ai pas besoin !!(posant des conditions)voila
Bonsoir,
Sans plus de précision, je te propose ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 x = 1:100; y = rand(100,1); idx = y < 0.5; % Ici on ne retient que les valeurs de y inférieures à 0.5, à adapter selon ton cas plot(x(idx),y(idx)) %% Ou: x(~idx) = []; y(~idx) = []; figure,plot(x,y)
Merci c'est exactement se que je voulais mais j'ai essayé le code :
ça m'affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 for'x'>0.3 idx='y'>09 for 0.31<'x'<0.7 idx= 0.2<'y'<0.9 for 'x'>0.7 idx='y'<=0.2 end end end plot(x(idx),y(idx)). !! j'ai mis mes varraibles entre parantheses rien n'y est ??Error: Unexpected MATLAB expression![]()
Ton code n'a aucun sens
Pourquoi as-tu mis des guillemets? 'x' et 'y' sont alors des caractères et non les variables définies avant.
Les boucles n'ont pas leur utilité avec l'indexage logique.
Essai de comprendre mon message précédent en exécutant ligne par ligne mon code, et regardant le contenu à chaque fois.
PS: Pour avoir deux conditions (a < x < b, a et b scalaires), il te faut faire idx = a < x & x < b;. Attention de n'utiliser dans ce cas qu'un seul &.
x et y c'est des vecteurs
et je dois conditionner sur les valeurs appartenant à ces deux la !!
je me demande toujours si c'est correcte ou pas ?? MERCI D'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 idx= x < 0.3 % je prends les valeurs x inf à 0.3 idx= y >= 0.9 % je lui fais correspondre des y>=0.9 ainsi de suite !! idx= 0.31<x & x<0.2 idx= 0.21<y & y< 0.9 idx=x>0.7 idx=y >= 0.2 plot(x(idx),y(idx),'+')
Alors la syntaxe est maintenant bonne, cependant, il y a un problème de logique:
En effet la façon dont tu le fais ne cumule pas les résultats, mais les remplace à chaque ligne.
C'est comme si tu faisais (en simplifié):
Seule la dernière ligne compte, idx sera égal à la fin à 6, quelles que soient les lignes précédentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5idx = 2; idx = 3; idx = 1; ... idx = 6;
Autrement dit dans ton cas, seule la ligne idx=y >= 0.2 sera retenue.
Pour réunir toutes ces conditions, tu as deux posibilités:
- Soit tu fais le tout en une seule ligne en combinant les opérateurs logiques & et | comme dans mon précédent post avec idx = a < x & x < b.
- Soit tu fais plusieurs lignes, et dans ce cas tu gardes la première ligne tel quelle, mais les autres seront de la forme idx = idx & y >= 0.9; ou idx = idx | y >= 0.9; à voir selon ton cas.
Dernière modification par Invité ; 23/03/2019 à 14h21.
bonsoir !!
j'ai toujours le meme problème avec le programme voila une pièce jointe pour bien éclairer les choses !
Il te faut donc lier les conditions sur x et y avec des & et les intervalles par des |. Ce qui donnerait si j'ai bien compris:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 % Valeurs x et y juste pour l'exemple, à remplacer par les tiennes x = (0:0.01:1)'; y = rand(101,1); N1 = length(x(x<0.3)); N2 = length(x(0.3<=x & x<=0.7)); N3 = length(x(0.7<x)); sup = [ones(1,N1) , linspace(1,0.3,N2) 0.3*ones(1,N3)]'; inf = [0.9*ones(1,N1) , linspace(0.9,0.2,N2) 0.2*ones(1,N3)]'; idx = inf<=y & y<=sup; plot(x,y),hold on plot(x(idx),y(idx),'rp') plot(x,inf,'g') plot(x,sup,'g')
Dernière modification par Invité ; 21/05/2011 à 13h36.
bonsoir !! le programme proposé ne fonctionne pas et la fonction 'hold on' je vois pas son utilité
bon je vais expliqué d'une autre manière !
merci infiniment pour votre patience !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 je dois éliminer les valeurs y inférieurs à 0.9 et les valeurs x inférieurs à 0.3 (référez vous à l'image ) sachant que les valeurs appartenant au vecteurs y et x sont anarchiques (dire que je dois les trier ) suite: pour x ϵ [0.3,0.7] j'elimine les valeurs 0.2>y>0.9 pour les x >=0.7 j'elimine les valeurs y>=0.2![]()
Ce n'est pas vraiment ce que représente ton image
Mais en t'inspirant du code que je t'ai fourni et le premier message de Duf42, tu devrais y arriver.
Exécute mon code avec et sans hold on et tu verras la différence.
bonsoir !!
bon voila je désespère des tests logiques!! j'essaye les boucles peut etre c'est plus facile
après je trace mon graphe !! je ne sais pas si c'est réalisable sur matlab mais au moin est- ce que l'idée est juste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 for i =1,n vecteur if 0<x & x<=0.3 0.9<y & y<=1 then (j'ouvre un fichier pour stocker les valeurs retenus ) else if 0.3<x & x<=0.7 0.2<y & y<0.9 then (j'ouvre un 2ieme fichier pour stocker les valeurs retenus ) else if x >0.7 y >=0.2 then (j'ouvre un 3ieme fichier pour stocker les valeurs retenus ) end end end endmerci d'avance !!
D'après ton post#11, le graphique ressemblerait plutôt à ceci (pièce jointe), les zones blanches étant les zones à retenir.
Donc est-ce que c'est cela ou pas?
Si toutefois ça l'est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 idx = x<0.7 & y>=0.9 | x>0.3 & y<0.2; plot(x,y,x(idx),y(idx),'r.')
malheureusement pas![]()
pour la première et la troisième partie on dois faire le contraire dire que la partie hachurée est a éliminer ; pour la second dans l'intervalle 0.3 et 0.7 j'elimine les valeurs sup a 0.9 et inf a 0.2 'les points appartenant a la surface limité par les deux pentes représenté sur mon image "!! voila:
Dans ce cas, tu peux reprendre le code de mon post#14 pour x<0.3 et 0.7, mais vu que tespour 0.3 < x < 0.7, il te faudra pour les pentes interpoler les valeurs obtenues par la fonction linspace (post#10) par les valeurs des xi correspondants. Tu pourras faire cela grâce à la fonction interp1y et x sont anarchiques
Inacceptable sur matlab , comme vous avez dis la seconde ligne efface automatiquement la première !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 idx = kt<0.3 & fr>=0.9 |kt>0 & fr<1 idx =idx =kt>0.7 & fr>=0.2
je ne me retrouve pas avec ces fonction la c'est trop difficile a comprendre !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 plot(kt(idx),fr(idx),'+') N2 = length(x(0.3<=kt & kt<=0.7)) sup = [ones(1,N1) , linspace(1,0.3,N2) 0.3*ones(1,N3)]'; inf = [0.9*ones(1,N1) , linspace(0.9,0.2,N2) 0.2*ones(1,N3)]'; idx = inf<=y & y<=sup;
ps:si ya moyen pour ouvrir un fichier à fin de stocker des données je suis prise svp !!
Si j'ai bien compris cette fois-ci:
Si ça ne correspond pas tout à fait aux valeurs à retenir, tu as juste à mettre les bons signes et valeurs aux bons endroits.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 %% Génération des valeurs x et y N = 1000; x = rand(N,1); y = rand(N,1); %% Premier et dernier intervalle idx1N3 = x<0.3 & y>=0.9 | 0.7<x & y<=0.2; % Indexage logique %% Deuxième intervalle x2 = x(0.3<=x & x<=0.7); % Sélection des valeurs x telles que 0.3<= x <=0.7 y2 = y(0.3<=x & x<=0.7); % Sélection des valeurs y telles que 0.3<= x <=0.7 inf = linspace(1,0.3,length(x2)); % Pente du dessus inf = interp1(linspace(0.3,0.7,length(x2)),inf,x2); % Ajustement par rapport aux valeurs de x2 sup = linspace(0.9,0.2,length(x2)); % Pente du dessous sup = interp1(linspace(0.3,0.7,length(x2)),sup,x2); % Ajustement par rapport aux valeurs de x2 idx2 = y2<sup | y2>inf; % Indexage logique %% Affichage plot(x,y,'.'),hold on plot(x2(idx2),y2(idx2),'g.') plot(x(idx1N3),y(idx1N3),'r.') plot([0 0.3 0.3 0.7 0.7],[0.9 0.9 1 0.3 1],'k:') plot([0.3 0.3 0.7 1],[0 0.9 0.2 0.2],'k:')
Pour écrire dans un fichier: fopen/fprinft/fclose, une recherche dans le forum te fournira des exemples.
PS: Prends l'habitude de toujours regarder la documentation Matlab des fonctions que tu veux utiliser (en tapant doc nom_de_la_fonction) tu y trouveras des exemples pour justement comprendre leur fonctionnement.![]()
bonsoir !! le programme n'as pas fonctionné !!
j'ai essayé avec l'autre code :import data je sépare mes vecteurs de la matrice a l'aide de x=m(:,1)
y=m(:,2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 for n=1:100 if x(n)>0.3 1 > y(n)>0.9 end %je voulais nommer le vecteur résultat res=[] k=1 for n=1: res(k)=ans(n) k=k+1 end % je stocke mes valeurs dans un fichier txt fid =fopen(stock.'txt'.'wt'); for k=1: fprintf(fid,'%0.2f/t',res(k)); end fprintf(fid,'\n'); fcolse(fid);ext ce que quelqu'un peut me corrigé ce code !!
merci d'avance
Dire "ça n'a pas fonctionné" ne donne aucun renseignement utile
Essaye de comprendre au moins ce que tu fais.
La ligne 3 est censée faire quoi ?
Tes boucles FOR sont incomplètes : il manque la borne supérieure. Comme WinJérôme l'a dit lis la documentation : doc forLigne 9 : d'où vient cette variable ANS ? C'est dangereux d'utiliser une variable nommée ANS puisque c'est une fonction de MATLAB. Toujours pareil voir doc ansEt puis pourquoi utiliser 2 variables n et k qui vaudront la même chose ?
Ligne 13 : c'est quoi stock ?
Bref beaucoup d'erreurs que MATLAB te signale et qui sont évitables en LISANT LA DOCUMENTATION.
Partager