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
Signal saturé et d »origine

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.

sinus2

Exemple 3:

La fonction sinuspossè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')

sin_card