CFN - MATLAB
• format long/short/eps/hex/... : afficher les nombres de façon différente (plus ou moins de
décimales, notation scientifique...)
• En MATLAB, tout est vecteur, même les "entiers".
◦ Vecteur ligne : l = [1 2 3]
◦ Colonne : c = [1;2;3]
◦ v = [1:0.3:10] = 1:0.3:10 = valeurs de 1 à 10 avec un step de 0.3 . Syntaxe : start:step:stop
◦ b = linspace(1, 10, 5) : 5 valeurs identiquement espacées de 1 à 10.
◦ Transposition de matrice : opérateur ' ( l = l' )
◦ c = ([Link])' : créé un vecteur colonne d'éléments de 5 à 9 avec un spacing de 2 , le tout en une
seule commande. Les parenthèses spécifient l'ordre des opérations.
[Link]' fonctionne aussi dans ce cas.
• Génération de matrices
◦ x = rand(5) : génération d'une matrice 5x5 de nombres aléatoires (valeurs entre 0 et 1)
Cas général, pour une matrice row * col : mat = rand(row, col)
◦ Matrices de 1 ou de 0 : ones(row, col) et zeros(row, col)
◦ Taille : size(x) . Longueur : length(x) . Créer une matrice aléatoire d'une même taille qu'une
existante : rand(size(x))
▪
x = rand(1, 10); % mat. 1x10 (liste de 10 éléments)
[h, w] = size(x); % size() renvoie deux valeurs, donc pour en avoir une précise il
faut un vecteur
◦ Concaténation de matrices
▪ Avec c une matrice 4x4 générée par c = rand(4) , et eye la matrice identité
• Indexage
◦ On commence à compter à partir de 1 (contrairement à la plupart des langages de programmation).
◦ Chercher un élément : mat(x, y) .
1/6
◦ Slicing : vec(2:4) . Exemple d'opération avancée sur le slicing :
▪ Supposons qu'on veuille calculer des sommes partielles, c'est à dire un ensemble de sommes en
excluant chaque élément tour à tour. Par exemple, pour l'ensemble {2, 3, 4}, on calculerait 2 ∗
3, 2 ∗ 4, 3 ∗ 4.
▪
% version "naïve", sans réel slicing
x = rand(1, 10);
[h, w] = size(x);
Pk = zeros(h, w);
for i = 1:w
Pk(i) = sum(x(1:i-1)) + sum(x(i+1:end));
end
Pk
%version avec slicing
X = [2, 3, 4, 5];
n = length(X);
P = zeros(1, n); % Initialisation d'un vecteur de résultats
for k = 1:n
P(k) = prod(X([1:k-1, k+1:end])); % Produit sans X(k)
end
disp(P);
◦ Prendre le dernier élément : vec(end) . Prendre le plus grand : max(x) .
▪ Prendre le plus grand et son index correspondant : [vMax,ivMax] = max(v2)
◦ Aller chercher toute une ligne : mat(1, :) , le : signifie "tout" quand il est écrit seul.
◦ Si on utilise un seul indice pour accéder à un élément dans une matrice, MATLAB va parcourir chaque
colonne, et quand il a fini une colonne il passe à la ligne suivante.
A = [5 6; 7 8]
A(3) -> 6.
Extraire plusieurs indices : vect([1 3 6]) ( [1 3 6] en tant qu'index)
• Opérations sur les arrays
◦ x = [1 2 3];
y = x + 2;
y = 3 4 5
◦ Note : deux arrays peuvent être additionnés s'il font la même taille.
◦ Arrondir à l'entier : x = round(y)
◦ Multiplication de matrices : z = [3 4] * [10 20] -> Error using * (car on ne peut multiplier
que des matrices de taille n * p et p * n ).
2/6
◦ Produit cartésien (dot product) : z = [3 4] .* [10 20]
▪ x = [1 2; 3 4; 5 6; 7 8].*[1;2;3;4] -> chaque ligne de la première matrice est multipliée.
▪ En général, pour faire des opérations élément par élément, on utilise le . avant l'opérande.
◦ Pour trouver le nombre de colonnes et de lignes d'une matrice, plutôt que de faire :
▪
dr = size(data(:, 1))
dr = dr(1)
dc = size(data(1, :))
dc = dc(2)
▪ On peut simplement faire : [dr,dc] = size(data)
◦ Ignorer un output : ~ (par exemple : [~,xcol] = size(x) renvoie juste le nombre de colonnes de
x )
◦ Pas hésiter à voir la documentation, ici randipar exemple
• Plotting : afficher des graphiques
◦ Forme générale : plot(v1, v2, *args) , avec args des arguments pour styliser le graphique.
◦ Par exemple : plot(sample, v1, "r-o", LineWidth=4) .
r-o veut dire "couleur rouge - ligne continue ( - ), points à chaque donnée ( o ).
▪ Pour des lignes en pointillés, on utilisera -- , pour des étoiles à la place des points, on utilisera *
...
Les possibilités ne manquent pas, c.f la documentation.
▪ Si on plot un seul graphique ( plot(v1) ), les valeurs de 1 à sa longueur seront sur l'axe x.
▪ hold on affichera tous les plots suivants sur les axes déjà présents, hold off arrête cet effet.
◦ Annotations de plot
3/6
▪
title("Sample Mass")
ylabel("Mass (g)")
legend("Exp A", "Exp B")
bar(data(3,:))
title("Sample " + sample(3) + " Data")
▪ Les deux dernières lignes donnent :
• Conditions et booléens
◦ 1 = True , 0 = False . L'équivalent de != est ~= .
◦ AND et OR sont & et | .
◦
[5 10 15] > 12
ans = 0 0 1
◦
v = v1(v1 > 6) % extraire les éléments d'un array qui respectent une condition donnée
v =
6.6678
9.0698
% note : pas forcément nécessaire que l'array "dans la condition" soit le même que
l'array modifié
◦
x(x==999) = 1 % remplace tous les 999 dans x par des 1
x = v1(v1>6 | v1<2) % trouver des valeurs plus grandes que 6 ou plus petites que 2
◦ if - elseif - else - end
4/6
▪
▪ Rien à rajouter, si ce n'est que ça ressemble à la syntaxe usuelle en Python et qu'on peut
évidemment utiliser les AND et OR vus un peu plus tôt.
• Boucles for (les while suivent exactement la même logique)
◦
hold on
for idx = 1:10
plot(idx,density(idx),"*")
drawnow
end
hold off
• Fonctions
◦ Supposons qu'on veuille écrire une fonction pour faire des opérations de base sur des matrices. On
aurait ceci :
◦
function ex5(A, B)
disp(’Somme :’);
C = A+B;
disp(C);
disp(’Différence :’);
A-B
disp(’Produit :’);
5/6
A*B
end
◦ Cette fonction ne renvoie rien. Comment renvoyer des choses alors ?
▪
function sol = second_degre(a, b, c)
% sol agira comme une "valeur de retour"
delta = b^2 - 4 * a * c;
if delta < 0
disp("Delta négatif, pas de solution réelle");
sol = [];
else
rac1 = (-b + sqrt(delta)) / (2 * a);
rac2 = (-b - sqrt(delta)) / (2 * a);
sol = [rac1, rac2];
end
end
%appeler la fonction : truc = second_degre(1, 2, 3)
% Exemple d'application sur plusieurs triplets
coeffs = [1, -3, 2; 1, -2, 1; 2, 4, 1]; % Matrice de coefficients (a, b, c)
solutions = [];
for i = 1:size(coeffs, 1)
a = coeffs(i, 1);
b = coeffs(i, 2);
c = coeffs(i, 3);
sol = second_degre(a, b, c);
solutions = [solutions; sol]; % Stocke les résultats dans une matrice
end
disp(solutions)
6/6