[Matlab] Trouver un chiffre et le remplacer

Résolu/Fermé
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 - 26 févr. 2009 à 15:40
 clovis - 5 sept. 2011 à 16:23
Bonjour,

j'ai un ensemble de valeurs qui me permettent de tracer un graphe y en fonction de x sur Matlab, dans ces valeurs j'ai des chiffres comme zéro et 99 et nan qui me créeent des déformations dans ma courbe, comment faire pour les détecter et puis pour les enlever et les remplacer par la valeur moyenne de la dernière valeur avant et de celle d'apres de ce 0 ou 99 ou nan
ex : supposons si j'ai une matrice A= [ 99 2 3 0 6; 4 5 99 0 0; 7 0 8 99 nan];

merci d'avance,
A voir également:

22 réponses

Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
26 févr. 2009 à 16:07
Bonjour mon ami !
Je te suggérerais d'utiliser l'indexation logique pour changer les valeurs indésirables de ta matrice.
Par exemple, pour remplacer toutes les valeurs 0,99,NaN par la moyenne de toutes les valeurs différentes de celles-ci, quelque chose de ce genre conviendrait :
A(isnan(A)|A==99)=0;
A(A==0)=sum(sum(A))/nnz(A);
Je te souhaite une bien bonne journée !
7
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
26 févr. 2009 à 17:03
Bonjour Fee Fay,

je te remercie, mais il reste un probleme, c'est que dans ta solution proposée, je n'obtiens pas la la valeur moyene du chiffre avant et de celui apres, et si je prends le premier 99 ou le dernier nan, le 99 n'a pas de chiffre avant, donc il doit prendre la valeur du chiffre d'apres qui est 2 dans mon cas, et le nan doit prendre la valeur du chiifre d'avant qui est ici 99, mais vu qu'on enlève le 99, il doit prendre la valeur du chiffre avant qui est 8.

Est ce qu'il y a une maniere de faire ceci ?

merci pour ton soutien
0
tableau de n entier de valeur paire et impaire.
classer par ordre croissant les paires
et par ordre decroissant les impaire
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
27 févr. 2009 à 07:00
Re : detection des NaN et les remplacer par la valeur moyenne avec Matlab

--------------------------------------------------------------------------------

Bonjour,

voici un autre code, mais ca ne marche pas toujours, j'obtiens l'erreur suivante ;
??? Subscript indices must either be real positive integers or logicals.

que pensez vous ?

% Test
Matrice= [ 99 2 3 0 6;
4 5 99 0 0;
7 0 8 99 NaN]
% Matrice bidon pour voir position index
B=[1:1:15];
Z=reshape (B, 3, 5)
% Fin test

% Détection des cas recherchés
Where_NaN= isnan(Matrice);
idx_NaN= find (Where_NaN==1);
idx_0_99= find (Matrice==0 | Matrice== 99);

% Création d'une liste unique d'index des cas recherchés
% Noter que je fais la transposée de idx_0_99 car c'est une colonne de vals
% donc pour la concatenation je dois la mettre en ligne pour aller avec idx_NaN
Lst_NaN_0_99 = [idx_NaN idx_0_99.']

% Remplacement des valeurs par moyenne des valeurs qui entoure position.
% 2 cas particuliers: premières et dernières positions dans les colonnes.
% Les if sont là pour les détecter. Si 1ere position dans colonne, nouvelle
% valeur égale à valeur suivante. Si dernière position, valeur égale à
% valeur précédente.

% Détection format matrice
[lignes, colonnes]= size (Matrice);

% Cas classique (calcul moyenne)
idx_PosiIn= find (rem(Lst_NaN_0_99(,lignes)~= 0 & rem(Lst_NaN_0_99(,lignes)~=1 );
% Calculer si pas de cas non voulus côte à côte
if (Matrice (idx_PosiIn - 1)~= idx_PosiIn( & Matrice (idx_PosiIn + 1)~= idx_PosiIn()
Matrice (idx_PosiIn)= (Matrice (idx_PosiIn - 1) + Matrice (idx_PosiIn + 1))/2;
end

% Position en haut de colonne
idx_PosiUn= find (rem(Lst_NaN_0_99(,lignes)== 1);
% Calculer si pas de cas non voulus côte à côte
if Matrice (idx_PosiUn + 1)~= idx_PosiUn(: )
Matrice (idx_PosiUn)= Matrice (idx_PosiUn + 1);
end

% Position en bas de colonne
idx_PosiLast= find (rem(Lst_NaN_0_99(: ),lignes)==0);
% Calculer si pas de cas non voulus côte à côte
if Matrice (idx_PosiLast - 1)~= idx_PosiLast(
Matrice (idx_PosiLast)= Matrice (idx_PosiLast - 1);
end
4
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
27 févr. 2009 à 12:42
Bonjour mon ami !
J'avais trouvé que ton message manquait quelque peu de clarté quant aux valeurs que tu voulais écrire dans la matrice à la place des valeurs indésirables, je veux dire par là que cela manquait de précision, mais peut-être avais-je mal compris. ;-)
C'est la raison pour laquelle je t'avais donné une voie qui pouvait t'être utile sans plus détailler la partie de ton problème que je n'avais pas très bien saisie.
Peu importe, je pense que maintenant tout est clair. Je suis désolé, je n'ai pas regardé où pouvait se situer l'erreur dans ton code, mais j'aurais aimé savoir si quelque chose de ce genre te conviendrait ?
%% Remplacement par 0 des valeurs 99 et NaN
sizeA = size(A);
A(isnan(A)|A==99)=0;

%% Remplacement des valeurs nulles de la première colonne
%% puis remplacement des zéros d'une ligne
%% par la première valeur précédente non nulle
Al=A;
[row,col]=find(Al);
[v,index]=unique(row,'first'); clear row;
Al(1:sizeA(1))=Al(sub2ind(size(A),v,col(index))); clear col v index;
Al=reshape(Al.',1,numel(A));
logicalAl=~(Al==0);
nzAl=nonzeros(Al);
Al=reshape(nzAl(cumsum(logicalAl)),fliplr(sizeA)).';
clear logicalAl nzAl;

%% Remplacement des valeurs nulles de la dernière colonne
%% puis remplacement des zéros d'une ligne
%% par la première valeur suivante non nulle
Ar=fliplr(A);
[row,col]=find(Ar);
[v,index]=unique(row,'first'); clear row;
Ar(1:sizeA(1))=Ar(sub2ind(size(A),v,col(index))); clear col v index;
Ar=reshape(Ar.',1,numel(A));
logicalAr=~(Ar==0);
nzAr=nonzeros(Ar);
Ar=fliplr(reshape(nzAr(cumsum(logicalAr)),fliplr(sizeA)).');
clear logicalAr nzAr;

%% Moyenne des deux matrices
Amod=(Al+Ar)/2; clear Al Ar;
Je te souhaite une bien bonne journée !

PS : Ces quelques lignes donnent évidemment un résultat correct s'il y a au moins une valeur non nulle sur chaque ligne. Je n'ai pas regardé quel genre d'incohérence cela pouvait donner dans le cas contraire. Peut-être se produit-il une erreur, tu n'auras qu'à tester. ;-)
1
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
27 févr. 2009 à 15:21
Bonjour Fee Fay,

Je tiens à te remercier, je l'ai testé et il marche bien, je vais juste vérifier, s'il va marche pour le cas de ma matrice géante, formée de 3000 colonnes et les 700 lignes,

merci encore une fois, et bonne fin de semaine
1

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

Posez votre question
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
27 févr. 2009 à 17:07
Il n'y a pas de quoi mon ami ! ;-)
Tu me diras si tout se passe bien pour la matrice à laquelle tu veux effectivement appliquer les modifications. Au niveau mémoire en tout cas, je doute que cela pose problème ; avec la taille de ta matrice, la RAM utilisée pour l'exécution du code doit être d'environ 80Mo, ce qui n'est pas énorme.
Bonne fin de semaine à toi aussi !
1
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 févr. 2009 à 18:05
Bonjour Fee Fay,

J'obtiens une erreur, vu que les nombre de lignes et de collones dans ma matrice n'est pas le même

??? In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> al_var_last at 116
Al(1:sizeA(1))=Al(sub2ind(size(A),v,col(index))); clear col v index;

EST CE QU'IL y a un moyen de trouver une autre solution, je crois que le problème réside dans la fonction sub2ind, non ? peut on la remplacer par autre chose par exemple ?

merci d'avance,
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
28 févr. 2009 à 19:13
Bonjour mon ami !
Le fait que le nombre de lignes et le nombre de colonnes de ta matrice ne soient pas les mêmes ne devrait pas poser de problème.
As-tu vérifié qu'il n'y avait aucune ligne de ta matrice qui ne contenant que des zéros (après remplacement des 99 et des NaN) ?
L'erreur vient de là selon moi.
Je te souhaite une bien bonne soirée !
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 févr. 2009 à 19:55
Bonsoir,

je crois il y a les deux premieres lignes qui ne contiennent que des zéros et je crois qu'il y aussi des colonnes ki ne contiennent que des zéros, tu me proposes de faire quoi à ce moment

merci encore une fois,
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
28 févr. 2009 à 19:58
Il n'y a pas de quoi ! ;-)
S'il y a des colonnes qui ne contiennent que des zéros, cela ne pose aucun problème.
En revanche, dans la stratégie de remplacement que tu suggérais, il était nécessaire qu'au moins un élément de chaque ligne soit non nul.
Ce n'est pas à moi de proposer quoi que ce soit en ce cas, mais plutôt à toi de savoir ce que tu comptes mettre comme valeurs dans les lignes qui ne contiennent que des zéros.
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 févr. 2009 à 20:10
Rebonjour,


Je tiens à te remercier, sincerement, j'ai vérifié il y a juste les deux premières lignes, mais il y a plusieurs colonnes qui ne contiennent que des zéros, je vais remplacer les deux lignes par la première valeur de la 3ième ligne, vu que les colonnes ne causent pas de problèmes,

merci Fee Fay
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
28 févr. 2009 à 20:32
Il n'y a pas de problème fou_cinglé, je suis content de pouvoir avoir un minimum d'échanges dans une plateforme d'assistance ; assez souvent, les personnes posent leur question, quand on le peut on répond et ensuite on n'a aucun feedback, on ne sait même pas si la personne est venu consulter la réponse, si celle-ci lui a convenu, en résumé, on ne sait rien. J'ai parfois l'impression de me faire des monologues. :-D

Pour ton problème, il n'y a rien de très compliqué si tu désires modifier ta matrice de cette façon.
Tu supprimes les deux premières lignes de ta matrice A avant de faire les remplacements du message 4, puis tu écris une nouvelle matrice dont les deux premières lignes seront constantes et égales à la première valeur de la troisième ligne.
Tu as donc juste à faire ceci avant toute la procédure de remplacement du message 4 :
A([1 2],:)=[];
Tu appliques les quelques lignes de code du message 4 à la nouvelle matrice A dont tu as ôté les deux premières lignes et tu obtiens une matrice Amod.
Enfin, tu crées une nouvelle matrice Amod dont les deux premières lignes sont constantes et égales à la première valeur de la troisième ligne :
Amod=[repmat(Amod(1,1),[2 size(Amod,2)]);Amod];
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 févr. 2009 à 20:37
bONJOUR,

c'EST PAS SEULEMENT DU SOUTIEN TECHNIQUE ET DE PROGRAMMATION AVEC TOI, mais aussi c'est rigolo, j'ai bien aimé ton expression de monologue.

Pour revenir, à mon problème, je vais essayer ta proposition et je reviendrai avec mes questions qui ne finissent jamais, en espérant que je t'ennuies pas trop...

merci pour tout encore et encore,
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
28 févr. 2009 à 20:45
Je suis content que cela te plaise alors ! :-D
Cela me fait plaisir...

Pour la dernière ligne de code, tu peux aussi faire ceci qui revient au même :
Amod=[Amod(1,1)*ones(2,size(Amod,2));Amod];
Pour les tailles de matrices que tu considères, il n'y aura pas de grandes différences en temps d'exécution. Mais pour un programme plus important, je ne saurais dire quelle ligne est la plus rapide, celle du message 12 je dirais, mais je ne m'avancerais pas.

D'accord, il n'y a pas de problème, tiens-moi au courant. tu ne m'ennuies pas du tout.
Mais si je ne réponds pas tout de suite à l'un de tes messages, ce n'est pas que je t'ai abandonné, c'est tout simplement que je ne suis plus connecté. ;-)
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
28 févr. 2009 à 23:41
bonjour,

j'ai essayé tes solutions proposées, c'est bon qu'il m'a enlevé les deux premières lignes, mais c'est juste qu'il me redonne toujours le même code d'erreur,

??? In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> al_var_last at 117
A(1:sizeLIDAR(1))=Al(sub2ind(size(A),v,col(index))); clear col v index;

je ne sais pas en fait ce qui se passe, parce j'ai vérifié et je n'ai plus de lignes formées uniquement de zéros, que penses tu ?

merci
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
1 mars 2009 à 00:24
Peux-tu me donner les tailles des matrices Al et v dans le code ?
Ainsi que le résultat d'une autre commande...
Modifie la partie du code où il y a le problème de la manière suivante :
Al=A;
disp(['Size Al : ' num2str(size(Al))]);
%% Pour s'assurer qu'il n'y a pas d'autres lignes remplies de zéros
nlinestest=sum(prod(real((Al==0)),2));
disp(['Number of lines filled with zeros : ' num2str(nlinestest)]);
[row,col]=find(Al);
[v,index]=unique(row,'first'); clear row;
disp(['Size v : ' num2str(size(v))]);
Al(1:sizeA(1))=Al(sub2ind(size(A),v,col(index))); clear col v index;
À plus tard !
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
1 mars 2009 à 14:53
Bonjour Fee Fay,

j'ai essayé ton dernier code, mais j'obtiens toujours la même erreur

??? In an assignment A(I) = B, the number of elements in B and
I must be the same.

Error in ==> al_var_last at 120
Al(1:sizeA(1))=Al(sub2ind(size(A),v,col(index))); clear col v index;

Pour la taille de la matrice en enlevant les deux premières lignes qui sont totalment formées de zéros, voici ce que j'ai obtenu,

Size Al : 498 2870
Number of lines filled with zeros : 0
Size v : 498 1

si je n'enlève pas les deux premières lignes, voici le résultat :

Size Al : 500 2870
Number of lines filled with zeros : 1
Size v : 499 1

ce qui est étrange c'est que il doit me donner deux lignes remplies de zéros dans ce dernier cas, alors qu'il ne donne qu'une seule ligne et en fait c'est vrai j'ai vérifié méticuleusement et j'ai trouvé une seule valeur non nulle dans la deuxième ligne et à la colonne 2547.

j'ai essayé aussi un truc qui a marché, j'ai remplacé les deux premières lignes, par la première valeur de la 3ième ligne, et le code a bien marché, mais la question, si jamais j'obtiendrais, dans d'autres données, un ligne nieme ligne qui est toute remplies de zéros, pas nécessairement les deux premières, le code ne va plus rouler, mais avant ceci, c'est quoi à ton avis le premier problème qui apparait en haut, je veux dire l'erreur, bien qu'on a juste une ligne remplie de zéros, pourquoi il nous indique ce genre d'erreur ?

merci d'avance,
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
1 mars 2009 à 15:23
Bonjour mon ami !

Il est vrai que la façon dont tu as procédé convient aussi tout à fait. Mis à part le fait que travailler sur les deux premières lignes rajoutent des calculs inutiles et que l'on pourrait s'en passer, il n'y a pas de problème à travailler de cette façon. Je veux dire par là que pour un nombre de données très important, il est plus judicieux d'éviter tout calcul inutile et donc ici, remplacer les deux premières lignes seulement à la fin ferait gagner un peu de temps et d'espace mémoire. Mais comme le nombre de tes données n'est pas énorme, ce n'est pas très important.

Pour répondre à ton interrogation concernant le fait qu'il y ait toujours le bug, cela est tout à fait normal puisque le code n'a pas changé, je voulais juste avoir quelques informations concernant ce qui pouvait se passer. Mais je n'ai rien appris avec ce que je t'ai demandé. J'aurais dû te demander l'affichage de la taille de A.
En revanche, je pense avoir saisi où était l'erreur que tu avais commise.
Je te suggérais d'enlever les deux premières lignes de A avant d'appliquer les quelques lignes de code mais à la vue de ce qui se passe, il n'est pas improbable que tu ne l'aies fait tout au début du code, d'où les problèmes de dimensions.
Comme il n'y a que la première ligne où il n'y a que des valeurs indésirables, en procédant comme suit, cela aurait marché.
%% Suppression de la première ligne
A(1,:)=[];

%% Remplacement par 0 des valeurs 99 et NaN
sizeA = size(A);
A(isnan(A)|A==99)=0;

%% Remplacement des valeurs nulles de la première colonne
%% puis remplacement des zéros d'une ligne
%% par la première valeur précédente non nulle
Al=A;
[row,col]=find(Al);
[v,index]=unique(row,'first'); clear row;
Al(1:sizeA(1))=Al(sub2ind(sizeA,v,col(index))); clear col v index;
Al=reshape(Al.',1,numel(A));
logicalAl=~(Al==0);
nzAl=nonzeros(Al);
Al=reshape(nzAl(cumsum(logicalAl)),fliplr(sizeA)).';
clear logicalAl nzAl;

%% Remplacement des valeurs nulles de la dernière colonne
%% puis remplacement des zéros d'une ligne
%% par la première valeur suivante non nulle
Ar=fliplr(A);
[row,col]=find(Ar);
[v,index]=unique(row,'first'); clear row;
Ar(1:sizeA(1))=Ar(sub2ind(sizeA,v,col(index))); clear col v index;
Ar=reshape(Ar.',1,numel(A));
logicalAr=~(Ar==0);
nzAr=nonzeros(Ar);
Ar=fliplr(reshape(nzAr(cumsum(logicalAr)),fliplr(sizeA)).');­
clear logicalAr nzAr;

%% Moyenne des deux matrices
Amod=(Al+Ar)/2; clear Al Ar;

%% Écriture de la première ligne
%% Valeurs constantes égales à la
%% première valeur de la seconde ligne
Amod=[Amod(1,1)*ones(1,size(Amod,2));Amod];
En ce qui concerne le fait que pour une autre matrice tu puisses avoir des lignes non nulles autres que la première, il faudrait d'abord savoir quelles valeurs tu veux mettre sur ces lignes dans ce cas.

Je te souhaite un bien bon dimanche !
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
1 mars 2009 à 17:21
Bonjour Fee Fay,

Je te remercie, ca a bien marché, le problème est résolu, et puis pour les lignes qui peuvent comportées uniquement des valeurs nulles, je crois je les remplacerai par la dernière valeur de la ligne précédente ou la première valeur de la ligne suivante ou encore la moyenne de ces deux valeurs, je peux par exemple lui demander au début après avoir remplacé les NaN et les 99 par des zéros qu'il me cherche toutes les lignes nulles, puis je lui demanderai de calculer la moyenne par exemple....

en tout cas, un grand remerciement, pour ce soutien incomparable et bon dimanche
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
1 mars 2009 à 18:12
Tu es le bienvenu fou_cinglé ! ;-)
Je suis content que ton problème soit résolu. Et puis pour les lignes nulles, effectivement, tu n'auras aucun mal à résoudre ce petit problème éventuel.
Merci à toi pour ton attention.
Je te souhaite une bien bonne fin de week-end et à bientôt peut-être ! ;-)
0
fou_cinglé Messages postés 36 Date d'inscription jeudi 26 février 2009 Statut Membre Dernière intervention 26 juin 2011 10
1 mars 2009 à 18:13
Bonjour Fee Fay,

je crois que ca va etre ma derniere question, quelle fonction en matlab peut on utiliser pour enlever les pics bruités dans un graphe ou dans une courbe ?

merci
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
1 mars 2009 à 19:13
Pour cette question, je dois dire que je ne sais pas trop. Tu peux filtrer tes données (comme un signal) et tracer ensuite les courbes correspondantes, je n'utilise pas tout ce qui concerne le filtrage de données donc je ne saurai t'en dire d'avantage mais tu peux taper le mot-clé filter dans l'aide Matlab pour voir les possibilités que tu as. Si tu possèdes la Signal Processing Toolbox, tu auras à ta disposition nombre d'outils qui te permettront de faire quelque chose de très propre je pense. Cela dit, un filtre modifiera quelque peu la forme générale de ta courbe et n'enlèvera pas seulement les pics.

Sinon, tu peux enlever les pics de manière très grossière aussi. Supposons que tu as un vecteur de données y en des points x (organisés dans un vecteur). Les trois possibilités grossières qui me viennent tout de suite à l'esprit sont :

1) Faire comme tu viens de le faire mais cela je pense que tu le sais déjà puisque c'est toi qui l'as fait. :-D

2) Tu enlèves purement et simplement les points qui te gênent. Par exemple, tu estimes que dès que y dépasse la valeur 50, il s'agit d'un pic indésirable et tu enlèves tout ce qui correspond à cela :
x=x(y<=50);
y=y(y<=50);
plot(x,y);
3) Tu satures les données à une valeur maximale qui ne doit pas être dépassée. Par exemple, tu estimes que dès que y dépasse la valeur 50, il s'agit d'un pic indésirable et tu remplaces tout ce qui correspond à cela par 50.
y(y>50)=50;
plot(x,y);
Enfin, il y a une dernière chose qui me vient à l'esprit, c'est un affinage de la méthode 2. Tu enlèves purement et simplement les valeurs indésirables puis tu fais une interpolation pour que ta courbe soit plus propre qu'en la traçant après avoir enlevé tout ce qui te gênait. Tu peux faire ceci avec la fonction interp1 (tape help interp1 ou doc interp1 si tu veux avoir des informations quant à la fonction).
Par exemple, tu disposes de données correspondant normalement à une sinusoïde.
Prenons
x=[0 pi/6 pi/4 pi/3 pi/2 3*pi/4 pi 5*pi/4 3*pi/2 5*pi/3 11*pi/6 2*pi];
y=sin(x);
Si tu fais
plot(x,y);
Il n'y a aucun souci (la courbe n'est pas très jolie mais elle ressemble à quelque chose).
Ensuite, perturbons artificiellement les données.
y(4)=2;y(5)=3;y(8)=-3;y(11)=-2;
Puis traçons la courbe.
plot(x,y);
C'est atrocement laid, cela ne ressemble plus à rien, même dans un cirque aux côtés de la femme à barbe, ils n'en voudraient pas.
Appliquons alors la méthode 2 en supprimant les données dont la valeur absolue est plus grande que 1.
x=x(abs(y)<=1);
y=y(abs(y)<=1);
Et traçons de nouveau la courbe.
plot(x,y);
La courbe n'ira pas faire un défilé de mode mais elle ressemble à quelque chose.
Interpolons la courbe avec des splines sur la subdivision dont on disposait précédemment.
x1=[0 pi/6 pi/4 pi/3 pi/2 3*pi/4 pi 5*pi/4 3*pi/2 5*pi/3 11*pi/6 2*pi];
y1=interp1(x,y,x1,'spline');
Roulement de tambours... Traçons la courbe.
plot(x,y);
Elle est comme neuve !

Remarque qu'en interpolant sur une subdivision assez fine de [0,2π] (subdivision régulière de pas π/16 par exemple).
x1=(0:pi/16:2*pi);
y1=interp1(x,y,x1,'spline');
Et en traçant ensuite la courbe.
plot(x,y);
Elle est magnifique ! Mais il était aussi possible de donner une plus jolie tête à la courbe initiale non perturbée par les pics avec la même méthode d'interpolation.

Je te souhaite une bien bonne soirée !
0
bonjour, j'ai un problème. je veux résoudre un système linéaire de 150 équations à 150 inconnus. la matrice est diagonale et contient beaucoup de zero. j'ai appliqué l'élimination de gauss. ca marche pour les petits systèmes et quand la matrice est grande, j'obtiens les NAN partout; que faire?
0