Des expressions relationnelles et logiques peuvent être utilisées dans MATLAB.
Opérateurs relationnels
Opérateurs relationnels sont : <, <=, >, >=, ==, ~=
Ces opérateurs peuvent être utilisés avec des scalaires ou des matrices. Le résultat d’évaluation d’une expression relationnelle est 1 (VRAI) ou 0 (FAUX).
Quand ces opérateurs sont appliqués à des matrices, le résultat est une matrice, de mêmes dimensions, formée de 0 et de 1, résultats de comparaisons élément par élément.
Indexation logique
X : matrice quelconque
L : matrice logique de même taille
X(L) = élément de X où L est vrai
>> X = [1 5 3 9 4 7]; >> L = X<=5 L = 1 1 1 0 1 0 >> X2 = X(L) X2 = 1 5 3 4
Recherche dans une matrice
La fonction fonction find permet de faire une rechercher dans une matrice. Elle renvoie les indices des éléments non nuls.
>> X = [Inf 3 8 1 -Inf]; >> k = find(isfinite(X)) k = 2 3 4
Test sur matrice vide
la fonction isempty permet de déterminer si une matrice est vide.
>> A = rand(2,2,2); >> isempty(A) ans = 0
>> A(:,:,:) = []; >> isempty(A) ans = 1
Comparaison de matrices
Pour faire une comparaison matricielle, vous pouvez utiliser les fonctions any et all.
- any
- Vecteur : renvoie 1 (vrai) s’il existe un élément non nul dans le vecteur
- Matrice : renvoie un vecteur ligne donnant le résultat de la fonction pour chaque vecteur colonne de la matrice
- all
- Vecteur : renvoie 1 (vrai) si tous les éléments du vecteur sont non nuls
- Matrices : renvoie un vecteur ligne donnant le résultat de la fonction pour chaque vecteur colonne de la matrice
Exemples:
Egalité de 2 matrices : all(all(A==B))
Inégalité de 2 matrices : any(any(A~=B))
Opérateurs logiques
Les expressions relationnels peuvent être combinées en utilisant les opérateurs logiques suivants : & (and), | (or), ~ (not) , xor
Qui signifient respectivement « ET » (AND), « OU » (OR), « NON » (NOT) et « OU exclusif ». Ces opérateurs sont appliqués sur les matrices élément par élément. Les opérateurs logiques ont une priorité plus faible que les opérateurs relationnels, qui à leur tour ont une priorité plus faible que les opérateurs arithmétiques.
Il est conseillé d’utiliser les parenthèses afin d’éviter toute ambiguïté.
Exemple 1 :
L’exemple suivant permettra de limiter un signal u (t) variant dans le temps, entre les valeurs u_min et u_max en utilisant les opérateurs relationnels et logiques.
fichier sature.m
function u_limite = sature (u, u_min, u_max) % limitation d'un signal % si signal < u_min alors signal = u_min, % si signal > u_max alors signal = u_max, % si u_min <= signal >= u_max alors signal non modifié % expressions logiques retournant 1 ou 0 expr1 = (u >= u_max); expr2 = (u <= u_min); expr3 = ((u < u_max) & (u > u_min)); u_limite = expr1*u_max + expr2*u_min + expr3*u; end
Une expression logique vraie vaut 1, dans le cas contraire elle a pour valeur 0.
Dans la fonction sature, les opérateurs relationnels et logiques ont permis d’éviter l’emploi de l’instruction de contrôle if.
Quelques exemples d’appels de cette fonction
- On définit les valeurs u_min et u_max
>> u_min = 0; >> u_max = 10; >> sature (6.5, u_min, u_max) ans = 6.5000 >> sature (10.5, u_min, u_max) ans = 10 >> sature (-1.5, u_min, u_max) ans = 0
Nous pouvons adapter la fonction de saturation précédente, pour qu’elle puisse s’appliquer à un tableau de valeurs. Nous rappellerons le fichier correspondant sature2.m.
fichier sature2.m
function u1 = sature2 (u, u_min, u_max) % limitation d'un signal % si signal < u_min alors signal = u_min, % si signal > u_max alors signal = u_max, % si u_min <= signal >= u_max alors signal non modifié u1 = (u >= u_max).*u_max + (u <= u_min).*u_min + ((u < u_max) & ... (u > u_min)).*u;
Notez bien que la seule modification se trouve au niveau de la multiplication des vecteurs (multiplication élément par élément « .* »).
Nous allons appliquer la fonction sature2 à un signal sinusoïdal auquel on a ajouté un bruit gaussien.
Fichier sgn_sat.m
hold off % les limites du signal u_min = 0; u_max = 10; % signal sinusoïdal bruité t = 0:100; % bruit graussien centré et d'écart type 3 bruit = 3*randn (size(t)); u = 15*sin (0.1*t) + bruit; % la saturation sgn = sature2 (u, u_min, u_max); % signal non saturé plot (t,u); hold on title ('signal saturé et d''origine') xlabel ('temps') % signal saturé plot (t, sgn, 'r') % modification des échelles des axes axis ([0 100 -20 20]) grid

Exemple 2:
Le script suivant génère un signal sinusoïdal sin (k x) avec une valeur k dépendant du signal de x, soit k = 1 pour des valeurs négatives de la variable x et k = 4 dans le cas contraire.
Fichier sinus2.m
% domaine des variations de la fonction x = -4*pi : pi/100 : 4*pi; % y = sin(x) si x <= 0, et y = sin(4x) si x > 0 y = sin(x) .* (x <= 0) + sin(4*x) .* (x > 0); % On trace ensuite la courbe y = f(x) plot (x, y) grid xlabel ('x') ylabel ('y') title ('y = sin(x) si x<=0, et y = sin(4x) si x>0')
La figure suivante montre que le sinusoïde possède une fréquence 4 fois plus grande lorsque l’abscisse x devient positive.
Exemple 3:
La fonction possède une valeur indéterminée en x = 0, alors qu’elle vaut 1 lorsqu’on lève l’indétermination.
Afin de forcer sa valeur 1 lorsque x vaut zéro, on utilise l’expression logique (x==0) qui vaut 1 lorsque x est nul et 0 partout d’ailleurs.
fichier sin_card.m
% tracé de la fonction sinus cardinal % domaine des valeurs de la variable x x = -4*pi : pi/100 : 4*pi; % valeurs de la fonction y = (x==0) + sin(x)./ (x + (x==0)); % tracé de la fonction sinus cardinal plot (x,y) grid title ('sinus cardinal y = sin (x)/x')