Académique Documents
Professionnel Documents
Culture Documents
Environnement MATLAB
Antoine Bertout
2020–2021
1 / 42
Objectifs du jour
2 / 42
Écosystèmes de MATLAB et Python
EDIs
Pyzo, jupyter notebook,
Spyder,etc.
Noyau de MATLAB
Noyau de Python
- EDI
- langage
- langage
de programmation
de programmation
- interpréteur
- interpréteur
- bibliothèque
- large bibliothèque
standard réduite
standard
- éditeur d'interface
graphique Numpy Matplotlib
Etc.
3 / 42
MATLAB vs Python
4 / 42
Interface MATLAB
Dans la même fenêtre, on retrouve :
un interpréteur nommé Command Window
>> 8 + 5
ans = 13
>> sqrt(5)
ans = 2.2361
>> sqrt = 3
>> sqrt(4) Index exceeds matrix dimensions.
5 / 42
Variables et types
6 / 42
Typage
7 / 42
Matrices
mat = [1 3 5 7 9]
mat = [1, 3, 5, 7, 9] %
mat = [1:2:9] % début:pas:fin
mat = [1 3 5 ; 7 9 11]
Concaténation
a = [6 7]
b = [4 5 a]
c = [4 5;b]
8 / 42
Matrices : indiçage et assignation
Attention
Avec MATLAB et contrairement à Python les indices ne commencent
pas à 0 mais à 1 et l’indiçage se fait avec les parenthèses et non les
crochets.
9 / 42
Matrices : indiçage et assignation
Assignation
a(:,1) = 99
a(:,1) = [99 98 97]
a(a>98) = 5 %seuil
Logical
a > 98 produit une matrice de type logical et non un double !
10 / 42
Matrices : indiçage et assignation
Assignation
a(:,1) = 99
a(:,1) = [99 98 97]
a(a>98) = 5 %seuil
Logical
a > 98 produit une matrice de type logical et non un double !
10 / 42
Bornes
Vérification des bornes
Comme Python, MATLAB déclenche une erreur lorsque vous essayez
de lire des cellules en dehors des bornes d’une matrice.
a = [5 9 10 9]
>> v = a(5)
Index exceeds matrix dimensions.
>> a(-1)
Subscript indices must either be real positive integers...
Extensibilité
Bien que ça ne soit généralement pas conseillé, et contrairement à
Python, MATLAB autorise d’assigner une valeur dans une cellule qui
n’existe pas et étend automatiquement la matrice.
>> a(5) = 3
a = 5 9 10 9 3
>> a(10) = 1
a = 5 9 10 9 3 0 0 0 0 1
11 / 42
Sémantique des assignations
Attention
Dans MATLAB, les structures de données sont passées par valeur et
non par par référence comme en Python. Les ”slices” copient les
parties des tableaux.
MATLAB Python
12 / 42
Concision des opérations matricielles
Exemple : Effet miroir sur une image
MATLAB
A = imread('arles.png');
B = A(:,end:-1:1,:);
image(B);
Python
im = load_image("arles.png")
im2 = im.copy()
for i in range(im2.size[1]):
for j in range(im2.size[0]):
r, v, b = im.getpixel((i, im.size[0]-1-j)
im2.putpixel((i, j)), (r, v, b))
plt.imshow(image)
plt.show() 13 / 42
Structures de contrôles : Boucles
Factorielle en boucle
Boucle for :
nmax = 5;
for n = 1:nmax
nFact = nFact * n
end
15 / 42
Structures de contrôles
Affectation après...
Contrairement à Python, il n’est pas possible d’utiliser les opérateurs
d’affectation après addition (+=), multiplication(*=), etc. tel que
nFactorial *= n.
Conditions
Affichage
La fonction disp est l’équivalent du print. Le plus simple pour
afficher le résultat d’un calcul c’est d’omettre le point virgule à la fin
de l’instruction.
16 / 42
Structures de contrôles
method = 'secant';
switch method
case 'dicho'
disp('Method convergence is linear')
case {'newton','brent'}
disp('Method convergence is quadratic')
otherwise
disp('Unknown method.')
end
17 / 42
Opérateurs logiques
MATLAB Python signification
| | OU logique
& & ET logique
~ not NON logique
&& and ET logique court-circuit
|| or OU logique court-circuit
etc.
l’évaluation de 0 && n’importe quoi est court-circuitée en 0 (faux).
l’évaluation de 1 || n’importe quoi est court-circuitée en 1 (vrai).
Efficacité
Pour évaluer des conditions dans vos structures de contrôles, vous
devez utiliser des structures de type court-circuit.
>> u = [0 0 1 1 0 1];
>> v = [0 1 1 0 0 1];
>> u | v
ans = 0 1 1 1 0 1
>> if 1 || 0
ans = 1
18 / 42
Opérateurs matriciels
On retrouve les opérateurs usuelles + - * etc., cependant,
Vocabulaire
L’extension des fichiers MATLAB est .m (quand Python c’est .py),
par défaut un fichier MATLAB est un script.
Une fonction MATLAB correspond à une fonction ou une
procédure, comme en Python. Dans la version de MATLAB utilisée
en cours, il est obligatoire de définir une fonction dans un fichier
.m à part du même nom.
La syntaxe est
function [y1,...,yN] = myfun(x1,...,xM) où myfun
est le nom de la fonction, les yi les sorties (encapsulées dans un
vecteur) et les xi les entrées.
Les fonctions anonymes adaptées à l’écriture de fonctions
simples (comme les fonctions au sens mathématique) tel que
sqr = @(x) x.^2
>> sqr(5)%ans = 25
20 / 42
Fonctions
Exemple de fonction classique
Approximation
de π par la formule de Leibniz :
π ≈ 4 × 1 − 3 + 15 − 17 · · · ± 2n+1
1 1
.
22 / 42
Représentation mémoire
Column-major order
Bien qu’il s’agisse de structures de données en deux dimensions
logiques, les matrices en MATLAB sont en fait représentées en interne
en une dimension, linéarisées, colonne par colonne.1
8 1 6
La matrice est stockée en mémoire comme un vecteur
3 5 7
colonne
8 Ouf !
3
1 La plupart du temps vous n’aurez pas à vous en
5 soucier mais il faut le garder à l’esprit. Par
6 exemple, lorsque vous aplatissez une matrice
avec l’opérateur :
7
x = 0:pi/10:2*pi; 1.5
y1 = 2*sin(x); 1
y2 = sin(2*x); 0.5
y3 = sin(x+0.5); 0
-0.5
plot(x,y1,'g',x,y2,'bo') -1
plot(x,y3,'r--') -2
0 1 2 3 4 5 6 7
subplot(2,2,1)
x = linspace(0,10);
y1 = sin(x);
plot(x,y1)
title('Subplot 1: sin(x)') 1
Subplot 1: sin(x)
1
Subplot 2: sin(2x)
0.5 0.5
subplot(2,2,2) 0 0
plot(x,y2) -1 -1
0 5 10 0 5 10
title('Subplot 2: sin(2x)')
Subplot 3: sin(4x) Subplot 4: sin(8x)
1 1
0.5 0.5
subplot(2,2,3)
0 0
y3 = sin(4*x);
-0.5 -0.5
plot(x,y3)
-1 -1
title('Subplot 3: sin(4x)') 0 5 10 0 5 10
subplot(2,2,4)
y4 = sin(8*x);
plot(x,y4)
title('Subplot 4: sin(8x)') 25 / 42
Pré-allocations
Pour initialiser un vecteur (liste) de taille n avec des zéros en Python,
vous écrivez généralement :
malist = []
for i in range(n):
malist.append(0)
malist = 0 %optionnel...
for i=1:n
malist(i) = 0
end
Avec MATLAB
Créer des vecteurs de grande taille par ajout à la fin (append) est
très inefficace,
et compliqué à étendre à des dimensions supérieures.
26 / 42
Pré-allocations
Les commandes zeros et ones sont très utiles pour créer des
matrices.
A = zeros(20, 10)
A = 4 * ones(1, 10)
>>A = zeros(2)
A =
0 0
0 0
28 / 42
Vectorisation
z = x 2 sin y
for i = 1: m
for j = 1: n
z(i,j) = x(i,j)^2*sin(y(i,j)); z = x .^2 .* sin (y)
end
end
function y=f1(x)
n=length(x);
for i=1:n
if x(i)<0
y(i)=5;
elseif x(i)<1
y(i)=x(i);
elseif x(i)<=2
y(i)=2-x(i);
else
y(i)=3;
endif
end
Comment reconnaître ?
Le nom de la variable apparaît des deux côtés
Opération élément par élément
31 / 42
Optimisation
Opérations sur place
x = rand(6000);y = rand(6000);
% Sur place
x = sin(sqrt(3*x.^6+2*x+3));
% A emporter
z = sin(sqrt(3*x.^6+2*x+3));
32 / 42
Optimisation
Opérations sur place
x = rand(6000);y = rand(6000);
% Sur place
x = sin(sqrt(3*x.^6+2*x+3));
% A emporter
z = sin(sqrt(3*x.^6+2*x+3));
Compromis
A n’utiliser que lorsque vous manipuler de grandes matrices et que
vous avez des soucis de performances car peut nuire à la lisibilité du
code et au débogage.
32 / 42
Conclusion
Économies
Il y a beaucoup de choses à faire avant d’acheter une machine plus
puissante !
33 / 42
Exercice 1
34 / 42
Correction
carre = magic(1000);
a = carre;
tic
for i=1:size(a,1)
for j=1:size(a,2)
if a(i,j) > 4
a(i,j) = -a(i,j);
end
end
end
toc
b = carre;
tic
b(b>4) = -b(b>4); % version vectorisée
toc
isequal(a,b)
36 / 42
Exercice 2
Schéma de Ruffini-Horner
La méthode de Ruffini-Horner propose une notation alternative du
polynôme, mathématiquement équivalente :
p(x) = ((((an x) + an−1 )x + · · · a1 )x) + a0 .
37 / 42
Correction
p = randi(10,10,1)';
x = randi(15,1,1);
tic
%version naive en O(n^2) (n(n+1)/2)
eval_naive = 0;
for i = 1:length(p)
l = 1;
for j = length(p)-i:-1:1
l = l * x;
end
eval_naive = eval_naive + p(i)*l;
end
toc
tic
%version naive vectorisée
n = length(p)-1:-1:0;
eval_vec = sum((x.^n).*p);
toc
38 / 42
Correction
tic
%Ruffini-Horner en O(n)
eval_horner = p(1);
for i=2:length(p)
eval_horner = eval_horner * x + p(i);
end
toc
tic
eval_octave = polyval(p,x);
toc
fonction polyval
La méthode polyval de MATLAB implémente le schéma de
Ruffini-Horner pour l’évaluation d’un polynôme.
39 / 42
Exercice 3
40 / 42
Correction
n = 3;m = 4;
d = zeros(n,m);
a = randi([1 30],n,m)
b = randi([1 30],n,m)
c = randi([0 1], n,m)
Soit la formule
d’approximation de π de Leibniz :
1 1 1 1
π ≈ 4 × 1 − 3 + 5 − 7 · · · ± 2n+1
42 / 42
Exercice 4
Soit la formule
d’approximation de π de Leibniz :
1 1 1 1
π ≈ 4 × 1 − 3 + 5 − 7 · · · ± 2n+1
42 / 42