Vous êtes sur la page 1sur 24

UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filières : CP 1

Notes de Cours - Matlab

Notion des variables en Matlab

En matlab, ce n’est pas nécessaire de déclarer et préciser les types des variables.
Juste il faut saisir le nom de la variable et lui affecter une valeur. Le type de la variable prendra
par défaut le type de la donnée.

Exemple :
>> a = 14.5 ; la variable a reçoit une valeur réelle
>> a = ‘Info’ ; la variable a reçoit une chaine de caractères

Manipulation des vecteurs :

Pour créer un vecteur

>> x = [4 1 5 0 7] ou x = [4, 1, 5, 0, 7] ; est un vecteur ligne de cinq éléments (séparés par des
espace ou des virgules)
>> y = [5 ; 6 ; 8 ; 7] ; est vecteur colonne de 4 éléments (séparés par des points-virgules)
>> x’ le transposé de x
>> z = rand(1, n) permet de créer un vecteur ligne de n éléments aléatoires entre 0 et 1
>> z = rand(n, 1) permet de créer un vecteur colonne de n éléments aléatoires entre 0 et 1
>> x = zeros(1, n) permet de créer un vecteur ligne de n éléments nuls
>> x = ones(1, n) permet de créer un vecteur ligne de n éléments valent 1

Pour extraire quelques éléments d’un vecteur

>> x = [4, 5, 7, 1, 0, 2, 6] ;
>> y = x(1 : 3) ; permet d’extraire 3 élément de x et les affecter à y
y = [4, 5, 7]
>> x = 1 : 10 ; permet de générer un vecteur avec des éléments de 1 à 10 (le pas par défaut est
égal à 1)
>> x = 1 : 0.5 : 10 ; permet de générer un vecteur avec des éléments de 1 à 10 (le pas est 0.5)
N.B. En Matlab l’accès au premier élément d’un vecteur (tableau) x est x(1) et non pas x(0)
>> length (x) – détermine le nombre des éléments du vecteur x
>> mean (x) – calcule la moyenne des éléments du vecteur x
>> sum (x) – calcule la somme des éléments du vecteur x (Sigma)
>> prod (x) – calcule le produit des éléments du vecteur x

Opérations des vecteurs : (les vecteurs doivent avoir la même longueur)


>> x = rand(1, n) ;
>> y = rand(1, n) ;
>> z = x + y ; reçoit la somme des deux vecteurs x et y
>> z = x - y ; reçoit la différence des deux vecteurs x et y
>> z = x / y ; reçoit le rapport du vecteur x sur y
>> z = x . / y ; reçoit la division de chaque élément de x par celui de y
>> z = x .* y ; reçoit le produit de chaque élément de x par celui de y
>> z = x * y ; reçoit le produit vectoriel des deux vecteurs x et y (à condition que le vecteur y
doit être colonne si x est un vecteur ligne)
Manipulation des Matrices :

Pour créer une matrice de 2 lignes et 3 colonnes par exemple :


>> M = [1 2 0 ; 4 7 8] ;
>> Z = rand (4,5) ; matrice de 4 lignes et cinq colonnes avec des valeur aléatoires entre 0 et 1
Si M est une matrice carrée
>> diag (M) extrait les éléments de la diagonale de M
>> M = zeros (n, m) ; permet de générer une matrice de n lignes et m colonnes à valeur nulle
>> M = ones (n, m) ; permet de remplir, avec la valeur 1, une matrice de n lignes et m colonnes
>> M = eye (n) ; permet de construire une matrice carrée dont les valeurs sa diagonale valent 1 et
0 ailleurs
Extraction d’un bloc d’une matrice

>> M = [4 2 1 8 ; 5 7 0 6 ; 3 4 7 5] ;
M= 4 2 1 8
5 7 0 6
3 4 7 5
>> N = M(1 : 2 , 2 : 4) permet d’extraire de la matrice M un bloc formé à partir de la 1 ligne
jusqu’à la 2 ligne et de la 2 colonne jusqu’à la 4 colonnes
N=2 1 8
7 0 6
Manipulation des nombres complexes

>> z = 3+ i * 4
N.B. en Matlab i * i = -1 (de même j * j = -1)

conj(x) Calcule le complexe conjugué de x. Si x = a + b*i alors conj(x) = a - b*i


real(x) Retourne la partie réelle de x
imag(x) Retourne la partie imaginaire de x
abs(x) Retourne la magnitude de x, |x |= la racine carrée de (a2 + b2)
angle(x) Retourne l'angle du nombre complexe "x" calculé par l'expression
atan ( imag(x)/real(x) )

Quelques fonctions mathématiques

abs(x) Calcule |x|


acos(x) Calcule arccos(x) en radians
angle(x) Retourne l'angle (phase) du nombre complexe "x" en radians
asin(x) Calcule arcsin( x) en radians
atan(x) Calcule arctan( x) en radians
cos(x) Calcule cosinus de x en radians
sin(x) Calcule sinus de x en radians
tan(x) Tangente de x
exp(x) Calcule ex
log(x) Calcule le logarithme naturel "log(x)"
log10(x) Calcule "log10 (x)"
[value, index]=max(x); Retourne la valeur maximale dans le vecteur x, et sa position
[value, index]=min(x); Retourne la valeur minimale dans le vecteur x, et sa position
sqrt (x) La racine carrée de x
ceil(x) Retourne la première valeur entière supérieure à x, dans la direction de + ∞
ceil(2.3) = 3
et ceil(-2.3) = -2
Construction des graphes de fonctions

plot(t , x) – permet de construire la courbe de x en fonction de t.

Les deux vecteurs doivent voir la même longueur. (length(x) = length(x)).

Exemple :

Construction de la courbe de f(t) = t^2 dans l’intervalle [-20, 20] ;

t = -20 : 20 ; (le pas par défaut est égal à 1) , pour une bonne résolution de la courbe il faut
augmenter le nombre points c'est-à-dire diminuer le pas :

t = -20 : 0.01 : 20 ;
f = t .^2 ;
plot(t , f) ;

Quelques fonctions utiles pour le graphique

>>title(' Titre du graphe ') – pour insérer un titre au graphe .

>>gtext(' nom de la fonction ') permet d’ajouter du texte sur le graphe.

>>axis([xmin xmax ymin ymax]), pour paramétrer les axes x et y.

>>subplot(m, n, p) permet de diviser la figure courante en m lignes et n colonnes en créant


des axes dans la position spécifiée par p

>>xlabel, ylabel : ajout du texte à coté des axes respectivement x et y


UNIVERSITE IBN ZOHR Année Universitaire : 2018-2019

Ecole Nationale des Sciences Appliquées – Agadir Filières : CP 1

TP 1 - Matlab

Manip. 1
Créer quatre matrices A, B et C, et D de taille 4 x 4 de votre choix.

1. Former la matrice X de taille 8 x 8 ayant la forme suivante :

𝑨 𝑩
X= [ ]
𝑪 𝑫
2. Créer la matrice Y de taille 8 x 8 ayant la forme suivante :

Y=

3. Former les vecteur d1, d2, d3 et d4 à partir des éléments des diagonales des matrices
respectivement A, B, C et D.
4. Calculer les valeurs maximales de ces vecteurs.
5. Former un vecteur-ligne d à partir des vecteurs d1, d2, d3 et d4.
6. A partir des matrices A, B, C et D former une matrice Z de taille 4 x 4 x 4 (cube)

Manip. 2
Soient les fonctions suivantes pour x compris entre -10 et 10 :

F(x) = 0.5/(x + 0.5e (x/10) ) , G(x) = 2x / (1 – x3) , H(x) = 1 / (1 – x2 ) et I(x) = 10x sin(1/x)

1) Tracer les courbes des fonctions dans un même graphe avec des couleurs différentes
2) Tracer les courbes des fonctions dans des graphes séparés dans un canevas partagé en
deux lignes et deux colonnes, et donner des titres pour chaque graphe.
Manip.1

1) X = [A B;C D]

2) Y = [A zeros(4,4);zeros(4,4) A]

3) d1 = diag(A)
d2 = diag(B)
d3 = diag(C)
d4 = diag(D)

4) max(d1)
max(d2)
max(d3)
max(d4)

5) dC = [d1;d2;d3;d4]

%Ou bien
dC = cat(1,d1,d2,d3,d4)

6) Z(:,:,1)=A;
Z(:,:,2)=B;
Z(:,:,3)=C;
Z(:,:,4)=D;

%Ou bien
Z = cat(3,A,B,C,D);

Manip.2

%L'axe des abscisses


x = -10:0.01:10; %créer un vecteur contenant des éléments allant de
-10 jusqu’à 10 avec un pas de 0.01

%Les axes des ordonnées


F = 0.5./(x+0.5*exp(x./10));
G = (2.*x)./(1-x.^3);
H = 1./(1-x.^2);
I = 10.*x.*sin(1./x);

%le point avant les opérateurs des vecteurs indique qu’il s’agit d’une
opération élément par élément, et non pas vectorielle

1) plot(x,F,'b',x,G,'r',x,H,'y',x,I,'g');

2) subplot(2,2,1),plot(x,F,'b'),title('fonction F');
subplot(2,2,2),plot(x,G,'r'),title('fonction G');
subplot(2,2,3),plot(x,H,'y'),title('fonction H');
subplot(2,2,4),plot(x,I,'g'),title('fonction I');
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

Notes de Cours – Matlab

Manipulation des chaines de caractères

- Affectation d’une chaine de caractère à une variable

>> ch =' mot ' ;

>> ch = input (' donner une valeur pour ch ' ) ; permet de lire une valeur à partir du clavier

>> ch= input (' donner une valeur pour ch ', ' s ' ) permet de lire une valeur (chaine de caractère)

à partir du clavier

- Affichage du contenu de ch:

>> ch (il suffit de taper le nom de la variable) ou disp (ch)

>> length(ch) – détermine la longueur de la chaine contenue dans ch

- Conversion de chaînes en nombres

>> ch =' mot ' ;

>> abs(ch) affiche le code ascii de la chaine ' mot ' qui vaut : 109 111 116

>> double (ch) convertit les caractères de la chaine en code ascii en double précision

>> ch='123';

>> str2double(ch) Transforme le nombre en chaîne sous forme d’un nombre en double précision

char () Convertit un tableau d’entiers non négatifs en caractères (les 127 premiers sont les codes
ascii de ces caractères).

>> char([105 110 102 111]) affichera la chaine ' info '

>>num2str() Transforme un nombre sous forme d’une chaîne de caractères.

>> isstr(), ischar() elles retournent 1 si l’argument est une chaîne de caractères et 0 autrement.

- Concaténation de chaînes de caractères


Pour concaténer horizontalement des chaînes de caractères, il suffit de les mettre comme
des éléments d’un vecteur ligne
>> ch =['cours ' ' de' ' Matlab']

ans =

cours de Matlab

>> strcat() Concatène une suite de chaînes données en argument

La concaténation verticale comme éléments d’un vecteur colonne impose que ces chaînes soient de
même longueur.

>> strvcat('abc’ ,'def ', 'ghi ') ;

>> strcmp (ch1,ch2) ; Compare 2 chaînes de caractères données en arguments.


Retourne la valeur 1 s’elles sont identiques, sinon 0
>> strncmp (ch1,ch2,N) ; Compare les N premiers caractères de chaînes.
>> strcmpi (ch1,ch2) ; Compare les chaînes en ignorant les types majuscule et minuscule.
>>findstr(ch1,ch2) ; Recherche de la chaine ch2 dans ch1.

Exemple :
ch1='labsa' ;
findstr(ch1,’a’) =
2 5
Le symbole ‘a’ se trouve dans la 2ième et la 5ième position dans la chaine ch1

>> ch = strrep(ch1,ch2,ch3) remplace toutes les occurrences de la chaîne ch2 dans ch1 par la chaîne
ch3.

Exemple
>> ch = strrep('aujourdhui il fait chaud', 'chaud', 'froid')
ch =
'aujourdhui il fait froid'
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

TP 2 - Matlab

Manip. 1
Ecrire un programme qui permet de lire une ligne de texte à partir du clavier et la stocker dans une
variable L. On souhaite par la suite crypter cette ligne avec un code (clé) que l’on doit saisir dans une
autre variable C.
- Affecter la ligne codée à une nouvelle chaine LC.
- Afficher le contenu de LC.
- Décrypter la chaine LC puis l’affecter à une nouvelle chaine LD
- Comparer L et LD

Manip.1

%Lire la chaine et la clé du cryptage


L = input('saisir une ligne de texte ','s') ;
C = input('saisir un code pour crypter la chaine L ') ;

%% Cryptage
% Convertir la chaine L en code ascii avec (abs)
% Modifier le code ascii de la chaine L en additionnant la clé C
% Reconvertir le code ascii modifié en chaine de caractères LC avec
(char)

LC = char(abs(L) + C);

% Afficher la chaine de caractère cryptée


disp(LC)

%% Décryptage
% Convertir la chaine cryptée LC en code ascii avec (abs)
% Modifier le code ascii de la chaine LC pour revenir au code ascii
d'origine en soustrayant la clé C
% Convertir le code ascii en chaine de caractères LD
LD = char(abs(LC)- C);

% Afficher la chaine de caractère décryptée


disp(LD)

% Comparer la chaine d'entrée avec la chaine décryptée


strcmp(L, LD)
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

Notes de Cours – Matlab


Outils de programmation

Les instructions de contrôle

if (cond)
instr 1 ;
else
instr 2 ;
end

En Matlab les instructions de contrôle se terminent par «end »

Les boucle « for » :

for (i = val1 : val2) le pas est par défaut égal à 1


inst 1 ;
inst 2 ;

end

La boucle «while »

while (cond)
instr1 ;
instr2 ;
….
end

Multichoix

switch (var)

case val1
inst1 ;
case val2
inst2 ;
….
otherwise
inst k ;
end
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

TP 3 - Matlab

Manip. 1
Ecrire un programme qui calcule et affiche les solutions de l’équation de second degré dans R
puis dans C. (les coefficients de l’équation devront être saisis à partir du clavier).

N.B. Vérifier le résultat du programme en utilisant la fonction de Matlab :

[x1, x2] = roots([a b c]) ; (elle permet de calculer les racines d’un polynôme de degré 2 avec
les coefficients a, b et c ) ;

Manip. 2
Ecrire un programme qui permet de saisir les éléments d’une matrice A carrés 4x4 à partir du
clavier. Construire une nouvelle matrice B de même taille que A selon la condition :

Bij = Aij* Aij si Aij <0

Bij = Aij / 2 sinon

- Calculer et afficher les produits des éléments de chaque colonne de B.


- Calculer et afficher la moyenne des éléments de la diagonale de B.

N.B. Vérifier le résultat du programme en utilisant les fonctions de matlab prod , diag et
mean

Manip. 3
Ecrire un programme qui permet de stocker une ligne de texte, saisie à partir du clavier, dans
un tableau L. Puis envoyer le texte inversé de L vers un autre tableau R.

Afficher le nouveau texte inversé de R.

Exemple :

L = ‘ je lis un texte ’,  R = ‘ etxet nu sil ej’

N.B. Ecrire le même programme avec deux boucles différentes (for…end et while ….end)
Vérifier en utilisant la fonction flip()
Manip 1.

%% Saisie des coefficients


a = input('donner le coefficient a ');
b = input('donner le coefficient b ');
c = input('donner le coefficient c ');

%% Calcul de delta
delta = (b^2)-(4*a*c);

%% Discussion des cas de delta + Calcul des solutions


if(delta==0)
x1 = (-b)/2*a
else
x1 = (-b-sqrt(delta))/(2*a) %lorsque delta est négatif, la
fonction sqrt renvoie automatiquement un nombre complexe
x2 = (-b+sqrt(delta))/(2*a)
end

%% Vérification des résultats


roots([a b c])

Manip 2.

1.
for i=1:4
for j=1:4
A(i,j)=input('donner une valeur'); %lire chaque élément
de la matrice

if A(i,j)<0 %poser la condition sur l’élément actuel


B(i,j)=A(i,j)*A(i,j); %son carré est stocké dans une
nouvelle matrice B
else
B(i,j)=A(i,j)/2; %idem
end
end
end

2.
for j=1:4 %itération sur les colonne de la matrice B

P(j)=1; %initialisation du produit de la colonne j


%P est un vecteur dont chaque élément contient le produit d’une
colonne de la matrice B (Ex. P(3) contient le produit de la
troisième colonne de B)

for i=1:4 %itération sur les lignes pour calculer le produit

P(j)=P(j)*B(i,j); %calcul du produit de la colonne j


end
end

disp(P); %affichage du vecteur P


3.
S=0; %initialisation de la somme

for k=1:4 %itérer à la fois sur les ligne et sur les colonnes
S=S+B(k,k); %calcul de la somme des éléments de la diagonale
end

M=S/4; %calcul de la moyenne


disp(M);

Manip 3.

L=input('saisir une ligne de texte: ','s');

n=length(L); %n reçoit la taille de la chaîne de caractères

for i=1:n
R(i)=L(n-i+1); %le dernier élément de la chaîne L est déposé
dans le premier élément la chaîne R, puis l’avant-dernier élément de
L est déposé dans le deuxième élément de R et ainsi de suite.

end
disp(R);
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

Notes de Cours – Matlab

Les fonctions
Création d’une fonction :

function [val1, val2 ,..vlan] = nom_fonct (arg1,arg2 ,…argk)

val1, val2 ,…..représentent les valeurs de sortie de la fonction ;

arg1, arg2, …..représentent les paramètres d’entrée.

N.B. en Matlab il est strictement obligatoire de sauvegarder la fonction dans un ficher sous le
même nom que de celui de la fonction. Exemple : nom_fonct.m

Exemple :

On crée une fonction qui permet de calculer y = (2*x+3)/2.

function y = fonct ( x )

y = (2*x + 3) /2

end

On sauvegarde le fichier fonct.m

A l’invite de commande :

>> y = fonct (4)

y = 5.5
UNIVERSITE IBN ZOHR Année Universitaire : 2019-2020

Ecole Nationale des Sciences Appliquées – Agadir Filière : CP 1

TP 4 - Matlab

Manip.1
a) Ecrire une fonction qui reçoit en entrée une chaine de caractère et un symbole, et
renvoi en sortie le nombre d’occurrence de ce symbole dans la chaine.

b) Ecrire une fonction qui reçoit en entrée deux chaînes de caractères puis renvoie le
résultat logique de leur comparaison.

Manip.2
Ecrire une fonction qui calcule les nème termes (n passé en argument) de la suite de Fibonacci :

avec F0 = 1 et F1 = 1

Manip.3
a)

Ecrire une fonction qui calcule les nème termes (n passé en argument) des suites entières Un et
Vn définies ci-dessous.

U0 = 1 V0 = 1
Un = Vn-1 + 1 Vn = 2Un - 1

b)

Ecrire une fonction select_terme qui permet de sélectionner le nème terme d’une des
suites, en fonction d’un des arguments d’entrée, choix (si choix = 1, on donnera en
sortie Un ; si choix = 2, on donnera en sortie Vn; sinon, la sortie donnera les
deux:([Un ;Vn]). Utilisez la fonction définie précédemment et l’instruction
switch...case.
Manip.1

1.

function [nbr] = nbr_symbole(ch, s)

%ch : la chaîne d’entrée


%s : le caractère dont on cherche le nombre de répétitions

L=length(ch); %taille de la chaîne

nbr =0; %initialisation du nombre de répétitions


for i=1:L %itération de la chaîne

if(ch(i) == s) %si le caractère actuel est semblable au


caractère qu’on cherche

nbr=nbr+1; %incrémentation du nombre de répétition


end
end
end

2.

function [r] = compChaines(ch1, ch2)

r=1; %on suppose au début que le résultat de la comparaison est


vrai, et on étudie tous les cas où les deux chaînes sont
différentes. Si un seul cas est confirmé, le résultat reçoit 0 et ne
peut plus revenir en arrière.

if(length(ch1)~=length(ch2)) %cas où les deux chaînes ont des


tailles différentes

r=0;

else

for i=1:length(ch1) %étudier le cas de chaque couple de


caractères
if(ch1(i)~=ch2(i))

r=0; %si un seul couple de caractères est


différent, le résultat reçoit 0

end
end

end

end
Manip.2

function [F] = fib(n)

if(n==0 || n==1)%fib(0) et fib(1) reçoivent une valeur directe


F=1;

else

F = fib(n-1) + fib(n-2); %fib doit être calculée à partir


d’elle-même. Elle va s’auto-appeler à chaque fois avec des n de plus
en plus petits jusqu’à arriver à fib(0) et fib(1) où elle aura des
valeurs, puis elle commence à remplacer.
end
end

Manip.3

a)
function [U] = Un(n)

if(n==0)
U=1;

else
U= Vn(n-1)+1; %on doit appeler la fonction Vn afin de
calculer Un
end

end

function [V] = Vn(n)

if n==0
V=1;

else
V= 2*Un(n)-1; %on doit aussi appeler la fonction Un pour
calculer Vn
end

end
b)
function [A] = select_terme(n, choix)

switch(choix)

case 1
A=Un(n);

case 2
A=Vn(n);

otherwise %autrement

A=[Un(n) Vn(n)]; %on crée un vecteur qui a le


résultat de la suite Un comme premier élément et Vn comme
deuxième élément
end

end
Exercice manipulation de matrices
On appelle éléments aberrants d’une matrice tout élément dont la valeur n’est pas homogène
avec son voisinage (entourage).
On considère les deux matrices suivantes :

35 10 20 30 210 180 250 175 230

35 30 15 20 180 10 210 230 180

15 10 200 25 190 250 230 185 200

25 20 25 30 200 215 130 205 135

10 35 20 25 175 210 145 130 240

A B
Les éléments 200 de la matrice A et 10 de la matrice B sont deux éléments aberrants puisqu’ils
diffèrent beaucoup des autres éléments de leur voisinage (la partie en orange).
On cherche à filtrer les éléments d’une matrice. Le filtrage consiste à enlever les éléments
aberrants de la matrice et les remplacer par des valeurs plus adéquates (plus appropriées).
Nous utilisons dans cet exercice le filtrage par moyenne. Ce filtrage consiste à remplacer
chaque élément aberrant par la moyenne des éléments de son voisinage, y compris lui-même.

30 15 20 30 15 20

10 200 25 [30, 15, 20, 10, 200, 25, 20, 25, 30] 41.6 10 41.6 25
Moyenne
20 25 30 20 25 30
Voisinage élément aberrant Élément aberrant filtré
Exemple :
>> M = [1 5 3 6 0; 9 1 40 0 2; 4 1 2 5 3; 7 1 50 3 2; 6 3 4 3 1]
M=
1 5 3 6 0
9 1 40 0 2
4 1 2 5 3
7 1 50 3 2
6 3 4 3 1
>> filtredMat = filtreMoy(M, 20)
filtredMat
1 7 0
1 2 5
1 8 3
1- Ecrire une fonction voisinMat qui extrait le voisinage d’un seul élément à partir d’une
matrice. La fonction recevra en arguments la matrice et les deux indices de l’élément, et
donnera en sortie une matrice 3 x 3 représentant son voisinage.

2- Ecrire une fonction mat2vec qui convertie une matrice passée en arguments en un vecteur
ligne.

3- Ecrire une fonction filtreMoy qui remplace tous les éléments d’une matrice donnée en
arguments par la moyenne de leurs voisinages (utiliser la fonction Matlab mean). La fonction
donnera en sortie une nouvelle matrice filtrée.

Afin de reconnaître les éléments aberrants d’une matrice, on calcule la valeur absolue de la différence
entre l’élément et la moyenne de son voisinage (y compris lui-même). Lorsque cette valeur dépasse
un certain seuil, l’élément est considéré comme aberrant et doit donc être filtré.

𝑛𝑜𝑛 𝑎𝑏𝑒𝑟𝑟𝑎𝑛𝑡, |𝑀𝑖,𝑗 − 𝑀𝑜𝑦𝑣𝑜𝑖𝑠𝑖𝑛𝑖,𝑗 | < 𝑠𝑒𝑢𝑖𝑙


𝑀𝑖,𝑗 {
𝑎𝑏𝑒𝑟𝑟𝑎𝑛𝑡, |𝑀𝑖,𝑗 − 𝑀𝑜𝑦𝑣𝑜𝑖𝑠𝑖𝑛𝑖,𝑗 | ≥ 𝑠𝑒𝑢𝑖𝑙

4- Modifier la fonction filtreMoy pour qu’elle ne remplace que les éléments considérés
aberrants par rapport à un seuil qu’elle reçoit en arguments.
Solution :
1)

function [ Mv ] = voisinMat( M,l,c )


%M : matrice d'où l'élément est extrait
%l : la ligne de l'élément
%c : la colonne de l'élément
%Mv : matrice contenant le voisinage de l’élément M(l,c)

Mv = M(l-1:l+1, c-1:c+1); %On extrait depuis la ligne


avant celle de l'élément jusqu'à celle d'après, et depuis la
colonne avant celle de l'élément jusqu'à celle d'après

end
2)

function [ V ] = mat2vec( M )
%M : matrice d'entrée
%V : vecteur de sortie

[m,n]=size(M); %m×n : dimension de la matrice M

k=1; %initialisation de l'itérateur du vecteur

for i=1:m
for j=1:n
%pour chaque élément de la matrice M

V(k)=M(i,j); %mettre l'élément dans le vecteur


k=k+1; %incrémenter la dimension du vecteur V
end
end
end

3)

function [ Mf ] = filtreMoy( M )
%M : matrice à filtrer
%Mf : matrice filtrée

[m,n] = size(M);
for i=2:m-1 %j'évite la première et la dernière lignes
(le carde)
for j=2:n-1 %même chose pour les colonnes
%ici j’itère sur tous les éléments de la matrice sauf
les éléments du cadre, puisque je ne peux pas extraire leurs
voisinages (voisinages incomplets)

Mvois = voisinMat(M,i,j); %extraction de la


matrice du voisinage de l'élément actuel

Vvois = mat2vec(Mvois); %conversion de la


matrice du voisinage en vecteur

moyVois = mean(Vvois); %calcul de la moyenne


du vecteur

Mf(i-1,j-1) = moyVois; %affecter la moyenne à


la matrice de sortie

%le -1 est utilisé pour compenser le décalage du


cadre, cependant "Mf(i,j)=moyVois" est aussi possible

end
end
end
4)

function [ Mf ] = filtreMoy( M, seuil )


%seuil : la valeur qui définit si l'élément est considéré
aberrant ou pas

[m,n] = size(M);
for i=2:m-1
for j=2:n-1
Mvois = voisinMat(M,i,j);
Vvois = mat2vec(Mvois);
moyVois = mean(Vvois);

if( abs(M(i,j)-moyVois) >= seuil) %si la


différence entre l'élément et la moyenne de son voisinage
dépasse le seuil

Mf(i-1,j-1) = moyVois; %la matrice de


sortie reçoit la moyenne du voisinage (filtrage)
else %si la différence est inférieure au seuil

Mf(i-1,j-1) = M(i,j); %la matrice de


sortie reçoit l'élément inchangé (pas de filtrage)
end
end
end
end
Exercice chaînes de caractères
En cryptographie, le cryptage César est l'une des techniques de cryptage les plus simples et
les plus connues. C'est un type de cryptage dans lequel chaque lettre du texte est remplacée
par une autre plus loin dans l’alphabet. Par exemple, avec un décalage de trois positions, ‘A’
deviendrait ‘D’, ‘B’ deviendrait ‘E’, et ainsi de suite.

- On cherche à créer une fonction codeCesar qui reçoit en entrée une chaîne de caractères
et un code (clé) de décalage, et renvoie en sortie une chaîne cryptée.
Exemple :

>> chaineCryptee = codeCesar('allez-y !', 3)


chaineCryptee
'doohc-b !'

 Noter qu’on ne crypte ici que lettres minuscules de l’alphabet. Les lettres majuscules,
la ponctuation, les espaces et les autres caractères spéciaux restent inchangés dans la
chaîne.
 Noter aussi que si les lettres cryptées dépassant la dernière lettre de l’alphabet, celles-
ci reviennent au début de l’alphabet, c.-à-d. qu’avec une clé de 3, ‘xyz’ deviendra ‘abc’.
On donne ci-dessous le tableau des codes ASCII de quelques caractères usuels.
Solution :

function [ chC ] = codeCesar( ch,C )


%ch : chaîne de caractère à crypter
%C : clé de cryptage
%chC : chaîne cryptée

V = abs(ch); %Conversion de ch en vecteur de codes ascii

for i=1:length(V) %Etudier le cas de chaque caractère

if(V(i)>=97 && V(i)<=122) %Le cas où le caractère


est une lettre minuscule de l’alphabet (compris entre ‘a’ et
‘z’) => il va donc être crypté

if((V(i)+C)<=122) %Si le décalage ne dépasse


pas la dernière lettre de l'alphabet

Vc(i) = V(i)+C; %Vc : vecteur crypté

else %Si le décalage dépasse la dernière lettre


de l'alphabet

Vc(i) = V(i)+C-26; %Nous reculons de 26


lettres de l'alphabet
end

else %Le cas où le caractère n'est pas une lettre


minuscule de l’alphabet

Vc(i) = V(i); %Il reste inchangé


end

end

chC = char(Vc); %Conversion du vecteur Vc en chaîne de


caractères

end

Vous aimerez peut-être aussi