Skip to content

MATLAB Aide-mémoire

Environnement de calcul numérique pour l'ingénierie et la science.

01

Matrices & opérations de base

Création de matrices & vecteurs

MATLAB (MATrix LABoratory) traite toutes les variables comme des matrices. Les vecteurs sont des matrices 1xN ou Nx1. Utilisez des espaces ou des virgules pour séparer les éléments d'une ligne, des points-virgules pour les nouvelles lignes. zeros, ones, eye, rand et magic créent des matrices de test courantes. L'opérateur deux-points start:step:stop génère des intervalles (pas par défaut 1). linspace(a, b, n) crée n points uniformément espacés — idéal pour les axes de tracé.

matlab
% row vector
v = [1 2 3 4 5];

% column vector (semicolon = new row)
c = [1; 2; 3];

% 3x3 matrix
A = [1 2 3; 4 5 6; 7 8 9];

% special matrices
Z = zeros(3);          % 3x3 zeros
O = ones(2, 4);        % 2x4 ones
I = eye(3);            % 3x3 identity
R = rand(2, 3);        % 2x3 uniform random
N = randn(4);          % 4x4 normal random
M = magic(4);          % 4x4 magic square
D = diag([1 2 3]);     % diagonal matrix

% linear spacing
l = linspace(0, 1, 5); % [0 0.25 0.5 0.75 1]
r = 0:0.5:2;           % [0 0.5 1 1.5 2]

Indexation & slicing de matrices

MATLAB est indexé à partir de 1 (pas 0). Les deux-points : signifient 'tous' — A(:,2) est toute la deuxième colonne. A(1:3, :) sélectionne les lignes 1-3. 'end' fait référence au dernier indice dans cette dimension. L'indexation logique (A(A > 5)) est extrêmement puissante — elle extrait ou modifie les éléments correspondant à une condition. find retourne les indices des éléments non nuls/vrais, et avec deux sorties donne ligne et colonne séparément.

matlab
A = magic(4);          % 4x4 magic square

% single element (1-indexed!)
A(2, 3)                % row 2, col 3

% entire row or column
A(1, :)                % first row (all columns)
A(:, 2)                % second column (all rows)

% submatrix
A(1:2, 2:4)            % rows 1-2, cols 2-4

% linear indexing (column-major)
A(5)                   % 5th element counting down columns

% end keyword
A(end, :)              % last row
A(:, end-1)            % second-to-last column

% logical indexing
A(A > 10)              % all elements > 10 (as vector)
A(A > 10) = 0;         % set large elements to 0

% find indices
[r, c] = find(A == 16) % row and col of value 16

Arithmétique matricielle

Le point avant un opérateur (.*) le rend élément par élément au lieu de matriciel — c'est la source n°1 de bugs chez les débutants. A*B est la multiplication matricielle ; A.*B multiplie les éléments correspondants. L'opérateur antislash (\) résout les systèmes linéaires efficacement et précisément (décomposition LU) — préférez toujours x = A\b à inv(A)*b. L'apostrophe (') transpose ; pour les matrices complexes utilisez .' pour la transposée non conjuguée.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% matrix operations
C = A + B;             % addition
D = A - B;             % subtraction
E = A * B;             % matrix multiplication
F = A';                % transpose
G = A^2;               % matrix power (A * A)

% element-wise operations (use the dot!)
H = A .* B;            % element-wise multiply
I = A ./ B;            % element-wise divide
J = A .^ 2;            % element-wise power
K = 2 * A;             % scalar multiply

% matrix functions
det(A)                 % determinant
inv(A)                 % inverse
pinv(A)                % pseudo-inverse
rank(A)                % rank
trace(A)               % trace (sum of diagonal)

% solving linear systems Ax = b
b = [5; 11];
x = A \ b;              % left division: solves A*x = b
x = inv(A) * b;        % equivalent but slower

Manipulation de matrices

La concaténation avec [A B] (espaces) joint horizontalement ; [A; B] (points-virgules) joint verticalement — reflétant la syntaxe de création de lignes. reshape remplit en colonne-major (vers le bas puis vers la droite). flipud/fliplr/rot90 réorientent les matrices. repmat dispose une matrice en grille. Définir une ligne ou colonne à [] la supprime. size retourne les dimensions, length retourne la plus grande dimension, numel retourne le nombre total d'éléments.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% concatenation
C = [A B];             % horizontal: [1 2 5 6; 3 4 7 8]
D = [A; B];            % vertical: 4x4

% reshape
E = reshape(1:12, 3, 4);  % 3x4 matrix from 1..12

% flip and rotate
F = flipud(A);         % flip up-down
G = fliplr(A);         % flip left-right
H = rot90(A);          % rotate 90 degrees

% repmat (tile)
I = repmat([1 2], 2, 3);  % repeat [1 2] in a 2x3 grid

% size and length
[m, n] = size(A);      % m=2, n=2
len = length(A);       % max dimension = 2
num = numel(A);        % total elements = 4

% remove rows/cols
A(2, :) = [];          % delete row 2
A(:, 1) = [];          % delete column 1

Fonctions élément par élément & vectorisation

La force de MATLAB est la vectorisation — appliquer des opérations à des tableaux entiers à la fois, ce qui s'exécute en C/Fortran optimisé en interne. sin, exp, sqrt etc. opèrent élément par élément automatiquement. sum/prod/max/min travaillent par colonne par défaut (dimension 1) ; passez la dimension 2 pour le travail par ligne. A(:) aplatit une matrice en vecteur. Préférez toujours les opérations vectorisées aux boucles for pour les performances — elles peuvent être 10 à 100 fois plus rapides.

matlab
% math functions operate element-wise
x = 0:0.1:2*pi;
y = sin(x);            % sine of each element
z = exp(x);            % exponential
w = sqrt(x);           % square root

% rounding
round(3.7)             % 4
floor(3.7)             % 3
ceil(3.2)              % 4
fix(-3.7)              % -3 (toward zero)

% sums and products along dimensions
A = magic(3);
sum(A)                 % sum of each column (row vector)
sum(A, 2)              % sum of each row (column vector)
sum(A(:))              % sum of ALL elements
prod(A)                % product of each column
cumsum(A)              % cumulative sum

% min, max, sort
[v, i] = max(A(:))     % max value and its index
sort(A, 'descend')     % sort each column descending

% AVOID loops — vectorize!
% BAD: for i=1:1000, y(i)=sin(i); end
% GOOD:
i = 1:1000;
y = sin(i);            % fast, vectorized
02

Flux de contrôle & logique

If / Elseif / Else

MATLAB utilise if/elseif/else/end (note : elseif est un seul mot). Opérateurs logiques : && (ET scalaire), || (OU scalaire), & (ET élément par élément), | (OU élément par élément), ~ (NON, pas !). Pour la comparaison de chaînes utilisez strcmp/strcmpi (insensible à la casse) — l'opérateur == ne fonctionne que pour les tableaux de caractères de même longueur. Terminez toujours les blocs par 'end'.

matlab
score = 85;

if score >= 90
    grade = 'A';
elseif score >= 80
    grade = 'B';
elseif score >= 70
    grade = 'C';
else
    grade = 'F';
end

disp(grade);  % B

% logical operators: && (and), || (or), ~ (not)
if x > 0 && x < 10
    disp('in range');
end

% compare strings with strcmp
if strcmp(name, 'Alice')
    disp('hi Alice');
end

Boucles For & While

for itère sur chaque colonne de l'expression donnée (pour les vecteurs, chaque élément). while s'exécute tant que la condition est vraie. PRÉALOUEZ TOUJOURS les tableaux avant les boucles (result = zeros(1,N)) — agrandir un tableau dans une boucle force une réallocation à chaque itération et est extrêmement lent. L'opérateur deux-points 1:5 crée [1 2 3 4 5]. fprintf imprime une sortie formatée (comme printf du C).

matlab
% for loop over a range
for i = 1:5
    fprintf('i = %d\n', i);
end

% iterate over a vector
v = [10 20 30];
for val = v
    disp(val);
end

% nested loop over a matrix
A = zeros(3, 3);
for r = 1:3
    for c = 1:3
        A(r, c) = r * c;
    end
end

% while loop
n = 10;
while n > 1
    n = n / 2;
    fprintf('%.2f\n', n);
end

% preallocate for speed (IMPORTANT!)
result = zeros(1, 1000);
for i = 1:1000
    result(i) = i^2;
end

Switch & Break/Continue

switch fait correspondre une valeur à des étiquettes case — pas de break nécessaire (contrairement à C/Java). case peut prendre un cell array pour plusieurs valeurs. otherwise est le défaut. break quitte la boucle la plus interne ; continue passe à l'itération suivante. try/catch gère les erreurs proprement ; ME est un objet MException avec .message et .identifier. MATLAB n'a pas d'opérateur ternaire — utilisez if/else ou des fonctions inline.

matlab
% switch statement
method = 'linear';
switch method
    case 'linear'
        disp('using linear');
    case 'cubic'
        disp('using cubic');
    case {'nearest', 'spline'}
        disp('using nearest or spline');
    otherwise
        disp('unknown method');
end

% break and continue
for i = 1:10
    if i == 5
        break        % exit the loop entirely
    end
    if mod(i, 2) == 0
        continue     % skip to next iteration
    end
    disp(i);         % prints 1 3
end

% try-catch for error handling
try
    x = 1 / 0;       % may error
catch ME
    fprintf('Error: %s\n', ME.message);
end

Opérations logiques & indexation

L'indexation logique est la fonctionnalité phare de MATLAB — A(condition) sélectionne les éléments où le tableau logique est vrai. ~= signifie 'différent de' (pas !=). & et | sont élément par élément ; && et || sont à court-circuit (scalaires uniquement, préférés dans les conditions if). find retourne les indices linéaires des valeurs vraies. any/all testent si un/tous les éléments sont vrais, optionnellement selon une dimension. La famille is* teste les types et valeurs spéciales (NaN, Inf).

matlab
A = [1 2 3 4 5 6 7 8 9 10];

% comparison operators
A > 5                  % logical array
A == 5
A ~= 5                 % not equal (NOT !=)
A >= 3 & A <= 7        % element-wise AND
A < 3 | A > 7          % element-wise OR

% logical indexing (powerful!)
A(A > 5)               % [6 7 8 9 10]
A(A > 5) = 0;          % set elements > 5 to 0
A(mod(A, 2) == 0)      % even numbers

% find indices
idx = find(A > 5);     % indices of elements > 5
[r, c] = find(A > 5);  % row and col (for matrices)

% any and all
any(A > 5)             % true if ANY element > 5
all(A > 0)             % true if ALL elements > 0
any(A > 5, 2)          % per row

% is functions
isnan(x); isinf(x); isfinite(x);
isnumeric(x); ischar(x); iscell(x);

Chaînes & formatage

MATLAB a deux types de chaînes : char arrays ('text', hérité) et string scalars ("text", R2017+). Les string scalars sont plus flexibles pour la manipulation. sprintf retourne une chaîne formatée ; fprintf imprime vers la console ou un fichier. Spécificateurs de format courants : %s (chaîne), %d (entier), %f (flottant), %.2f (2 décimales), %e (scientifique). strsplit/strjoin gèrent les listes délimitées. num2str/mat2str convertissent les nombres en chaînes.

matlab
% string creation
s1 = 'Hello';          % char array
s2 = "World";          % string scalar (R2017+)

% concatenation
greeting = [s1 ', ' s2 '!'];  % char array concat
full = s1 + " " + s2;          % string concat

% formatting
name = 'Alice';
age = 30;
fprintf('Name: %s, Age: %d\n', name, age);
str = sprintf('Pi is %.2f', pi);  % returns string

% common string functions
upper('hello')         % HELLO
lower('WORLD')         % world
strlength("hello")     % 5 (string)
length('hello')        % 5 (char array)
strcmp('a', 'a')       % true
strfind('hello', 'll') % 3 (index)
strrep('cat', 'c', 'b') % bat
strsplit('a,b,c', ',') % {'a','b','c'}
strjoin({'a','b'}, '-') % a-b
num2str(42)             % '42'
03

Fonctions & scripts

Définition de fonction

Les fonctions doivent être dans un fichier du même nom (add.m pour la fonction add), ou à la fin d'un fichier script. La première ligne est la déclaration de fonction. Les fonctions ont leur propre workspace (séparé du workspace de base). nargin/nargout vous permettent de gérer les arguments optionnels — nargin compte les entrées réelles. Les sorties multiples sont capturées avec [a, b] = func(). Si vous appelez avec moins de sorties, les supplémentaires sont ignorées.

matlab
% function in a file named 'add.m'
function result = add(a, b)
    % ADD returns the sum of a and b
    result = a + b;
end

% with multiple inputs and outputs
function [mn, mx, avg] = stats(v)
    mn = min(v);
    mx = max(v);
    avg = mean(v);
end

% calling functions
s = add(3, 4);              % 7
[lo, hi, mu] = stats([1 2 3 4 5]);

% capture only first output
minimum = stats([1 2 3]);   % gets mn only

% nargin and nargout (number of args)
function y = power(x, n)
    if nargin < 2
        n = 2;              % default value
    end
    y = x .^ n;
end

Fonctions anonymes & inline

Les fonctions anonymes (@(args) expr) sont des fonctions rapides d'une ligne définies inline — parfaites pour passer à des solveurs (fzero, integral, ode45) sans créer de fichiers. Elles capturent les variables du workspace au moment de la création. Les function handles (@sin) vous permettent de passer des fonctions intégrées ou utilisateur comme arguments. C'est essentiel pour le calcul numérique : integral(@(x) f(x), a, b) intègre toute fonction que vous définissez.

matlab
% anonymous function (one-liner, no file needed)
square = @(x) x .^ 2;
square(5)              % 25
square([1 2 3])        % [1 4 9]

% with multiple inputs
add = @(a, b) a + b;
add(3, 4)              % 7

% capture variables from workspace
c = 10;
addc = @(x) x + c;
addc(5)                % 15

% function handle to built-in
f = @sin;
f(pi/2)                % 1

% pass functions as arguments
result = integral(@(x) x.^2, 0, 1);  % integrate x^2 from 0 to 1
result = fzero(@(x) x^2 - 2, 1);     % find root near 1

% array of function handles
funs = {@sin, @cos, @tan};
funs{1}(0)             % 0

Scripts & Live Scripts

Les scripts sont des séquences de commandes qui s'exécutent dans le workspace de base (contrairement aux fonctions, qui ont des workspaces isolés). Le marqueur %% crée des 'cellules' (sections) que vous pouvez exécuter indépendamment avec Ctrl+Entrée — idéal pour le développement incrémental. Les Live Scripts (.mlx) sont comme des notebooks Jupyter : ils combinent code, texte formaté, équations et tracés intégrés dans un document interactif. Préférez les fonctions aux scripts pour le code réutilisable.

matlab
% A script is just a sequence of commands in a .m file
% It shares the base workspace

% script: analyze_data.m
data = load('data.mat');
cleaned = data.values(data.values > 0);
mean_val = mean(cleaned);
fprintf('Mean: %.2f\n', mean_val);
plot(cleaned);
title('Cleaned Data');

% sections (cells) with %%
%% Initialize
x = linspace(0, 2*pi, 100);

%% Plot
plot(x, sin(x));

%% Analyze
disp(mean(sin(x)));

% Run a section: Ctrl+Enter (in editor)
% Live Scripts (.mlx): rich text, inline plots, equations

Fonctions imbriquées & locales

Les scripts peuvent contenir des fonctions locales à la fin du fichier (depuis R2016b) — elles ne sont visibles que dans ce fichier. Les fonctions imbriquées (définies à l'intérieur d'une autre fonction) partagent le workspace du parent, elles peuvent donc lire et modifier ses variables — utiles pour les callbacks et accumulateurs mais peuvent rendre le code plus difficile à suivre. Les fonctions locales dans les fichiers de fonction sont des assistants visibles uniquement dans ce fichier. Utilisez les fonctions locales pour garder les scripts organisés sans créer de nombreux fichiers.

matlab
% local functions in a script (must be at the end)
% main_script.m
x = 1:10;
y = process(x);
disp(y);

function r = process(v)
    r = normalize(scale(v));  % calls another local function
end

function s = scale(v)
    s = v * 10;
end

function n = normalize(v)
    n = v / max(v);
end

% nested function (inside another function)
function outer(x)
    y = 0;
    function inner()
        y = y + x;    % can access outer's variables
    end
    inner();
    disp(y);
end

Portée des variables & global

MATLAB passe les arguments par valeur (copy-on-modify), donc les fonctions ne peuvent pas accidentellement modifier les variables de l'appelant — contrairement à C/Python. Utilisez global pour un état vraiment partagé (déclarez-le dans chaque fonction qui l'utilise), mais préférez passer des arguments. Les variables persistent conservent leur valeur entre les appels de fonction (comme static en C) — utiles pour les compteurs, caches ou mémoïsation. Initialisez les variables persistent avec une vérification isempty au premier appel. Évitez les globals au profit des retours de fonction ou des fonctions imbriquées.

matlab
% base workspace variables
x = 10;

% functions have their OWN workspace
function y = myfunc()
    % x is NOT accessible here
    y = 5;
end

% pass by value (modifications don't affect caller)
function y = modify(v)
    v = v * 2;        % local copy
    y = v;
end
a = 5;
b = modify(a);        % b=10, a still 5

% global variables (use sparingly!)
global COUNTER
COUNTER = 0;
function increment()
    global COUNTER
    COUNTER = COUNTER + 1;
end

% persistent variables (like static in C)
function counter()
    persistent count
    if isempty(count)
        count = 0;
    end
    count = count + 1;
    disp(count);
end
04

Structures de données

Cell arrays

Les cell arrays sont les conteneurs de MATLAB pour les données de types mixtes (comme les lists Python). Utilisez les accolades {} pour accéder au CONTENU d'une cellule, et les parenthèses () pour obtenir une cellule (utile pour le slicing). Cette distinction est cruciale : c{1} donne la chaîne ; c(1) donne une cellule contenant la chaîne. Les cells sont essentiels pour gérer des chaînes de longueurs différentes, des matrices de taille variable et des données irrégulières. num2cell/mat2cell convertissent entre tableaux numériques et cells.

matlab
% cell arrays hold mixed data types
c = {'Alice', 30, [1 2 3], magic(2)};

% access with {} (content) vs () (cell)
c{1}                  % 'Alice' (the string itself)
c(1)                  % {'Alice'} (a 1x1 cell)
c{3}(2)               % 2 (second element of third cell)

% modify and append
c{2} = 31;
c{end+1} = 'new';     % append
c{5} = 'skip';        % auto-fills gaps with []

% multi-dimensional cell array
c2 = {'a', 'b'; 'c', 'd'};  % 2x2 cell

% iterate over cells
for i = 1:numel(c)
    disp(c{i});
end

% convert: cell2mat, mat2cell, num2cell
nums = num2cell(1:5);  % {1, 2, 3, 4, 5}

Structs & Tables

Les structs regroupent des données associées avec des champs nommés — comme des objets sans méthodes. Les Tables (R2013+) sont l'équivalent MATLAB des dataframes : orientées colonnes, avec des variables nommées et des noms de lignes. Les tables sont idéales pour les données CSV/Excel. Accédez aux colonnes par nom (T.ages) ou par index. L'indexation logique fonctionne sur les lignes : T(T.age > 25, :) filtre les lignes. summary() donne des statistiques pour chaque colonne. Les tables s'intègrent avec readtable/writetable pour les E/S de données.

matlab
% struct: named fields with any data
user.name = 'Alice';
user.age = 30;
user.scores = [90 85 88];
disp(user.name);      % Alice

% struct constructor
s = struct('name', 'Bob', 'age', 25, 'active', true);

% array of structs
users(1) = struct('name', 'Alice', 'age', 30);
users(2) = struct('name', 'Bob', 'age', 25);
disp(users(2).name);  % Bob

% table (like a dataframe) — great for tabular data
names = {'Alice'; 'Bob'; 'Carol'};
ages = [30; 25; 28];
scores = [90; 85; 88];
T = table(names, ages, scores);

% access table columns
T.ages               % column as array
T(:, 2)              % column as table
T(1:2, :)            % first 2 rows
T.age > 26           % logical indexing
T(T.age > 26, :)     % rows where age > 26

% summary statistics
summary(T)

Tableaux de chaînes & gestion des char

Le MATLAB moderne (R2017+) préfère les string arrays ("text") aux char arrays ('text'). Les string arrays supportent les opérations vectorisées : strlength, +, split, join, contains, matches, replace fonctionnent tous élément par élément. Les char arrays sont encore courants dans le code ancien et nécessaires pour certaines fonctions. Utilisez les string arrays pour les collections de texte ; ils gèrent naturellement les différentes longueurs (contrairement aux char arrays qui nécessitent du padding ou des cells).

matlab
% string array (R2017+) — recommended for text
names = ["Alice", "Bob", "Carol"];
names(1)              % "Alice"
names'                % column string array
strlength(names)      % [5 3 5]

% char array (legacy)
c = 'Hello World';
c(1:5)                % 'Hello'
size(c)               % [1 11]

% cell array of char vectors (legacy mixed-length)
old = {'Alice', 'Bob', 'Carol'};

% convert between types
s = string('hello');          % char -> string
c = char("hello");            % string -> char
cellarr = cellstr(names);     % string array -> cell of char

% combine and split
full = "Alice" + " " + "Smith";  % "Alice Smith"
parts = split("a,b,c", ",");     % ["a", "b", "c"]
joined = join(["a" "b" "c"], "-"); % "a-b-c"

% pattern matching
matches(names, 'A*')  % logical: [true false false]
contains(names, 'li') % [true false false]
replace("hello", 'l', 'L')  % "heLLo"

Containers.Map & Sets

containers.Map est le dictionnaire clé-valeur de MATLAB (hash map) — utile pour les tables de correspondance et la configuration. Les clés peuvent être des chaînes ou des nombres. isKey vérifie l'existence ; keys/values récupèrent tout. Les opérations ensemblistes (union, intersect, setdiff, setxor, ismember) fonctionnent sur les tableaux numériques et les cell arrays de chaînes. ismember teste l'appartenance et retourne un tableau logique — idéal pour le filtrage. Elles complètent l'indexation logique pour la manipulation de données.

matlab
% map (dictionary / hash table)
m = containers.Map;
m('name') = 'Alice';
m('age') = 30;
m('scores') = [90 85];

% access
m('name')             % 'Alice'
isKey(m, 'name')      % true
keys(m)               % {'age', 'name', 'scores'}
values(m)             % {30, 'Alice', [90 85]}
remove(m, 'age');

% create with initial values
m2 = containers.Map({'a','b','c'}, {1, 2, 3});

% set operations
A = [1 2 3 4 5];
B = [4 5 6 7 8];
union(A, B)           % [1 2 3 4 5 6 7 8]
intersect(A, B)       % [4 5]
setdiff(A, B)         % [1 2 3]
setxor(A, B)          % [1 2 3 6 7 8]
ismember(3, A)        % true
ismember([1 6], A)    % [true false]

Categorical & Datetime

Les categorical arrays stockent les données texte efficacement (comme des entiers avec une carte d'étiquettes) et supportent le tri — idéal pour les réponses d'enquête, évaluations ou tout ensemble fixe de catégories. datetime/duration (R2014+) remplacent les fonctions héritées datenum/datestr par un système de dates moderne et sensible aux fuseaux horaires. L'arithmétique de dates est intuitive : ajoutez days(), hours(), minutes(). Ces types s'intègrent avec les tables et le tracé pour l'analyse de séries temporelles.

matlab
% categorical data (efficient for repeated strings)
colors = categorical({'red', 'blue', 'red', 'green', 'blue'});
categories(colors)    % list of categories
summary(colors)       % count per category
ord = categorical({'low','med','high'}, ...
     {'low','med','high'}, 'Ordinal', true);
ord(1) < ord(2)       % true (ordered)

% datetime
t = datetime('now')   % current date and time
t = datetime(2024, 1, 15)
t.Format = 'yyyy-MM-dd HH:mm:ss';

% duration
d = duration(2, 30, 0);  % 2 hours 30 min
d = hours(2) + minutes(30);

% date arithmetic
t2 = t + days(7);     % add a week
t2 - t                % duration of 7 days

% date strings and numbers
s = datestr(t, 'yyyy-mm-dd');  % to string (legacy)
n = datenum(t);                 % to serial number
t = datetime(n, 'ConvertFrom', 'datenum');

% generate date range
dates = datetime(2024,1,1) + days(0:6);  % one week
05

Tracé & visualisation

Tracés 2D de base

plot() est la fonction de tracé 2D principale. Le troisième argument spécifie la couleur et le style ('b-' = bleu plein). hold on vous permet de superposer plusieurs tracés ; hold off libère. Étiquetez toujours les axes et ajoutez une légende. axis([xmin xmax ymin ymax]) définit les limites. saveas/print exportent les figures — print avec -r300 donne 300 DPI. gcf obtient le handle de la figure courante. L'option 'Location','best' place automatiquement la légende.

matlab
x = linspace(0, 2*pi, 100);

% line plot
plot(x, sin(x), 'b-', 'LineWidth', 2);
hold on;
plot(x, cos(x), 'r--', 'LineWidth', 2);
hold off;

% labels and legend
xlabel('x (radians)');
ylabel('amplitude');
title('Sine and Cosine');
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;

% line styles: b- blue solid, r-- red dashed
% g: green dotted, m-. magenta dash-dot
% markers: o circle, * star, s square, + plus

% axis control
axis([0 2*pi -1.5 1.5]);  % [xmin xmax ymin ymax]
xlim([0 2*pi]);
ylim([-1.5 1.5]);

% save figure
saveas(gcf, 'plot.png');
print('-dpng', '-r300', 'plot.png');

Tracés multiples & subplots

subplot(r, c, n) divise la figure en une grille r-par-c et sélectionne la n-ième cellule pour le tracé. tiledlayout (R2019+) est le remplaçant moderne — espacement plus propre et titre partagé. nexttile avance vers le subplot suivant. yyaxis crée des tracés avec deux axes y (gauche et droite) pour des données à échelles différentes. Appelez toujours figure d'abord pour ouvrir une nouvelle fenêtre, sinon vous écraserez le tracé courant.

matlab
% subplot(rows, cols, index)
figure;
subplot(2, 2, 1);
plot(x, sin(x));
title('Sine');

subplot(2, 2, 2);
plot(x, cos(x));
title('Cosine');

subplot(2, 2, 3);
plot(x, tan(x));
title('Tangent');
ylim([-5 5]);

subplot(2, 2, 4);
plot(x, exp(-x));
title('Decay');

% tiledlayout (newer, cleaner)
figure;
t = tiledlayout(2, 2);
nexttile; plot(x, sin(x)); title('Sine');
nexttile; plot(x, cos(x)); title('Cosine');
nexttile; plot(x, tan(x)); title('Tangent');
nexttile; plot(x, exp(-x)); title('Decay');
title(t, 'Trig Functions');  % overall title

% multiple y-axes
yyaxis left;  plot(x, sin(x));
yyaxis right; plot(x, 100*cos(x));

Tracés spécialisés

MATLAB a des dizaines de tracés spécialisés : bar/barh (diagrammes en barres), histogram (remplace hist), scatter (avec mapping couleur/taille optionnel), pie, area, stem, stairs, compass, feather. scatter(x, y, size, color, 'filled') est particulièrement puissant — le 4e argument colore les points selon une valeur, révélant une troisième dimension. histogram avec 'Normalization','pdf' normalise vers une densité de probabilité pour la comparaison avec des distributions continues.

matlab
% bar chart
bar([1 2 3], [10 15 7]);
bar([1 2 3; 4 5 6], 'grouped');  % grouped bars
bar([1 2 3; 4 5 6], 'stacked');  % stacked bars

% histogram
data = randn(1000, 1);
histogram(data, 30);    % 30 bins
histogram(data, 'Normalization', 'pdf');

% scatter plot
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y, 50, 'filled');
% colored scatter
scatter(x, y, 50, y, 'filled');  % color by y value
colorbar;

% pie chart
pie([30 20 50], {'A', 'B', 'C'});

% area plot
area(1:5, [1 3 2 4 5]);

% stem (discrete)
stem(0:5, [1 4 9 16 25 36]);

% boxplot (requires Statistics toolbox)
boxplot(randn(100, 3));

Tracés 3D & surfaces

plot3 trace des lignes paramétriques 3D. Pour les surfaces, créez d'abord une grille avec meshgrid, puis calculez Z = f(X, Y). surf dessine une surface remplie ; mesh dessine un fil de fer ; contour dessine des courbes de niveau 2D. colormap (jet, parula, hot, cool) contrôle le mapping de couleurs ; colorbar ajoute une légende. shading interp supprime les lignes de grille pour des dégradés lisses. view(az, el) définit l'angle de caméra. 'EdgeColor','none' masque les lignes de maille pour un look épuré.

matlab
% 3D line plot
t = 0:0.1:10*pi;
plot3(sin(t), cos(t), t);
xlabel('x'); ylabel('y'); zlabel('z');

% meshgrid for surface plots
[X, Y] = meshgrid(-2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

% surface plots
figure;
subplot(1, 3, 1);
surf(X, Y, Z);     % surface
title('surf');

subplot(1, 3, 2);
mesh(X, Y, Z);     % wireframe
title('mesh');

subplot(1, 3, 3);
contour(X, Y, Z, 20);  % contour lines
title('contour');

% colored surface with colorbar
figure;
surf(X, Y, Z, 'EdgeColor', 'none');
colorbar;
colormap jet;
shading interp;     % smooth colors

% view angle
view(45, 30);       % azimuth, elevation
axis equal;

Personnalisation & export de tracés

Presque chaque aspect visuel est personnalisable via des paires nom-valeur ou set(). Les couleurs sont des triplets RGB [r g b] de 0 à 1. set(gca, ...) modifie les axes courants (police, échelle, limites). MATLAB supporte LaTeX dans les titres/étiquettes avec 'Interpreter','latex'. exportgraphics (R2020+) est la fonction d'export moderne avec options vectorielles et haute résolution. Utilisez les handles de figure (f1, f2) pour gérer plusieurs fenêtres. annotation() ajoute des flèches, zones de texte et formes.

matlab
% customize line appearance
plot(x, y, ...
    'Color', [0.2 0.6 0.8], ...     % RGB 0-1
    'LineWidth', 2, ...
    'Marker', 'o', ...
    'MarkerSize', 8, ...
    'MarkerFaceColor', 'r');

% annotations
text(1, 0.5, 'important point');
annotation('arrow', [0.3 0.5], [0.3 0.5]);

% figure and axes properties
set(gcf, 'Position', [100 100 800 600]);
set(gca, 'FontSize', 14, 'FontName', 'Arial');
set(gca, 'XScale', 'log');  % log scale

% latex in labels
title('Function: \\alpha + \\beta^2', 'Interpreter', 'latex');

% export high quality
exportgraphics(gcf, 'plot.pdf', 'ContentType', 'vector');
exportgraphics(gcf, 'plot.png', 'Resolution', 300);

% legend customization
legend('show', 'Location', 'northwest', ...
       'FontSize', 12, 'Box', 'off');

% multiple figures
f1 = figure; plot(x, sin(x));
f2 = figure; plot(x, cos(x));
figure(f1);  % switch back to f1
06

Analyse de données & statistiques

Statistiques descriptives

MATLAB fournit des fonctions statistiques complètes. mean/median/mode pour la tendance centrale ; std/var/range/iqr pour la dispersion. Par défaut, elles opèrent le long de la première dimension (colonnes). Utilisez 'omitnan' pour ignorer les valeurs NaN (important pour les données réelles). quantile/prctile donnent les percentiles. Le Statistics and Machine Learning Toolbox ajoute geomean, harmmean, zscore et des fonctions de distribution. Vérifiez toujours les NaN avant l'analyse — ils se propagent à travers la plupart des opérations.

matlab
data = [1 2 3 4 5 6 7 8 9 10];

% central tendency
mean(data)            % 5.5
median(data)          % 5.5
mode(data)            % 1 (first mode)
geomean(data)         % geometric mean (Stats toolbox)
harmmean(data)        % harmonic mean

% dispersion
std(data)             % standard deviation
var(data)             % variance
range(data)           % max - min
iqr(data)             % interquartile range
mad(data)             % mean absolute deviation

% extremes and quantiles
min(data); max(data);
quantile(data, 0.25)  % 25th percentile
prctile(data, 95)     % 95th percentile

% along dimensions
A = randn(100, 3);
mean(A)               % mean of each column
mean(A, 2)            % mean of each row
mean(A, 'all')        % overall mean

% ignoring NaNs
data(5) = NaN;
mean(data, 'omitnan') % skip NaN values
nanmean(data)         % legacy equivalent

Ajustement de courbes & régression

polyfit ajuste un polynôme de degré donné ; polyval l'évalue. Pour la régression linéaire, regress() donne les coefficients plus les statistiques (R², F-statistic, p-value). corrcoef retourne la matrice de corrélation complète. Le Curve Fitting Toolbox fournit fit() pour l'ajustement interactif et programmatique avec des modèles personnalisés. lsqcurvefit (Optimization Toolbox) ajuste des modèles non linéaires arbitraires. Tracez toujours l'ajustement par rapport aux données pour vérifier la qualité — les polynômes d'ordre élevé peuvent surajuster.

matlab
% polynomial fit
x = 0:0.5:10;
y = 2*x + 1 + randn(size(x))*2;  % noisy linear data

% linear least squares (degree 1)
p = polyfit(x, y, 1);   % [slope, intercept]
yfit = polyval(p, x);
plot(x, y, 'o', x, yfit, '-');

% higher-order polynomial
p3 = polyfit(x, y, 3);
yfit3 = polyval(p3, x);

% fit with fittype (Curve Fitting Toolbox)
f = fit(x', y', 'poly2');  % quadratic
plot(f, x, y);

% custom model fit
% fit y = a*exp(b*x) using lsqcurvefit
model = @(p, x) p(1)*exp(p(2)*x);
params = lsqcurvefit(model, [1 0.1], x, y);

% correlation
r = corrcoef(x, y);     % correlation matrix
r = corr(x, y);         % correlation coefficient

% linear regression with stats
X = [ones(size(x)) x'];  % design matrix
[b, bint, r, rint, stats] = regress(y', X);
% stats = [R^2, F, p, error_var]

Interpolation & rééchantillonnage

interp1 interpole des données 1D — 'linear' est rapide, 'spline' est lisse (peut dépasser), 'pchip' préserve la forme (pas de dépassement). interp2 fait de même pour les grilles 2D. Pour les requêtes répétées, griddedInterpolant est plus efficace (construire une fois, interroger plusieurs fois). resample change le taux d'échantillonnage d'un signal (nécessite Signal Processing Toolbox). Choisissez toujours la méthode selon vos données : spline pour les fonctions lisses, pchip pour les données monotones, nearest pour les catégorielles.

matlab
% 1D interpolation
x = 0:5;
y = [0 1 4 9 16 25];
xi = 0:0.5:5;

yi = interp1(x, y, xi, 'linear');   % linear (default)
yi = interp1(x, y, xi, 'spline');   % cubic spline
yi = interp1(x, y, xi, 'pchip');    % shape-preserving
yi = interp1(x, y, xi, 'nearest');  % nearest neighbor

% extrapolation
yi = interp1(x, y, xi, 'linear', 'extrap');

% 2D interpolation
[X, Y] = meshgrid(0:2:10);
Z = X.^2 + Y.^2;
[Xi, Yi] = meshgrid(0:0.5:10);
Zi = interp2(X, Y, Z, Xi, Yi, 'spline');

% resample signal to new rate
y_resampled = resample(y, 3, 2);  % 3/2 times the rate

% griddedInterpolant (efficient for repeated queries)
F = griddedInterpolant(x, y, 'spline');
y1 = F(2.5);
y2 = F([1.5 3.5 4.5]);

FFT & traitement du signal

fft calcule la Transformée de Fourier Rapide — le fondement de l'analyse fréquentielle. La sortie est complexe ; prenez abs() pour la magnitude. Convertissez en spectre unilateral en prenant la première moitié et en doublant (sauf DC et Nyquist). Les fréquences vont de 0 à fs/2 (Nyquist). ifft inverse vers le domaine temporel. Le filtrage dans le domaine fréquentiel (mise à zéro des fréquences indésirables) est simple mais peut causer des oscillations ; utilisez designfilt pour des filtres corrects. spectrogram montre le contenu fréquentiel dans le temps.

matlab
% generate a signal with two frequencies
fs = 1000;                    % sampling rate (Hz)
t = 0:1/fs:1-1/fs;            % 1 second of time
x = 2*sin(2*pi*50*t) + 1*sin(2*pi*120*t);

% compute FFT
N = length(x);
Y = fft(x);
P2 = abs(Y/N);                % two-sided spectrum
P1 = P2(1:N/2+1);             % one-sided spectrum
P1(2:end-1) = 2*P1(2:end-1);
f = fs*(0:(N/2))/N;

% plot
plot(f, P1);
xlabel('Frequency (Hz)');
ylabel('Amplitude');
title('Single-Sided Spectrum');

% filtering (simple low-pass)
cutoff = 100;  % Hz
Y_filt = Y;
Y_filt(f > cutoff) = 0;       % zero out high freqs (simplified)
x_filtered = real(ifft(Y_filt));

% spectrogram
spectrogram(x, 128, 120, 128, fs, 'yaxis');

Optimisation & recherche de racines

fzero trouve les racines de fonctions 1D (nécessite un intervalle d'encadrement ou une estimation). fminbnd minimise une fonction 1D sur un intervalle borné ; fminsearch utilise Nelder-Mead pour l'optimisation multivariée sans contraintes. fmincon (Optimization Toolbox) gère les contraintes. linprog résout les programmes linéaires. Fournissez toujours une bonne estimation initiale (x0) pour les solveurs itératifs. Vérifiez la sortie exitflag pour confirmer la convergence. Pour l'optimisation globale, utilisez GlobalSearch ou MultiStart.

matlab
% find root of f(x) = 0
f = @(x) x^2 - 2;
x_root = fzero(f, 1);         % ~1.4142 (sqrt(2))
x_root = fsolve(f, 1);        % alternative

% minimize a function
fun = @(x) (x-3)^2 + 1;
[x_min, f_min] = fminbnd(fun, 0, 5);  % bounded 1D
% x_min = 3, f_min = 1

% multivariate minimization
fun2 = @(x) x(1)^2 + x(2)^2;  % sphere function
x0 = [1, 1];
[x_opt, f_opt] = fminsearch(fun2, x0);
% x_opt ≈ [0, 0]

% constrained optimization (Optimization Toolbox)
% minimize fun subject to A*x <= b
A = []; b = []; Aeq = []; beq = [];
lb = [0 0]; ub = [];
[x, fval] = fmincon(fun2, x0, A, b, Aeq, beq, lb, ub);

% linear programming
% minimize f'*x subject to A*x <= b
f = [-1; -1];                 % maximize x+y
A = [1 1; -1 0; 0 -1];
b = [2; 0; 0];
[x, fval] = linprog(f, A, b);
07

E/S fichiers & import de données

Fichiers MAT & save/load

.mat est le format binaire natif de MATLAB — rapide, compact et préserve tous les types de variables. save/load sont les commandes principales. Utilisez -v7.3 pour les fichiers de plus de 2 Go (basé sur HDF5). -ascii exporte vers du texte lisible (perd l'info de type). Le chargement dans un struct (s = load(...)) évite de polluer le workspace. clear supprime les variables ; clearvars -except conserve celles spécifiées. Sauvegardez toujours les résultats intermédiaires dans les longs calculs pour permettre la reprise.

matlab
% save variables to a .mat file
x = 1:10;
y = sin(x);
save('data.mat');             % save ALL variables
save('data.mat', 'x', 'y');   % save specific variables
save('data.mat', '-append');  % add more variables

% load variables
load('data.mat');             % load all into workspace
loaded = load('data.mat');    % load into a struct
loaded.x                      % access via struct

% save with compression
save('data.mat', 'x', 'y', '-v7.3');  % large files (>2GB)
save('data.mat', '-v7');              % compressed (default)

% save specific format
save('data.txt', 'x', '-ascii');      % plain text
save('data.csv', 'x', '-ascii', '-double');

% clear variables
clear x y;                    % remove specific
clear all;                    % remove everything
clearvars -except x;          % keep only x

Lecture de fichiers texte & CSV

readtable est la méthode moderne pour lire CSV/Excel — il retourne une table avec des colonnes nommées et gère les en-têtes automatiquement. readmatrix lit des données numériques dans une matrice. Pour un contrôle total, utilisez fopen/fgetl/fprintf/fclose (fermez toujours les fichiers !). fscanf lit des données formatées comme en C. Vérifiez toujours fid pour les erreurs : si fid == -1, le fichier n'a pas pu être ouvert. readcell gère les données de types mixtes qui ne tiennent pas dans une matrice ou une table.

matlab
% readtable (recommended for tabular data)
T = readtable('data.csv');
T = readtable('data.xlsx', 'Sheet', 'Sheet1');
T = readtable('data.csv', 'Delimiter', ',');

% access columns by name
T.Var1; T.age;

% readmatrix (numeric data)
M = readmatrix('numbers.csv');
M = readmatrix('data.txt', 'Delimiter', '\t');

% readcell (mixed data)
C = readcell('mixed.csv');

% low-level file I/O
fid = fopen('data.txt', 'r');
while ~feof(fid)
    line = fgetl(fid);
    disp(line);
end
fclose(fid);

% read formatted data
fid = fopen('data.txt', 'r');
data = fscanf(fid, '%f %f', [2, inf]);
fclose(fid);

% write text
fid = fopen('output.txt', 'w');
fprintf(fid, 'Result: %.2f\n', 3.14159);
fclose(fid);

E/S Excel & tableurs

readtable/writetable sont les fonctions recommandées pour les E/S Excel. Elles gèrent les en-têtes, types et feuilles automatiquement. detectImportOptions vous permet de personnaliser comment les colonnes sont analysées (par ex., forcer une colonne en int32 ou string). Utilisez 'Range' pour lire/écrire des cellules spécifiques. 'WriteMode','append' ajoute des lignes à une feuille existante. Pour les grands fichiers Excel, envisagez CSV (plus rapide) ou .mat (natif). Le Spreadsheet Link toolbox connecte MATLAB directement à Excel.

matlab
% read Excel files
T = readtable('data.xlsx');
T = readtable('data.xlsx', 'Sheet', 'Sales', 'Range', 'A1:D100');

% numeric data only
M = readmatrix('data.xlsx', 'Sheet', 1);

% write to Excel
writetable(T, 'output.xlsx');
writetable(T, 'output.xlsx', 'Sheet', 'Results');

% write matrix
writematrix(M, 'output.xlsx', 'Sheet', 1);

% cell array (mixed types)
C = {'Name','Age'; 'Alice',30; 'Bob',25};
writecell(C, 'people.xlsx');

% append to existing sheet
writetable(T, 'data.xlsx', 'Sheet', 1, 'WriteMode', 'append');

% read specific range
T = readtable('data.xlsx', 'Range', 'B2:D10');

% detect import options (customize parsing)
opts = detectImportOptions('data.csv');
opts = setvartype(opts, 'age', 'int32');
T = readtable('data.csv', opts);

Gestion des chemins & répertoires

dir() retourne un tableau de struct avec .name, .date, .bytes, .isdir, .datenum pour chaque fichier. fullfile joint les chemins de manière portable (utilise le bon séparateur sur chaque OS). fileparts sépare un chemin en répertoire, nom et extension. exist('name', 'file') vérifie si un fichier existe. addpath ajoute des répertoires au chemin de recherche de MATLAB pour que les fonctions qu'ils contiennent soient accessibles ; savepath le persiste. Ces fonctions sont essentielles pour le traitement par lots de fichiers dans des dossiers.

matlab
% current directory
pwd
cd('C:\\Users\\data')

% list files
files = dir();              % struct array of files
files = dir('*.mat');       % filter by pattern
files = dir('subdir/');     % list a subdirectory

% access file info
for i = 1:length(files)
    if ~files(i).isdir
        fprintf('%s - %d bytes\n', files(i).name, files(i).bytes);
    end
end

% path operations
fullfile('data', '2024', 'file.csv')  % data/2024/file.csv
[filepath, name, ext] = fileparts('C:\\data\\test.csv')
% filepath = 'C:\data', name = 'test', ext = '.csv'

% create and remove directories
mkdir('output');
rmdir('output', 's');      % remove recursively

% file existence
if exist('data.mat', 'file')
    load('data.mat');
end

% add folder to path
addpath('C:\\myfunctions');
savepath();                 % save for future sessions

Images & audio

imread/imshow/imwrite gèrent les images (JPEG, PNG, TIFF, BMP). Les images sont stockées comme des matrices uint8 (0-255) ou doubles (0-1). rgb2gray convertit la couleur en niveaux de gris. L'Image Processing Toolbox ajoute imresize, imrotate, imfilter, détection de contours et opérations morphologiques. audioread/audiowrite/sound gèrent les fichiers audio. Les images et audio ne sont que des matrices, donc tous les outils math et de tracé de MATLAB s'appliquent directement.

matlab
% read and display an image
img = imread('photo.jpg');
imshow(img);
[m, n, c] = size(img);     % dimensions, c=3 for RGB

% write image
imwrite(img, 'output.png');
imwrite(img, 'output.jpg', 'Quality', 90);

% convert to grayscale
if size(img, 3) == 3
    gray = rgb2gray(img);
    imshow(gray);
end

% image processing
img2 = imresize(img, 0.5);          % scale 50%
img3 = imrotate(img, 45);           % rotate 45 degrees
img4 = imadjust(img, [0.2 0.8], []); % contrast adjust

% audio
[y, fs] = audioread('song.wav');    % y = samples, fs = sample rate
sound(y, fs);                        % play audio
audiowrite('output.wav', y, fs);

% record audio
recObj = audiorecorder(44100, 16, 1);
recordblocking(recObj, 3);           % record 3 seconds
y = getaudiodata(recObj);
08

Mathématiques symboliques & avancé

Variables symboliques & simplification

Le Symbolic Math Toolbox permet le calcul exact (non numérique). syms déclare des variables symboliques. simplify, expand, factor, collect manipulent les expressions algébriques. subs substitue des valeurs ou variables. vpa (arithmétique à précision variable) calcule à précision arbitraire — utile quand l'arrondi flottant compte. Les résultats symboliques sont exacts (par ex., sqrt(2) reste sqrt(2), pas 1.4142...). Convertissez en numérique avec double() quand nécessaire.

matlab
% create symbolic variables (Symbolic Math Toolbox)
syms x y z

% symbolic expressions
f = x^2 + 2*x + 1;
g = sin(x)^2 + cos(x)^2;

% simplify
simplify(f)             % (x + 1)^2
simplify(g)             % 1
expand((x+1)^3)         % x^3 + 3*x^2 + 3*x + 1
factor(x^2 - 1)         % (x - 1)*(x + 1)
collect(x^2 + 2*x + x^2)% 2*x^2 + 2*x

% substitute values
subs(f, x, 3)           % 16 (f at x=3)
subs(f, x, y)           % y^2 + 2*y + 1

% pretty print
pretty(f)
disp(f)

% convert between numeric and symbolic
double(sym('1/3'))      % 0.3333
sym(0.5)                % 1/2
vpa(pi, 50)             % 50-digit pi: 3.1415926535897...

Calcul : dérivées & intégrales

diff dérive (passez un second argument pour les dérivées d'ordre supérieur). int intègre — sans bornes retourne l'antidérivée ; avec bornes calcule l'intégrale définie. limit calcule les limites (y compris unilatérales avec 'left'/'right'). taylor développe une fonction en série de Taylor autour d'un point. Ces fonctions retournent des expressions symboliques ; utilisez double() ou vpa() pour des résultats numériques. Le calcul symbolique est exact et évite l'arrondi numérique.

matlab
syms x

% differentiation
f = x^3 + 2*x^2 + x;
df = diff(f)            % 3*x^2 + 4*x + 1
d2f = diff(f, 2)        % second derivative: 6*x + 4
diff(f, x, 3)           % third derivative: 6

% partial derivatives
syms x y
g = x^2 * y + sin(x*y);
diff(g, x)              % 2*x*y + y*cos(x*y)
diff(g, y)              % x^2 + x*cos(x*y)

% integration
int(x^2)                % x^3/3 (indefinite)
int(x^2, x, 0, 1)       % 1/3 (definite, 0 to 1)
int(sin(x), x, 0, pi)   % 2

% limits
limit(sin(x)/x, x, 0)   % 1
limit(1/x, x, inf)      % 0
limit(1/x, x, 0, 'left')  % -inf

% Taylor series
taylor(exp(x), x, 0, 'Order', 6)
% 1 + x + x^2/2 + x^3/6 + x^4/24 + x^5/120

Résolution d'équations

solve trouve des solutions exactes (symboliques) aux équations et systèmes algébriques. Pour les équations sans solutions analytiques, utilisez vpasolve (numérique). dsolve résout symboliquement les équations différentielles ordinaires — fournissez des conditions initiales/limites pour une solution particulière. Les résultats sont symboliques ; convertissez avec double/vpa pour le tracé. Pour les EDO complexes non résolubles symboliquement, utilisez ode45 (solveur numérique) à la place. Vérifiez toujours si solve a retourné vide (aucune solution trouvée).

matlab
syms x y

% solve algebraic equations
solve(x^2 - 4 == 0, x)        % [2; -2]
solve(x^2 + 1 == 0, x)        % [i; -i] (complex roots)

% solve a system
sol = solve([x + y == 5, x - y == 1], [x, y]);
sol.x                        % 3
sol.y                        % 2

% solve with parameters
syms a b c
r = solve(a*x^2 + b*x + c == 0, x);
% r = -(b + (b^2 - 4*a*c)^(1/2))/(2*a), ...

% numerical solve (no closed form)
vpasolve(x^5 - 3*x + 1 == 0, x)

% differential equations
syms y(t) t
ode = diff(y, t) == -k*y;     % dy/dt = -k*y
cond = y(0) == y0;
ySol(t) = dsolve(ode, cond);  % y0*exp(-k*t)

% system of ODEs
syms x(t) y(t)
eq1 = diff(x,t) == y;
eq2 = diff(y,t) == -x;
sol = dsolve([eq1, eq2]);

Transformées de Laplace & Fourier

laplace/ilaplace calculent la paire de transformées de Laplace — essentielles pour résoudre les EDO linéaires et analyser les systèmes de contrôle. fourier/ifourier font de même pour la transformée de Fourier (fréquence continue). ztrans/iztrans gèrent les signaux discrets (filtres numériques). Le flux de travail pour résoudre les EDO via Laplace : transformer l'EDO en algébrique, résoudre pour Y(s), puis transformer inverse. Ce sont des opérations symboliques exactes ; pour les transformées numériques utilisez fft.

matlab
syms t s w

% Laplace transform
f = exp(-a*t);
F = laplace(f)          % 1/(a + s)
% default: f(t) -> F(s)

% inverse Laplace
f2 = ilaplace(1/(s+1))  % exp(-t)

% Fourier transform
g = exp(-t^2);
G = fourier(g)          % pi^(1/2)*exp(-w^2/4)

% inverse Fourier
g2 = ifourier(G)

% Z-transform (for discrete signals)
syms n z
h = a^n;
H = ztrans(h)           % -z/(a - z) (for |z| > |a|)
h2 = iztrans(z/(z-a))   % a^n

% apply transform to solve ODE
% y'' + y = 0, y(0)=0, y'(0)=1
syms y(t) Y(s)
ode = diff(y, t, 2) + y == 0;
% take Laplace of both sides, solve for Y(s), then invert

Solveurs numériques d'EDO

ode45 est le solveur EDO de référence — une méthode Runge-Kutta (4,5) précise et adaptative. Pour les systèmes, l'état est un vecteur v, et la fonction retourne un vecteur colonne de dérivées. ode15s est pour les problèmes raides (où la dynamique opère à des échelles de temps très différentes). odeset configure les tolérances et événements. Pour passer des paramètres, utilisez une fonction anonyme qui les capture. Tracez toujours la solution pour vérifier qu'elle semble raisonnable. Pour les problèmes aux limites, utilisez bvp4c.

matlab
% solve dy/dt = f(t, y) numerically with ode45

% define the ODE as a function
f = @(t, y) -2*y;       % dy/dt = -2y (exponential decay)

% solve on [0, 5] with y(0) = 1
[t, y] = ode45(f, [0 5], 1);
plot(t, y);
xlabel('t'); ylabel('y');

% system of ODEs (Lotka-Volterra predator-prey)
% dx/dt = 1.5x - xy,  dy/dt = -0.7y + 0.1xy
ode_sys = @(t, v) [1.5*v(1) - v(1)*v(2);
                   -0.7*v(2) + 0.1*v(1)*v(2)];
[t, V] = ode45(ode_sys, [0 20], [10; 5]);
plot(t, V(:,1), 'b', t, V(:,2), 'r');
legend('Prey', 'Predator');

% stiff ODE solver (for fast dynamics)
[t, y] = ode15s(f, [0 5], 1);

% set options
opts = odeset('RelTol', 1e-6, 'AbsTol', 1e-9);
[t, y] = ode45(f, [0 5], 1, opts);

% pass parameters via anonymous function
a = 0.5;
f = @(t, y, a) -a*y;
[t, y] = ode45(@(t,y) f(t,y,a), [0 10], 1);
09

Opérations matricielles avancées

Équations linéaires & décompositions

L'opérateur antislash (\) est le solveur linéaire préféré de MATLAB — il sélectionne automatiquement LU, QR ou Cholesky selon la matrice. N'utilisez jamais inv(A)*b sauf si vous avez réellement besoin de l'inverse ; c'est plus lent et moins stable numériquement. lu, qr et chol retournent les factorisations matricielles standard. eig calcule les valeurs/vecteurs propres, et svd donne la décomposition en valeurs singulières — fondamentale pour PCA, pseudo-inverses et approximations de rang faible.

matlab
% solve Ax = b
A = [3 2 -1; 2 -2 4; -1 0.5 -1];
b = [1; -2; 0];
x = A \ b;             % backslash: preferred solver
x = inv(A) * b;         % explicit inverse (slower, less stable)
x = linsolve(A, b);     % optimized linear solver

% LU, QR, Cholesky decompositions
[L, U, P] = lu(A);      % PA = LU
[Q, R] = qr(A);         % QR factorization
R = chol(A'*A);         % Cholesky (needs SPD matrix)

% eigenvalues and eigenvectors
[V, D] = eig(A);        % A*V = V*D
eigenvalues = diag(D);

% singular value decomposition
[U, S, V] = svd(A);     % A = U*S*V'

Matrices creuses

Les matrices creuses stockent uniquement les entrées non nulles — essentielles avec des matrices de dimension 100k+ principalement composées de zéros (courant dans les méthodes d'éléments finis, algorithmes de graphes et EDP). sparse(i,j,v) construit depuis la forme triplet ; full convertit en retour. L'arithmétique entre matrices creuses reste creuse. nnz compte les non-zéros et spy trace le motif de creusement. Les résolutions linéaires creuses (A\b) utilisent des solveurs spécialisés comme UMFPACK automatiquement.

matlab
% create sparse matrix (memory efficient for large, mostly-zero)
S = sparse(10000, 10000);
S(1, 1) = 5;
S(2, 3) = 10;

% from triplets (row, col, value)
i = [1 2 2 3];
j = [1 1 3 3];
v = [4 5 7 9];
S = sparse(i, j, v, 3, 3);

% convert sparse <-> full
F = full(S);
S2 = sparse(F);

% sparse identity and diagonal
I = speye(1000);
D = spdiags(ones(1000,1), 0, 1000, 1000);

% operations preserve sparsity
nnz(S)                  % number of nonzeros
spy(S)                  % visualize sparsity pattern

Fonctions matricielles & reshaping

reshape réarrange les éléments en colonne-major (vers le bas des colonnes d'abord) — une source courante de bugs lors du portage depuis des langages row-major. flipud/fliplr/rot90 sont pratiques pour inverser ou transposer de manières non standard. repmat dispose une matrice en grille ; repelem duplique les éléments individuels. La concaténation utilise [A; B] (verticale) et [A B] (horizontale), ou horzcat/vertcat pour un usage programmatique. arrayfun applique une fonction élément par élément quand la vectorisation n'est pas possible.

matlab
A = [1 2 3; 4 5 6];

% reshape (column-major order!)
B = reshape(A, 3, 2);   % [1 5; 4 3; 2 6]
C = reshape(A, 6, 1);   % column vector

% flip and rotate
flipud(A)               % flip up-down
fliplr(A)               % flip left-right
rot90(A)                % rotate 90 degrees
rot90(A, 2)             % rotate 180 degrees

% repmat and repelem
repmat([1 2], 2, 3)     % tile 2x3
repelem([1 2 3], 2)     % [1 1 2 2 3 3]

% concatenation
[A; A]                  % vertical (must have same # cols)
[A A]                   % horizontal (must have same # rows)
horzcat(A, A); vertcat(A, A);

% matrix functions (apply element-wise via fun)
arrayfun(@(x) x^2, A)

Broadcasting & vectorisation

Depuis R2016b, MATLAB broadcaste automatiquement (étend) les dimensions de taille 1 pour correspondre à l'autre opérande — pas besoin de bsxfun ou repmat. La vectorisation (opérer sur des tableaux entiers au lieu de boucles élément par élément) est le plus grand gain de performance dans MATLAB, car les routines BLAS/LAPACK sous-jacentes sont hautement optimisées. Préallouez toujours les tableaux avant de les remplir dans une boucle ; agrandir des tableaux dynamiquement force une réallocation à chaque itération et est O(n^2).

matlab
% MATLAB implicitly expands (broadcasts) since R2016b
A = [1 2 3; 4 5 6];     % 2x3
b = [10 20 30];         % 1x3
C = A + b;              % 2x3: b added to each row

c = [1; 2];             % 2x1
D = A + c;              % 2x3: c added to each column

% vectorized operations (much faster than loops)
x = linspace(0, 2*pi, 1e6);
y = sin(x) .* cos(x);   % element-wise, no loop needed

% avoid growing arrays in loops
% BAD: for k=1:1e6, s(k) = k; end
% GOOD: preallocate
s = zeros(1, 1e6);
for k = 1:1e6
    s(k) = k;
end

% even better: vectorize
s = 1:1e6;

% bsxfun (legacy, before auto-broadcasting)
E = bsxfun(@plus, A, b);

Applications d'algèbre linéaire numérique

L'opérateur antislash résout automatiquement les problèmes de moindres carrés quand A est rectangulaire (plus de lignes que de colonnes). polyfit/polyval ajustent et évaluent les polynômes. PCA est calculé le plus stablement via SVD de la matrice de données centrée — les colonnes de V sont les directions principales et diag(S) donne les écarts-types. cond(A) mesure la sensibilité numérique ; les valeurs au-dessus de 1e12 signifient que la matrice est essentiellement singulière pour l'arithmétique en double précision.

matlab
% least-squares fit (overdetermined system)
A = [1 1; 1 2; 1 3; 1 4];
b = [6; 5; 7; 10];
x = A \ b;             % least-squares solution

% polynomial curve fitting
t = 0:0.1:5;
y = 2*t.^2 + 1 + 0.5*randn(size(t));
p = polyfit(t, y, 2);   % degree-2 fit
yfit = polyval(p, t);

% PCA via SVD
X = randn(100, 5);
Xc = X - mean(X);       % center
[U, S, V] = svd(Xc, 0);
scores = Xc * V;        % principal components
variances = diag(S).^2 / (size(X,1)-1);

% condition number (numerical stability)
cond(A)                 % large = ill-conditioned
10

Tracé 2D & 3D avancé

Tracés en lignes & personnalisation

plot est la fonction de tracé 2D de travail. Les chaînes de spec de ligne comme 'r--' (rouge tirets) combinent couleur, marqueur et style. hold on vous permet de superposer plusieurs tracés. subplot(m,n,k) crée une grille m-par-n et sélectionne la k-ième cellule (row-major). set(gca, ...) modifie les axes courants ; gcf est la figure courante. print avec -dpng et -r300 exporte un PNG 300 DPI — bien meilleure qualité que saveas.

matlab
x = linspace(0, 2*pi, 200);
y1 = sin(x); y2 = cos(x);

figure;
plot(x, y1, 'b-', 'LineWidth', 2); hold on;
plot(x, y2, 'r--', 'LineWidth', 1.5);
hold off;

% annotations
xlabel('Angle (rad)');
ylabel('Amplitude');
title('Sine and Cosine');
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;

% axis control
axis([0 2*pi -1.2 1.2]);
set(gca, 'FontSize', 12, 'FontName', 'Arial');

% multiple subplots
subplot(2, 1, 1); plot(x, y1);
subplot(2, 1, 2); plot(x, y2);

% save figure
saveas(gcf, 'plot.png');
print('-dpng', '-r300', 'plot_hi.png');

Surfaces 3D, maillages & contours

meshgrid crée les grilles de coordonnées X, Y nécessaires pour les tracés de surface. surf dessine une surface remplie, mesh dessine un fil de fer, et contour projette en courbes de niveau 2D. colormap change le mapping de couleurs (jet, parula, hot, cool, gray) ; parula est le défaut moderne. shading interp lisse les transitions de couleur. plot3 trace des courbes paramétriques 3D. view(az, el) définit l'angle de caméra ; axis equal empêche la distorsion.

matlab
[X, Y] = meshgrid(-2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

figure;
subplot(2,2,1); surf(X, Y, Z);    title('surf');
subplot(2,2,2); mesh(X, Y, Z);    title('mesh');
subplot(2,2,3); contour(X, Y, Z, 20); title('contour');
subplot(2,2,4); surfc(X, Y, Z);   title('surfc');

% color mapping
colormap(jet(256)); colorbar;
shading interp;        % smooth colors

% 3D line plot (parametric)
t = 0:0.01:10;
plot3(sin(t), cos(t), t, 'LineWidth', 2);
xlabel('x'); ylabel('y'); zlabel('z');

% view angle
view(45, 30);          % azimuth, elevation
axis equal;

Tracés statistiques & spécialisés

histogram (R2014b+) remplace hist avec plus de fonctionnalités comme 'Normalization' pour les PDF. boxplot compare les distributions entre groupes. scatterhist montre un nuage de points avec histogrammes marginaux — idéal pour visualiser les corrélations. bar supporte les dispositions groupées et empilées. errorbar ajoute la visualisation d'incertitude. Ces tracés spécialisés sont essentiels pour la présentation de données scientifiques et l'analyse exploratoire.

matlab
data = randn(1000, 1);

% histogram (modern)
histogram(data, 30, 'Normalization', 'pdf');
hold on; x = -4:0.1:4; plot(x, normpdf(x), 'r-', 'LineWidth', 2);

% box plot by group
g = randi([1 3], 100, 1);
boxplot(data, g);

% scatter with marginal histograms
x = randn(200,1); y = x + 0.5*randn(200,1);
scatterhist(x, y);

% bar chart
sales = [10 25 30; 20 15 40];
bar(sales); legend('Q1','Q2','Q3');

% pie chart
pie([30 20 50], {'A','B','C'});

% error bars
y = [1 2 3 4]; e = [0.1 0.2 0.15 0.3];
errorbar(y, e, 'o-');

Animations & graphiques interactifs

Les animations mettent à jour les données de tracé dans une boucle et appellent drawnow pour rafraîchir. Pour des performances fluides, créez le tracé une fois et mettez à jour XData/YData plutôt que de re-tracer. getframe capture la figure courante ; movie joue une séquence. VideoWriter exporte en MP4 ou AVI — utile pour partager les résultats. Définissez toujours les limites d'axe en dehors de la boucle pour empêcher la gigue de redimensionnement automatique.

matlab
% animated line plot
figure;
h = plot(NaN, NaN);
axis([0 10 -1 1]); xlabel('t'); ylabel('y');
for t = 0:0.1:10
    set(h, 'XData', [get(h,'XData') t], ...
           'YData', [get(h,'YData') sin(t)]);
    drawnow;
end

% getframe to capture animation
frames = [];
for k = 1:50
    plot(sin(linspace(0, k*pi/10, 200)));
    axis([0 200 -1 1]);
    frames = [frames, getframe];
end
movie(frames, 1, 30);   % play once at 30 fps

% write to video file
v = VideoWriter('anim.mp4', 'MPEG-4');
v.FrameRate = 30; open(v);
for k = 1:50
    plot(sin(linspace(0, k*pi/10, 200)));
    writeVideo(v, getframe);
end
close(v);

Objets graphiques & personnalisation des handles

Les graphiques MATLAB sont construits sur un arbre d'objets handle (figure → axes → lignes, texte, patches). set/get modifient les propriétés ; findobj localise les objets par propriété. L'option 'Interpreter' active le rendu TeX ou LaTeX complet pour la notation mathématique. exportgraphics (R2020a+) produit des PDF vectoriels de qualité publication avec des boîtes englobantes serrées — bien meilleur que l'ancien print pour l'intégration dans des articles.

matlab
% everything in MATLAB graphics is a handle object
h = plot(1:10, 'r-');
set(h, 'LineWidth', 3, 'Marker', 'o', 'MarkerSize', 8);
get(h, 'Color')         % returns [1 0 0]

% find objects
ax = gca;               % current axes
fig = gcf;              % current figure
lines = findobj(ax, 'Type', 'line');

% property exploration
get(ax)                 % list all axes properties
set(ax)                 % list possible values

% text annotations with LaTeX
text(2, 0.5, '\alpha^2 + \beta^2', 'Interpreter', 'tex');
title('$\int_0^1 x^2 dx$', 'Interpreter', 'latex');

% legend with custom location and orientation
legend({'data1','data2'}, 'Location','northwest','Orientation','horizontal');

% export with tight bounding box
exportgraphics(gcf, 'fig.pdf', 'ContentType','vector');
12

GUI & App Designer

Bases d'App Designer

App Designer (lancé avec appdesigner) est l'outil visuel moderne pour construire des GUI MATLAB, sauvegardant des fichiers .mlapp qui regroupent layout et code. Pour les UI programmatiques, uifigure (R2014b+) crée des fenêtres de figure modernes avec uibutton, uilabel, uieditfield, uislider, uidropdown et uiaxes. Les callbacks sont des function handles assignés à des propriétés comme ButtonPushedFcn. L'ancien GUIDE est déprécié ; le nouveau code devrait utiliser les composants basés sur uifigure ou App Designer.

matlab
% App Designer (appdesigner command) creates .mlapp files
% Modern replacement for GUIDE (deprecated in R2020a)

% programmatic UI (alternative to App Designer)
f = uifigure('Name', 'My App', 'Position', [100 100 600 400]);

% add components
btn = uibutton(f, 'Text', 'Click Me', ...
    'Position', [50 300 100 30]);
lbl = uilabel(f, 'Text', 'Hello', ...
    'Position', [50 250 200 30]);
fld = uieditfield(f, 'text', 'Position', [50 200 200 30]);

% slider and drop-down
sld = uislider(f, 'Position', [50 150 200 3]);
dd = uidropdown(f, 'Items', {'A','B','C'}, ...
    'Position', [50 100 100 30]);

% axes for plotting
ax = uiaxes(f, 'Position', [300 100 250 250]);
plot(ax, 1:10, rand(1,10));

% callback
btn.ButtonPushedFcn = @(src,event) clickHandler(lbl);

function clickHandler(lbl)
    lbl.Text = ['Clicked at ' datestr(now)];
end

Gestionnaires de layout & conteneurs

uigridlayout (R2018b+) est le gestionnaire de layout moderne et responsive — les lignes et colonnes peuvent être fixes, proportionnelles ('1x') ou fit-content. uitabgroup/uitab créent des interfaces à onglets. uipanel regroupe visuellement les composants associés. uiscrollbox ajoute du défilement pour le contenu qui dépasse la fenêtre. Les fonctions de dialogue (uigetfile, inputdlg, msgbox, questdlg) gèrent la sélection de fichiers standard, l'entrée et les notifications. Ces outils de layout sont essentiels pour construire des applications MATLAB professionnelles et redimensionnables.

matlab
f = uifigure;

% grid layout (responsive)
g = uigridlayout(f, [3 2]);
g.RowHeight = {'1x', '2x', '1x'};
g.ColumnWidth = {'1x', '2x'};

btn1 = uibutton(g); btn1.Layout.Row = 1; btn1.Layout.Column = 1;
btn2 = uibutton(g); btn2.Layout.Row = 1; btn2.Layout.Column = 2;

% tab group
tg = uitabgroup(f);
t1 = uitab(tg, 'Title', 'Plot');
t2 = uitab(tg, 'Title', 'Data');
ax = uiaxes(t1); plot(ax, rand(5));

% panel for grouping
p = uipanel(f, 'Title', 'Settings', 'Position', [20 20 200 150]);

% scrollable container for long content
sf = uiscrollbox(f);
% add many components inside sf

% dialog windows
uigetfile('*.mat', 'Select MAT file');
inputdlg({'Name','Age'}, 'Enter data');
msgbox('Operation complete');

Callbacks & gestion d'événements

Le MATLAB moderne utilise des callbacks function-handle avec deux arguments (src, event) où event transporte des données structurées comme event.Value ou event.Key. ValueChangingFcn se déclenche continuellement pendant l'interaction ; ValueChangedFcn se déclenche une fois à la fin. addlistener crée des écouteurs persistants sur toute propriété. Les objets timer exécutent des callbacks selon un planning — utiles pour les UI d'acquisition de données en direct. Nettoyez toujours les écouteurs et timers (delete) pour éviter les fuites de mémoire.

matlab
% value-changing callback (slider)
sld = uislider(f);
sld.ValueChangingFcn = @(src,event) onSlider(src, event);

function onSlider(src, event)
    disp(['Dragging: ' num2str(event.Value)]);
end

% value-changed callback (final value)
sld.ValueChangedFcn = @(src,event) disp(['Final: ' num2str(event.Value)]);

% button callback with event data
btn.ButtonPushedFcn = @onButton;
function onButton(src, event)
    fprintf('Button %s pushed
', src.Text);
end

% keyboard callback on figure
f.WindowKeyPressFcn = @(src,event) onKey(event);
function onKey(event)
    fprintf('Key: %s
', event.Key);
end

% listener pattern (any property change)
lh = addlistener(btn, 'Text', 'PostSet', @(src,event) disp('Text changed'));
delete(lh);  % remove listener

% timer for periodic updates
t = timer('ExecutionMode','fixedRate','Period',1, ...
    'TimerFcn',@(~,~) disp('tick'));
start(t);

Packaging d'applications pour distribution

matlab.apputil.package regroupe une application App Designer en un fichier .mlappinstall que les utilisateurs installent via l'onglet Apps. L'Application Compiler (deploytool) produit des exécutables autonomes (.exe) qui s'exécutent avec le MATLAB Runtime gratuit — aucune licence MATLAB nécessaire sur la cible. Les Web Apps (R2020a+) se déploient sur un MATLAB Web App Server et s'exécutent dans n'importe quel navigateur. Ce pipeline de distribution vous permet de partager des applications MATLAB avec des non-utilisateurs MATLAB.

matlab
% package an App Designer app as a .mlappinstall file
% using the Application Compiler (deploytool app)

% programmatically create a packaged app
appFile = matlab.apputil.package(...
    'Name', 'MyPlotTool', ...
    'Summary', 'A simple plotting utility', ...
    'Description', 'Plots user-supplied data.', ...
    'MainFile', 'MyPlotTool.mlapp', ...
    'FolderPath', 'my_app_package');

% install the app
matlab.apputil.install('MyPlotTool.mlappinstall');

% list installed apps
apps = matlab.apputil.getInstalledApps;

% uninstall
matlab.apputil.uninstall('MyPlotTool');

% standalone desktop app (MATLAB Runtime required)
% deploytool -> Application Compiler -> produce .exe

% web app (runs in browser, MATLAB Web App Server)
% deploytool -> Web App

Patterns UI courants

drawnow limitrate met à jour les graphiques sans bloquer — critique pour les affichages de données en direct. uitable affiche des données tabulaires avec colonnes triables. uiprogressdlg montre une barre de progression modale pour les opérations longues. uicontextmenu ajoute des menus clic-droit à tout composant. Ces patterns couvrent les besoins UI les plus courants : mises à jour en direct, tables de données, feedback de progression et actions contextuelles. Pour les tracés en direct à haut débit, envisagez animatedline qui est optimisé pour les données en streaming.

matlab
% live plot update from worker
f = uifigure; ax = uiaxes(f); h = plot(ax, NaN, NaN);
for k = 1:100
    set(h, 'XData', 1:k, 'YData', rand(1,k));
    drawnow limitrate;  % throttle for performance
end

% table display
tdata = table({'A';'B';'C'}, [1;2;3], 'VariableNames', {'Name','Val'});
uit = uitable(f, 'Data', tdata.Variables, ...
    'ColumnName', tdata.Properties.VariableNames, ...
    'Position', [20 20 200 150]);

% progress dialog
d = uiprogressdlg(f, 'Title', 'Working', 'Message', 'Processing...');
for k = 1:100
    pause(0.01);
    d.Value = k;
    d.Message = sprintf('%d%% complete', k);
end
close(d);

% context menu
cm = uicontextmenu(f);
m1 = uimenu(cm, 'Text', 'Reset', 'MenuSelectedFcn', @reset);
ax.UIContextMenu = cm;
13

Image Processing Toolbox

Lecture, écriture & affichage d'images

imread supporte PNG, JPEG, TIFF, BMP et de nombreux formats scientifiques. Les types de données d'image comptent : uint8 (0-255) est courant pour les fichiers, double (0-1) pour le traitement. Utilisez toujours im2double/im2uint8 (qui redimensionnent) plutôt que double()/uint8() (qui tronquent). im2gray (R2020b+) remplace rgb2gray. imwrite supporte les options spécifiques au format comme la qualité JPEG. imfinfo lit les métadonnées sans charger les données de pixels.

matlab
% read and display an image
img = imread('peppers.png');
imshow(img);
title('RGB image');

% image types
% uint8 (0-255), uint16, double (0-1), logical (binary)
whos img
class(img)              % uint8
size(img)               % rows x cols x channels

% convert between types
d = im2double(img);     % scale to [0,1]
u = im2uint8(d);        % scale to [0,255]
g = im2gray(img);       % RGB to grayscale (R2020b+, replaces rgb2gray)

% write to file
imwrite(g, 'gray.png');
imwrite(g, 'gray.jpg', 'Quality', 90);

% info without loading
info = imfinfo('peppers.png');
disp(info.Width);

% montage of multiple images
fileList = dir('*.png');
montage({fileList.name});

Filtrage & amélioration

imgaussfilt est le flou gaussien moderne (remplace fspecial('gaussian') + imfilter). medfilt2 supprime le bruit sel-et-poivre sans flouter les contours. fspecial crée des noyaux prédéfinis (sobel, prewitt, laplacian, gaussian). imsharpen améliore les contours via masquage flou. histeq effectue l'égalisation globale d'histogramme ; adapthisteq (CLAHE) le fait localement pour un meilleur contraste dans les images non uniformes. imadjust mappe les intervalles d'intensité pour la correction luminosité/contraste.

matlab
img = im2double(imread('cameraman.tif'));

% Gaussian blur
h = imgaussfilt(img, 2);   % sigma = 2
h2 = imgaussfilt(img, [3 3], 1.5);

% median filter (salt-and-pepper noise)
noisy = imnoise(img, 'salt & pepper', 0.05);
m = medfilt2(noisy, [3 3]);

% custom 2D filter
kernel = fspecial('sobel');
edge_img = imfilter(img, kernel);

% unsharp masking (sharpen)
sharp = imsharpen(img, 'Amount', 0.8, 'Radius', 1.5);

% histogram equalization
eq = histeq(img);          % global
eq2 = adapthisteq(img);    % CLAHE (local)

% image arithmetic
bright = imadd(img, 0.1);
contrast = imadjust(img, [0.3 0.7], []);

Opérations morphologiques & segmentation

Les opérations morphologiques (erode, dilate, open, close) traitent les images binaires avec des éléments structurants (strel). L'ouverture supprime les petits objets ; la fermeture remplit les petits trous. bwconncomp trouve les régions connectées ; regionprops extrait les mesures (aire, centroïde, boîte englobante) pour chacune. watershed segmente les objets en contact. edge détecte les contours (Canny est le plus robuste). graythresh calcule le seuil global d'Otsu ; multithresh fait multi-niveaux. Ces outils forment le cœur du prétraitement de vision par ordinateur.

matlab
bw = imread('text.png');
bw = imbinarize(bw);

% morphological operations
se = strel('disk', 3);
er = imerode(bw, se);       % shrink objects
di = imdilate(bw, se);      % grow objects
op = imopen(bw, se);        % erode then dilate (removes small noise)
cl = imclose(bw, se);       % dilate then erode (fills small holes)

% connected components
cc = bwconncomp(bw);
stats = regionprops(cc, 'Area', 'Centroid', 'BoundingBox');
[areas, idx] = sort([stats.Area], 'descend');

% watershed segmentation
grad = imgradient(bw);
D = -bwdist(~bw);
L = watershed(D);

% edge detection
edges = edge(bw, 'canny');
edges2 = edge(bw, 'sobel');

% thresholding
T = graythresh(img);        % Otsu's method
bw2 = imbinarize(img, T);

Détection de caractéristiques & transformées

La détection de caractéristiques trouve des points distinctifs pour la correspondance et le suivi. Les coins de Harris sont rapides mais pas invariants à l'échelle ; SURF et ORB sont invariants à l'échelle/rotation pour une correspondance robuste entre vues. extractFeatures calcule des descripteurs aux points détectés. La transformée de Hough détecte les lignes (et cercles) par vote dans l'espace paramétrique — utile pour la correction d'inclinaison de documents et la détection de voies. imregtform effectue le recalage d'image basé sur l'intensité, calculant la transformée géométrique qui aligne deux images.

matlab
img = imread('cameraman.tif');

% corner detection (Harris)
corners = detectHarrisFeatures(img);
[~, strength] = corners;
imshow(img); hold on; plot(corners);

% SURF features (scale-invariant)
points = detectSURFFeatures(img);
[f1, vpts1] = extractFeatures(img, points);

% ORB features (faster, binary)
points = detectORBFeatures(img);

% Hough transform for line detection
bw = edge(img, 'canny');
[H, T, R] = hough(bw);
P = houghpeaks(H, 5);
lines = houghlines(bw, T, R, P);

% image registration
% (find transform between two images)
moving = imread('rotated.png');
fixed = img;
[optimizer, metric] = imregconfig('monomodal');
tform = imregtform(moving, fixed, 'affine', optimizer, metric);
registered = imwarp(moving, tform);

Traitement par lots & grandes images

Pour le traitement par lots, parfor parallélise sur les images. blockproc traite les grandes images en tuiles — essentiel quand l'image complète ne tient pas en mémoire ; l'option 'Destination' diffuse la sortie vers le disque. imageDatastore gère des collections trop grandes pour énumérer manuellement et s'intègre aux tall arrays et au framework MapReduce pour le calcul out-of-core. Le support bigTIFF gère la microscopie gigapixel et l'imagerie de télédétection.

matlab
% process many images in a folder
fileList = dir('*.tif');
parfor k = 1:numel(fileList)
    img = imread(fileList(k).name);
    result = processImage(img);
    imwrite(result, ['out_' fileList(k).name]);
end

% block processing for large images
fun = @(block) std2(block);
B = blockproc('large.tif', [256 256], fun);
B = blockproc('large.tif', [256 256], fun, 'Destination', 'out.tif');

% work with very tall/wide images without loading all
% (bigTIFF, multiresolution)
t = Tiff('big.tif', 'r');
imgInfo = t.getImageInfo;

% image datastore for huge collections
imds = imageDatastore('images/', 'IncludeSubfolders', true);
imds.ReadSize = 10;  % read 10 at a time
while hasdata(imds)
    [imgs, info] = read(imds);
    % process batch
end

% tall arrays (out-of-core) for pixel statistics
t = tall(imds);
14

Optimization Toolbox

Optimisation avec & sans contraintes

fminunc résout les problèmes lisses sans contraintes ; fmincon gère les bornes, contraintes linéaires et non linéaires. linprog et quadprog sont spécialisés pour les objectifs linéaires et quadratiques avec contraintes linéaires — bien plus rapides que les solveurs généraux. optimoptions configure le comportement du solveur (algorithme, tolérances, affichage). L'algorithme 'interior-point' est robuste pour les grands problèmes ; 'sqp' est bon pour les contraintes non linéaires. Fournissez toujours les gradients analytiques quand disponibles pour la vitesse et la précision.

matlab
% unconstrained minimization
f = @(x) (x(1)-2)^2 + (x(2)-3)^2;
x0 = [0 0];
[x, fval] = fminunc(f, x0);

% constrained (with fmincon)
A = []; b = []; Aeq = []; beq = [];
lb = [0 0]; ub = [];
nonlcon = @(x) deal([], x(1) + x(2) - 4);  % x1+x2 <= 4
[x, fval] = fmincon(f, x0, A, b, Aeq, beq, lb, ub, nonlcon);

% linear programming
f_lp = [-1 -1];            % minimize -x1 - x2
A_lp = [1 1; -1 1]; b_lp = [4; 2];
[x, fval] = linprog(f_lp, A_lp, b_lp, [], [], [0;0]);

% quadratic programming
H = [1 -1; -1 2]; c = [-2; -6];
[x, fval] = quadprog(H, c, [], [], [], [], [0;0]);

% set optimization options
opts = optimoptions('fmincon', 'Algorithm','interior-point', ...
    'Display','iter', 'MaxIterations', 200);
[x, fval] = fmincon(f, x0, A, b, Aeq, beq, lb, ub, nonlcon, opts);

Optimisation globale & multiobjectif

Les solveurs locaux (fminunc, fmincon) peuvent rester coincés dans des minima locaux. GlobalSearch et MultiStart exécutent un solveur local depuis de nombreux points de départ. ga (algorithme génétique), particleswarm et simulannealbnd sont des méthodes globales sans dérivées — plus lentes mais fonctionnent sur des objectifs discontinus ou bruités. gamultiobj trouve le front de Pareto pour les problèmes multiobjectifs, retournant un ensemble de solutions non dominées. Choisissez selon le lissage du problème, la dimensionnalité et le besoin de garanties d'optimalité globale.

matlab
% GlobalSearch / MultiStart for non-convex problems
f = @(x) x(1)^2 + x(2)^2 + 10*sin(x(1)) + 10*sin(x(2));
opts = optimoptions('fmincon', 'Algorithm','sqp');
problem = createOptimProblem('fmincon','objective',f, ...
    'x0',[0 0],'lb',[-5 -5],'ub',[5 5],'options',opts);
gs = GlobalSearch;
[x, fval] = run(gs, problem);

% genetic algorithm
[x, fval] = ga(f, 2, [], [], [], [], [-5 -5], [5 5]);

% particle swarm
[x, fval] = particleswarm(f, 2, [-5 -5], [5 5]);

% simulated annealing
[x, fval] = simulannealbnd(f, [0 0], [-5 -5], [5 5]);

% multiobjective (Pareto front)
f_multi = @(x) [x(1)^2 + x(2)^2, (x(1)-1)^2 + (x(2)-1)^2];
[x, fval] = gamultiobj(f_multi, 2, [], [], [], [], [-2 -2], [2 2]);
plot(fval(:,1), fval(:,2), 'o');

Ajustement de courbes & estimation de paramètres

fittype définit des modèles paramétriques personnalisés ; fit effectue la régression avec des heuristiques automatiques de point de départ. lsqcurvefit est le solveur de moindres carrés non linéaires de bas niveau — utile quand vous avez besoin d'un contrôle fin ou de Jacobiens personnalisés. confint et predint retournent les intervalles de confiance et de prédiction pour la quantification d'incertitude. L'application Curve Fitter (cftool) fournit une interface interactive pour explorer les ajustements. Vérifiez toujours les résidus pour une structure systématique suggérant une mauvaise spécification du modèle.

matlab
% fit a custom model to data
x = linspace(0, 5, 50);
y = 2*exp(-0.5*x) + 0.1*randn(size(x));

% define model and fit
model = fittype('a*exp(-b*x)', 'independent', 'x', ...
    'coefficients', {'a','b'});
f = fit(x', y', model, 'StartPoint', [1 1]);
plot(f, x, y);

% predefined models
f2 = fit(x', y', 'exp2');     % two-term exponential
f3 = fit(x', y', 'poly2');    % quadratic polynomial

% nonlinear least squares with lsqcurvefit
fun = @(p, xdata) p(1)*exp(-p(2)*xdata);
[p, resnorm] = lsqcurvefit(fun, [1 1], x, y);

% confidence intervals
ci = confint(f, 0.95);
predint(f, x', 0.95, 'observation', 'functional');

% smoothing spline
sf = fit(x', y', 'smoothingspline');

Optimisation entière & combinatoire

intlinprog résout les programmes linéaires en nombres mixtes — le cheval de bataille pour les problèmes de planification, routage et affectation. matchpairs résout le problème d'affectation optimalement en O(n^3). Le problème du voyageur de commerce nécessite l'élimination itérative de sous-tours car l'ensemble de contraintes est exponentiel. surrogateopt est pour les fonctions boîte noire coûteuses (par ex., simulations prenant des minutes par évaluation) — il construit un modèle de substitution et échantillonne intelligemment. Pour les problèmes combinatoires trop grands pour les méthodes exactes, envisagez ga ou des heuristiques personnalisées.

matlab
% mixed-integer linear programming (TSP-like problems)
f = [-3 -2];             % maximize 3x + 2y
A = [1 1; 2 1]; b = [4; 6];
intcon = 1:2;            % both variables integer
[x, fval] = intlinprog(f, intcon, A, b, [], [], [0;0]);

% assignment problem (Hungarian algorithm)
cost = [4 1 3; 2 3 4; 3 4 1];
[assignment, cost_total] = matchpairs(cost, false);

% traveling salesman via intlinprog
n = 8;  % cities
distances = rand(n, n); distances = distances + distances';
% (build subtour elimination constraints iteratively)

% knapsack
weights = [2 3 4 5]; values = [3 4 5 6];
W = 5;
f = -values;
A = weights; b = W;
intcon = 1:4;
[x, fval] = intlinprog(f, intcon, A, b, [], [], zeros(4,1), ones(4,1));

% surrogate optimization (expensive black-box)
obj = @(x) expensive_eval(x);
[x, fval] = surrogateopt(obj, lb, ub);

Flux de travail d'optimisation & bonnes pratiques

Choisir le bon solveur est la décision la plus importante — utiliser fmincon sur un programme linéaire gaspille des ordres de grandeur en performance. Fournir des gradients analytiques (via le framework basé sur les problèmes ou optimoptions) améliore considérablement la vitesse et la fiabilité. Mettre les variables à l'échelle de l'ordre 1 améliore le conditionnement. Vérifiez exitflag et firstorderopt pour confirmer la convergence. Le framework basé sur les problèmes (optimproblem, optimvar) est plus lisible et laisse MATLAB sélectionner automatiquement le solveur — préféré pour le nouveau code.

matlab
% 1. choose solver based on problem type
%    smooth? -> fminunc/fmincon
%    linear? -> linprog/intlinprog
%    integer? -> intlinprog
%    nonsmooth/global? -> ga/particleswarm/GlobalSearch

% 2. provide gradients and Jacobians when possible
f = @(x) x(1)^2 + x(2)^2;
gradf = @(x) [2*x(1); 2*x(2)];
prob = optimproblem('Objective', f);
prob.Objective.Gradient = gradf;

% 3. scale variables to ~[1, 1]
x_scaled = (x - x0) / scale;

% 4. check optimality and feasibility
output.exitflag       % 1 = converged
output.firstorderopt  % should be near 0

% 5. warm start sequential problems
opts = optimoptions('quadprog','ObjectiveLimit',1e-8);
x_new = quadprog(H, c, A, b, [], [], lb, ub, x_old, opts);

% 6. use problem-based framework (cleaner)
x = optimvar('x', 2, 'LowerBound', 0);
prob = optimproblem('Objective', x(1)^2 + x(2)^2);
prob.Constraints.c1 = x(1) + x(2) >= 1;
sol = solve(prob);
15

Calcul parallèle

Boucles parfor & pools parallèles

parfor est le chemin le plus facile vers le parallélisme — il distribue les itérations de boucle sur les workers. Les itérations doivent être indépendantes (pas d'itération k dépendant de k-1). Les variables sont classées : variables de boucle (k), sliced (indexées par k seul sur première/dernière dim), broadcast (lecture seule) et reduction (combinées avec op associative comme + ou *). La surcoût de communication signifie que parfor aide seulement quand chaque itération fait un travail substantiel. Démarrez le pool une fois ; réutilisez-le à travers les boucles parfor pour éviter le coût de démarrage.

matlab
% start a parallel pool (workers = CPU cores)
pool = gcp('nocreate');
if isempty(pool)
    parpool;  % start default pool
end

% parfor: parallel for loop
n = 1e6;
results = zeros(1, n);
parfor k = 1:n
    results(k) = expensive_computation(k);
end

% restrictions:
% - iterations must be independent (no data dependencies)
% - variables classified as loop, sliced, broadcast, reduction
% - cannot break/continue

% reduction variables (combine results)
total = 0;
parfor k = 1:n
    total = total + compute(k);
end

% sliced variables (each iteration writes distinct element)
out = zeros(n, 1);
parfor k = 1:n
    out(k) = k^2;
end

% control pool size
delete(gcp('nocreate'));  % shut down
parpool('local', 4);      % 4 workers

spmd & tableaux distribués

spmd exécute le même code sur tous les workers avec labidx identifiant chacun — utile pour les algorithmes data-parallel où chaque worker traite un morceau. Les variables Composite (A{1}, A{2}) contiennent les résultats par worker. Les tableaux distribués étalent un seul tableau logique sur les workers ; localpart donne le morceau local. labSendrecv et gcat/gplus permettent la communication inter-workers. Utilisez spmd pour le parallélisme à grain fin que parfor ne peut pas exprimer (par ex., algorithmes itératifs nécessitant communication).

matlab
% spmd: single program, multiple data
spmd
    labidx              % worker index (1 to n)
    numlabs             % total workers
    A = rand(1000) * labidx;
    % each lab has its own A
end

% access Composite (per-worker data)
A{1}                    % A from worker 1
A{2}                    % A from worker 2

% distributed arrays (spread across workers)
D = distributed.rand(10000);
size(D)                 % 10000x10000 total
L = localpart(D);       % this worker's chunk

% communicate between labs
spmd
    data = rand(100, 1);
    % send to next lab, receive from previous
    next_lab = mod(labidx, numlabs) + 1;
    prev_lab = mod(labidx - 2, numlabs) + 1;
    rcvd = labSendrecv(data, next_lab, prev_lab);
end

% gather distributed to local
D = distributed.rand(1000);
full_matrix = gather(D);

Calcul GPU

gpuArray transfère les données vers le GPU ; les opérations ultérieures s'y exécutent et y restent jusqu'à ce que gather() ramène les résultats. La plupart des fonctions élément par élément et d'algèbre linéaire sont GPU-enabled. arrayfun exécute des fonctions personnalisées élément par élément sur le GPU (mais seulement avec des opérations scalaires). Pour les systèmes multi-GPU, assignez chaque worker parfor à un GPU différent via gpuDevice(k). Le calcul GPU excelle en algèbre linéaire dense et opérations élément par élément ; la surcoût de transfert de données le rend inefficace pour les petits tableaux.

matlab
% move data to GPU
A = gpuArray(rand(10000));
B = gpuArray(eye(10000));

% operations execute on GPU
C = A * B;              % GPU matrix multiply
D = A + B;
E = sum(A, 1);

% gather results back to CPU
C_cpu = gather(C);

% many built-in functions are GPU-enabled
x = gpuArray.linspace(-10, 10, 1e6);
y = sin(x) .* exp(-x.^2);

% arrayfun on GPU (custom element-wise functions)
f = @(a, b) a.^2 + b.^2;
result = arrayfun(f, A, B);

% check GPU
gpuDevice            % info about current GPU
gpuDeviceCount       % number of available GPUs

% page multiple GPUs
parfor k = 1:4
    gpuDevice(k);
    A = gpuArray(rand(5000));
    % ... compute on GPU k
end

batch & planification de jobs

batch exécute une fonction asynchrone en arrière-plan — utile pour les longs calculs que vous ne voulez pas bloquer la session. batch avec l'option 'Pool' exécute une fonction qui utilise elle-même parfor. L'API job/task de bas niveau donne un contrôle fin sur la planification. parcluster sélectionne un profil de cluster ; MATLAB s'intègre à SLURM, PBS et LSF via l'interface de planificateur générique du Parallel Computing Toolbox. Pour le HPC, sauvegardez les données dans des fichiers et soumettez des scripts plutôt que de compter sur la mémoire partagée.

matlab
% run a function in background
job = batch(@my_function, 0, {arg1, arg2});

% check status
job.State              % 'queued', 'running', 'finished'
wait(job);             % block until done
load(job);             % retrieve results

% batch with parfor inside
job = batch(@my_parfor_func, 1, {input_data}, 'Pool', 4);

% job and task objects (lower-level)
job = createJob(pool);
task = createTask(job, @my_func, 1, {arg1});
submit(job);
wait(job);
result = fetchOutputs(task);

% cluster types
% 'local' - on this machine
% 'MJS' - MATLAB Job Scheduler (server cluster)
% 'SLURM'/'PBS' - HPC scheduler integration
c = parcluster('local');
c.NumWorkers = 8;
c.saveProfile;

Performance & profilage du code parallèle

Profilez le code parallèle avec profile on -parallel pour voir les chronologies par worker. L'accélération est limitée par la loi d'Amdahl : si 10% du code est sériel, l'accélération max est 10x quel que soit le nombre de workers. Pièges courants : itérations trop petites (la surcoût dépasse le travail), grandes variables broadcast (coût de transfert) et opérations de reduction excessives. parallel.pool.DataQueue permet les mises à jour de progression en direct depuis les workers sans bloquer — utile pour surveiller les longs jobs parallèles. Mesurez toujours avant et après pour vérifier que le parallélisme aide réellement.

matlab
% profile parallel code
profile on -parallel
parfor k = 1:100
    compute(k);
end
profile off
profview                % visualize

% measure speedup
tic;
serial_result = serial_compute();
t_serial = toc;

tic;
parfor_result = parallel_compute();
t_parallel = toc;

speedup = t_serial / t_parallel;
fprintf('Speedup: %.2fx using %d workers
', speedup, pool.NumWorkers);

% avoid common pitfalls:
% 1. too little work per iteration (overhead dominates)
% 2. large broadcast variables (transfer cost)
% 3. false sharing via reduction variables

% data queue for live updates from workers
Q = parallel.pool.DataQueue;
afterEach(Q, @update_plot);
parfor k = 1:n
    % ... compute ...
    send(Q, partial_result);
end
16

Programmation orientée objet

Classes & propriétés

Les classes MATLAB vivent dans des fichiers nommés ClassName.m. Le bloc classdef contient les propriétés et méthodes. Les attributs de propriété contrôlent l'accès : SetAccess=protected signifie que seules les méthodes de classe peuvent écrire ; Constant définit des constantes de niveau classe. Le constructeur est une méthode avec le nom de la classe. MATLAB utilise la sémantique de valeur par défaut (les objets sont copiés à l'affectation) — utilisez des classes handle pour la sémantique de référence. Les méthodes surchargées comme disp personnalisent le comportement par défaut.

matlab
% class definition in a file named Point.m
classdef Point
    properties
        x = 0       % public, with default
        y = 0
    end
    properties (SetAccess = protected)
        id          % settable only by class methods
    end
    properties (Constant)
        PI = 3.14159
    end

    methods
        function obj = Point(x, y)
            if nargin > 0
                obj.x = x;
                obj.y = y;
            end
            obj.id = randi(1e6);
        end

        function r = distance(obj)
            r = sqrt(obj.x^2 + obj.y^2);
        end

        function disp(obj)
            fprintf('Point(%.2f, %.2f) [id=%d]
', ...
                obj.x, obj.y, obj.id);
        end
    end
end

% usage
p = Point(3, 4);
p.distance()           % 5
disp(p)

Classes handle vs valeur

Le choix entre classes valeur et handle est fondamental. Les classes valeur (défaut) copient à l'affectation et aux appels de méthode — plus sûres pour les données immuables. Les classes handle (sous-classe de handle) sont des références : les affectations et copies pointent vers le même objet, comme les objets Java/Python. Les classes handle sont nécessaires pour les composants GUI, handles de fichiers et état mutable partagé entre appelants. Utilisez les classes valeur pour les objets mathématiques (vecteurs, matrices) où l'immuabilité est souhaitable.

matlab
% value class (default): copies on assignment
classdef Vec
    properties
        data
    end
    methods
        function obj = Vec(d)
            obj.data = d;
        end
    end
end

v1 = Vec([1 2 3]);
v2 = v1;             % COPY
v2.data = [4 5 6];
disp(v1.data)        % still [1 2 3]

% handle class: references shared
classdef HVec < handle
    properties
        data
    end
    methods
        function obj = HVec(d)
            obj.data = d;
        end
    end
end

h1 = HVec([1 2 3]);
h2 = h1;             % REFERENCE (same object)
h2.data = [4 5 6];
disp(h1.data)        % [4 5 6] - changed!

% handle classes support delete method
% isequal(h1, h2) -> true (same object)

Héritage & polymorphisme

L'héritage utilise < dans la ligne classdef ; obj@SuperClass(args) appelle le constructeur de la superclasse. MATLAB supporte l'héritage multiple mais c'est rare et peut conduire à des problèmes en losange. Les méthodes abstraites (déclarées dans methods (Abstract)) doivent être implémentées par les sous-classes ; la classe de base ne peut pas être instanciée. Le polymorphisme fonctionne naturellement : appelez la méthode sur n'importe quel objet et MATLAB dispatche vers la bonne implémentation. Utilisez isa(obj, 'ClassName') et isprop/ismethod pour les vérifications de type à l'exécution.

matlab
% single inheritance
classdef Dog < Animal
    methods
        function obj = Dog(name)
            obj@Animal(name);  % call superclass constructor
        end
        function sound(obj)
            disp([obj.name ' says Woof']);
        end
    end
end

% multiple inheritance
classdef FlyingFish < Fish & Bird
    methods
        function obj = FlyingFish(name)
            obj@Fish(name);
            obj@Bird(name);
        end
    end
end

% abstract methods and classes
classdef Shape
    methods (Abstract)
        area(obj)
        perimeter(obj)
    end
end

classdef Circle < Shape
    properties
        radius
    end
    methods
        function obj = Circle(r)
            obj.radius = r;
        end
        function a = area(obj)
            a = pi * obj.radius^2;
        end
        function p = perimeter(obj)
            p = 2 * pi * obj.radius;
        end
    end
end

% polymorphism
shapes = {Circle(2), Square(3)};
for k = 1:numel(shapes)
    fprintf('Area: %.2f
', shapes{k}.area());
end

Événements & écouteurs

Le modèle d'événements implémente le pattern observer : les classes déclarent des événements, les écouteurs enregistrent des callbacks, et notify déclenche les événements. Cela découple les producteurs des consommateurs — essentiel pour les GUI, simulations et systèmes réactifs. Les méthodes set de propriété (set.PropertyName) interceptent les affectations et peuvent déclencher des événements. Les écouteurs peuvent être temporaires (addlistener, liés à la durée de vie de l'objet) ou persistants (objet listener maintenu dans une variable). Supprimez toujours les écouteurs quand terminé pour prévenir les fuites de mémoire.

matlab
classdef TemperatureSensor < handle
    properties
        Temperature = 20
    end
    events
        TemperatureChanged
        Overheated
    end
    methods
        function set.Temperature(obj, t)
            obj.Temperature = t;
            notify(obj, 'TemperatureChanged');
            if t > 100
                notify(obj, 'Overheated');
            end
        end
        function obj = TemperatureSensor()
            % nothing
        end
    end
end

% create sensor and listen
s = TemperatureSensor();
addlistener(s, 'TemperatureChanged', @onTempChanged);
addlistener(s, 'Overheated', @onOverheat);

function onTempChanged(src, event)
    fprintf('Temp now: %.1f
', src.Temperature);
end

function onOverheat(src, event)
    warning('Overheated at %.1f!', src.Temperature);
end

% trigger
s.Temperature = 25;     % prints "Temp now: 25.0"
s.Temperature = 105;    % prints temp + warning

Surcharge d'opérateurs & indexation

La surcharge d'opérateurs permet aux classes utilisateur de fonctionner avec +, *, [], etc. Chaque opérateur correspond à une fonction (plus, mtimes, minus, mrdivide, horzcat, vertcat). subsref et subsasgn personnalisent l'indexation (obj(i), obj.field, obj{i}). Le MATLAB moderne préfère la notation point pour l'accès aux propriétés, mais subsref/subsasgn sont encore nécessaires pour les patterns de fausse indexation (par ex., une bibliothèque de tenseurs où T(1,2,3) extrait un élément). Surchargez disp pour une sortie lisible et end/numel pour une sémantique d'indexation personnalisée.

matlab
classdef Complex
    properties
        re
        im
    end
    methods
        function obj = Complex(re, im)
            obj.re = re; obj.im = im;
        end
        function r = plus(a, b)            % a + b
            r = Complex(a.re + b.re, a.im + b.im);
        end
        function r = mtimes(a, b)          % a * b
            r = Complex(a.re*b.re - a.im*b.im, ...
                        a.re*b.im + a.im*b.re);
        end
        function r = abs(obj)              % |obj|
            r = sqrt(obj.re^2 + obj.im^2);
        end
        function disp(obj)
            fprintf('%.2f %+.2fi
', obj.re, obj.im);
        end
    end
    methods
        function r = subsref(obj, S)       % obj(...)
            if strcmp(S(1).type, '()')
                r = obj.re + 1i*obj.im;
            end
        end
        function obj = subsasgn(obj, S, val)  % obj(...) = val
            % custom assignment
        end
    end
end

c1 = Complex(1, 2); c2 = Complex(3, 4);
c3 = c1 + c2;          % uses plus
c4 = c1 * c2;          % uses mtimes
abs(c1)                % uses abs
17

Débogage & optimisation des performances

Débogueur & points d'arrêt

dbstop définit les points d'arrêt — l'outil de débogage le plus puissant. Les points d'arrêt conditionnels (dbstop ... if condition) ne s'arrêtent que quand un prédicat est vrai, essentiel pour trouver des bugs dans les grandes boucles. dbstop if error transforme toute exception non capturée en pause de débogage, vous permettant d'inspecter le workspace au point d'échec. L'objet ME (MException) dans les blocs catch transporte .message, .identifier et .stack pour une gestion d'erreur riche. Utilisez dbstack pour naviguer dans la pile d'appels et dbup/dbdown pour inspecter les workspaces appelants.

matlab
% set breakpoints in the Editor or programmatically
dbstop in my_function at 42      % line 42 of my_function.m
dbstop in my_function at 42 if x > 10  % conditional
dbstop if error                  % pause on any error
dbstop if naninf                 % pause on NaN/Inf
dbstop if warning                % pause on warnings
dbclear all                      % clear all breakpoints
dbclear in my_function           % clear in one file

% at a breakpoint, the command window enters debug mode K>>
whos                             % inspect workspace
x                                % view variables
dbstep                           % step to next line
dbstep in                        % step into function
dbstep out                       % step out of function
dbcont                           % continue execution
dbstack                          % show call stack
dbup / dbdown                    % move up/down stack frames
dbquit                           % exit debug mode

% error recovery
try
    risky_operation();
catch ME
    fprintf('Error: %s
', ME.message);
    fprintf('Stack:
');
    for k = 1:numel(ME.stack)
        fprintf('  %s (line %d)
', ME.stack(k).name, ME.stack(k).line);
    end
end

Profilage & détection de points chauds

Le profiler (profile on/off + profile viewer) montre où le temps est passé, ligne par ligne — l'outil d'optimisation le plus important. Profilez toujours avant d'optimiser ; l'intuition sur les goulots d'étranglement est souvent fausse. timeit est plus précis que tic/toc pour les microbenchmarks car il exécute la fonction plusieurs fois et tient compte de la surcoût. L'option -memory suit les allocations, utile pour trouver les fuites de mémoire ou la copie excessive. Concentrez l'effort d'optimisation sur les quelques lignes chaudes du haut pour un impact maximum.

matlab
% profile a script or function
profile on
my_expensive_script();
profile off

% view results
profile viewer                 % GUI
p = profile('info');           % structure
profsave(p, 'profile_results'); % HTML report

% time individual operations
tic; A = rand(5000); A = A * A; toc;   % ~0.5s

% timeit for accurate single-function timing
f = @() sort(rand(1e6,1));
t = timeit(f);

% memory profiling
profile on -memory
% ... run code ...
profile viewer   % shows memory allocation

% identify bottlenecks
% 1. profile viewer shows time per function/line
% 2. focus on the top few hottest lines
% 3. vectorize, preallocate, or use MEX for those

Vectorisation & préallocation

Les trois plus grands gains de performance dans MATLAB : (1) préallouer les tableaux avant de les remplir dans des boucles (zeros, NaN, cell), (2) vectoriser les opérations pour exploiter BLAS/LAPACK, et (3) utiliser des patterns favorables au JIT (les boucles simples sont maintenant rapides, mais agrandir des tableaux reste O(n^2)). L'indexation logique remplace les boucles if/else par une seule affectation vectorisée. Évitez arrayfun sauf si vous avez besoin de son support GPU — les boucles préallouées simples sont souvent plus rapides. Mesurez avec tic/toc ou timeit pour vérifier les améliorations.

matlab
% BAD: growing array in loop
tic;
s = [];
for k = 1:100000
    s = [s, k^2];     % reallocates every iteration!
end
toc;                  % ~10 seconds

% GOOD: preallocate
tic;
s = zeros(1, 100000);
for k = 1:100000
    s(k) = k^2;
end
toc;                  % ~0.01 seconds

% BEST: vectorize
tic;
s = (1:100000).^2;
toc;                  % ~0.001 seconds

% vectorize conditional logic
x = rand(10000, 1);
% BAD:
% for k = 1:numel(x)
%     if x(k) > 0.5, y(k) = 1; else, y(k) = 0; end
% end
% GOOD:
y = double(x > 0.5);

% vectorize with logical indexing
y = zeros(size(x));
y(x > 0.5) = 1;
y(x > 0.8) = 2;

% use arrayfun/gpuArray only when truly needed
% (loops with preallocation are often faster than arrayfun)

Fichiers MEX & intégration C

Les fichiers MEX vous permettent d'appeler C/C++/Fortran depuis MATLAB — essentiel quand une boucle critique ne peut pas être vectorisée ou pour envelopper des bibliothèques existantes. mex compile un fichier C en binaire .mexw64 (Windows) ou .mexa64 (Linux). La C++ MATLAB Data API moderne (R2018a+) est type-safe et plus propre que l'ancienne API mxGetPr/mxCreate. Pour appeler MATLAB depuis des applications externes, utilisez la MATLAB Engine API ou le MATLAB Compiler SDK. loadlibrary enveloppe les bibliothèques partagées génériques sans compilation. Profilez d'abord — ne MEX-ifiez que le vrai goulot d'étranglement.

matlab
% call C/C++/Fortran code from MATLAB via MEX
% write a C file (my_func.c):
/*
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
    double *x = mxGetPr(prhs[0]);
    size_t n = mxGetNumberOfElements(prhs[0]);
    plhs[0] = mxCreateDoubleMatrix(n, 1, mxREAL);
    double *y = mxGetPr(plhs[0]);
    for (size_t k = 0; k < n; k++) y[k] = x[k] * x[k];
}
*/

% compile
mex my_func.c           % produces my_func.mexw64
% usage:
y = my_func([1 2 3]);   % [1 4 9]

% C++ with MATLAB Data API (modern, R2018a+)
% #include "mex.hpp", "mexAdapter.hpp"
% use matlab::data::TypedArray<double>

% call MATLAB from C/C++ application (MATLAB Engine API)
% #include "engine.h"
% eng = engOpen("");
% engPutVariable(eng, "x", x);
% engEvalString(eng, "y = sqrt(x)");

% loadlibrary for generic shared libraries
loadlibrary('mylib.dll', 'mylib.h');
calllib('mylib', 'my_function', arg);
unloadlibrary('mylib');

Gestion de la mémoire & grandes données

La mémoire est souvent le goulot d'étranglement pour les grands calculs. Utilisez single au lieu de double pour halver la mémoire et doubler le débit. Les matrices creuses stockent uniquement les non-zéros. memmapfile mappe un fichier binaire en mémoire sans le charger — parfait pour les grands jeux de données accédés séquentiellement. Les tall arrays (avec datastore) traitent les données par morceaux qui ne tiennent pas en RAM, utilisant MapReduce en interne. Depuis R2018b, MATLAB peut faire certaines opérations en place (A = A + 1) sans copie, mais A(:) = ... explicite le garantit. Libérez toujours les grandes variables quand terminé.

matlab
% check memory usage
[usr, sys] = memory;
disp(usr.PhysicalMemory.Available);

% view variable sizes
whos                  % all variables with sizes
[x_size, x_bytes] = compute_size(x);

% clear large variables when done
clear big_array;

% use single precision when possible
A = rand(5000, 'single');   % half the memory of double
B = A * A;                   % single precision matmul

% sparse for mostly-zero matrices
S = sparse(1e5, 1e5);
S(1, 1) = 1;

% memory-mapped files for huge data
m = memmapfile('large.bin', 'Format', 'double', 'Offset', 0, ...
    'Repeat', 1e8);
m.Data(1)              % access without loading all

% tall arrays for out-of-core
ds = datastore('big.csv');
t = tall(ds);
mean_t = mean(t.Var1);
gather(mean_t);        % triggers computation

% avoid copies: in-place operations
A = A + 1;             % may modify A in place (since R2018b)
A(:) = A(:) + 1;       % definitely in place
18

Tracé avancé

Subplots et tiledlayout

tiledlayout (R2019b+) est le remplaçant moderne de subplot — meilleur espacement, spanning plus facile et titres partagés via title(..., 'tiledtitle'). nexttile([1 2]) s'étend sur plusieurs tuiles. subplot(n, m, k) fonctionne encore pour le code hérité mais est moins flexible.

matlab
% tiledlayout (R2019b+) replaces subplot
tiledlayout(2, 3, 'TileSpacing', 'compact', 'Padding', 'compact');

nexttile; plot(1:10);
nexttile; scatter(rand(1, 50), rand(1, 50));
nexttile; bar(rand(5, 3));
nexttile; imagesc(magic(10));
nexttile; histogram(randn(1000, 1), 30);
nexttile; pie([30 20 50]);

% span multiple tiles
nexttile(7, [1 2]); plot(sin(0:0.1:2*pi));

% shared title and labels
title('Dashboard Demo');
xlabel('X'); ylabel('Y');

% legacy subplot
subplot(2, 2, 1); plot(1:10);
subplot(2, 2, 2); plot(10:-1:1);

Personnalisation des axes

La plupart des propriétés d'axe sont accessibles via le handle d'axes (gca). xlim/ylim définissent les limites ; xticks/xticklabels contrôlent les positions et étiquettes de graduation. Le balisage TeX comme \pi rend les lettres grecques. set(gca, ...) est la syntaxe héritée ; ax.Property = value est l'équivalent moderne (R2014b+).

matlab
x = linspace(0, 2*pi, 100);
plot(x, sin(x));

% axis limits
xlim([0 2*pi]); ylim([-1.2 1.2]);

% ticks and labels
xticks(0:pi/2:2*pi);
xticklabels({'0', '\pi/2', '\pi', '3\pi/2', '2\pi'});

% grid and minor grid
grid on; grid minor on;

% axis appearance
box on;
ax = gca;
ax.FontSize = 12;
ax.FontName = 'Courier';
ax.LineWidth = 1.5;
ax.XColor = [0.5 0.5 0.5];
ax.YDir = 'reverse';

% log scale
semilogy(1:100, 2.^(1:100));
set(gca, 'YScale', 'log');

Tracés multiples et légende

hold on vous permet de superposer plusieurs tracés sur les mêmes axes — terminez toujours par hold off pour éviter les surprises. 'Location', 'best' choisit le coin avec le moins de chevauchement. L'option 'Interpreter', 'latex' active les maths LaTeX complètes. Passez des handles de ligne spécifiques à legend pour n'inclure que certains tracés.

matlab
x = linspace(0, 2*pi, 100);
y1 = sin(x); y2 = cos(x); y3 = sin(x) + cos(x);

% hold on for multiple lines
plot(x, y1, 'r-', 'LineWidth', 2); hold on;
plot(x, y2, 'b--', 'LineWidth', 2);
plot(x, y3, 'g:', 'LineWidth', 2); hold off;

% legend with location
legend('sin(x)', 'cos(x)', 'sin+cos', ...
       'Location', 'best', 'Orientation', 'horizontal');

% legend with TeX
legend('$\sin(x)$', '$\cos(x)$', 'Interpreter', 'latex');

% specify which lines to include
h1 = plot(x, y1); hold on;
h2 = plot(x, y2);
h3 = plot(x, y3);
legend([h1 h3], 'sin', 'sin+cos');

Tracé 3D

surf dessine une surface colorée ; mesh dessine un fil de fer. contour et contourf montrent des projections 2D ; clabel ajoute des étiquettes. plot3 trace des courbes paramétriques 3D. view(az, el) définit l'angle de caméra (azimuth, élévation en degrés). shading interp lisse les transitions de couleur.

matlab
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);

% surface plot
figure;
surf(X, Y, Z);
colorbar; shading interp;

% mesh plot (wireframe)
figure;
mesh(X, Y, Z);
hidden off;                      % show hidden lines

% contour
figure;
contour(X, Y, Z, 20); colorbar;
contourf(X, Y, Z, 20); colorbar; % filled
[c, h] = contour(X, Y, Z, 20); clabel(c, h);

% 3D parametric
t = 0:0.01:10;
plot3(sin(t), cos(t), t);
xlabel('x'); ylabel('y'); zlabel('z');
view(45, 30);                    % azimuth, elevation

Animations et films

Les animations mettent à jour les données de tracé dans une boucle avec drawnow pour rafraîchir. Pour une vidéo fluide, utilisez VideoWriter (remplace l'avifile déprécié). getframe capture la figure courante comme image. Définissez FrameRate avant d'ouvrir la vidéo. Fermez toujours close(v) quand terminé pour vider le fichier.

matlab
% animate a sine wave
figure;
h = plot(NaN, NaN);
xlim([0 2*pi]); ylim([-1 1]);

for k = 1:100
  x = linspace(0, 2*pi, k);
  set(h, 'XData', x, 'YData', sin(x));
  drawnow;
end

% capture frames and save as video
v = VideoWriter('animation.mp4', 'MPEG-4');
v.FrameRate = 30; open(v);

for k = 1:60
  plot(sin(0:0.1:k/10));
  frame = getframe(gcf);
  writeVideo(v, frame);
end
close(v);

% getframe for static snapshots
figure; plot(1:10);
frame = getframe;                % struct with cdata
19

Opérations matricielles avancées

Bases d'algèbre linéaire

Utilisez toujours A\b (antislash) pour résoudre les systèmes linéaires — il dispatche vers la bonne factorisation (LU, Cholesky, QR) selon la matrice. inv(A)*b est plus lent et numériquement pire. eig retourne les vecteurs propres comme colonnes de V et les valeurs propres sur la diagonale de D. expm est l'exponentielle matricielle (différente de l'exp élément par élément).

matlab
A = [1 2; 3 4];
b = [5; 6];

% solve Ax = b
x = A \ b;                       % preferred (LU-based)
x = inv(A) * b;                  % avoid — slower, less stable

% factorizations
[L, U, P] = lu(A);               % PA = LU
[Q, R] = qr(A);                  % A = QR
[V, D] = eig(A);                 % A V = V D
[U, S, V] = svd(A);              % A = U S V'

% properties
det(A); trace(A); rank(A); cond(A);
null(A);                         % null space
orth(A);                         % orthonormal basis of range

% matrix functions
expm(A); logm(A); sqrtm(A);      % matrix (not element-wise)

Opérations élément par élément vs matricielles

Le préfixe point (.*) signifie élément par élément ; sans lui, les opérations sont matricielles. Le bug MATLAB le plus courant : x*x où x est un vecteur ligne — utilisez x*x' pour le produit scalaire ou x.*x pour le carré élément par élément. ' est la transposée conjuguée (inverse le signe des parties imaginaires) ; .' est la transposée simple.

matlab
A = [1 2; 3 4];
B = [5 6; 7 8];

% element-wise (use .)
A .* B                           % [5 12; 21 32]
A ./ B                           % element-wise divide
A .^ 2                           % [1 4; 9 16]
A .^ B                           % element-wise power

% matrix ops (no .)
A * B                            % matrix product
A / B                            % A * inv(B)
A \ B                            % inv(A) * B
A^2                              % A * A (matrix power)
A'                               % conjugate transpose
A.'                              % non-conjugate transpose

% common gotcha
x = [1 2 3];
x * x                            % ERROR: inner dims mismatch
x * x'                           % 14 (dot product)
x .* x                           % [1 4 9] (element-wise)

Reshaping et indexation

MATLAB stocke les matrices en colonne-major, donc A(5) dans une 4x4 est A(1, 2). L'indexation logique (A(mask)) est puissante et rapide — extrait ou modifie les éléments correspondant à une condition sans boucles. reshape exige que le nombre total d'éléments corresponde. permute généralise la transposition aux tableaux N-D.

matlab
A = magic(4);                  % 4x4 matrix

% linear indexing (column-major)
A(5)                             % A(1, 2)
A(:)                             % column vector of all elements
A(2:5)                           % elements 2-5

% submatrix
A(1:2, 2:4)                      % rows 1-2, cols 2-4
A(:, 3)                          % all rows, col 3
A(end, :)                        % last row
A(1:2:end, :)                    % odd rows (stride)

% logical indexing
mask = A > 10;
A(mask)                          % flat list of values > 10
A(A > 10) = 0;                   % threshold in-place

% reshape, permute, flip
B = reshape(A, 2, 8);
C = permute(A, [2 1]);           % transpose N-D
flip(A); flipud(A); fliplr(A);
repmat(A, 2, 3);                 % tile 2x3

Matrices creuses

Les matrices creuses stockent uniquement les éléments non nuls — essentielles pour les grandes matrices principalement composées de zéros (par ex., issues de discrétisations d'EDP). Les opérations préservent la creuseté quand possible. L'antislash S\b utilise un solveur direct creux (UMFPACK) — bien plus rapide et économe en mémoire que full()\b pour les grands systèmes creux. spy visualise le motif de creusement.

matlab
% create sparse
S = sparse(1000, 1000);
S(1, 1) = 5;
S(500, 500) = 10;

% from triplets
i = [1 2 3 4];
j = [1 2 3 4];
v = [10 20 30 40];
S = sparse(i, j, v, 4, 4);

% sparse identity and diagonal
S = speye(1000);
S = spdiags(ones(1000, 1), 0, 1000, 1000);

% operations stay sparse
S = S + S';
S = S * S;
x = S \ b;                       % uses sparse solver

% convert
F = full(S);                     % sparse -> full
S = sparse(F);                   % full -> sparse
nnz(S)                           % count non-zeros
spy(S)                           % visualize sparsity

Broadcasting (expansion implicite)

Depuis R2016b, MATLAB broadcaste automatiquement (comme NumPy) — les dimensions de taille 1 s'étendent pour correspondre. Avant cela, vous aviez besoin de bsxfun. Le broadcasting rend le code plus propre : M - mean(M, 2) centre chaque ligne sans repmat. Les dimensions doivent être compatibles (égales ou une d'entre elles est 1).

matlab
% R2016b+ — automatic broadcasting
A = magic(3);                    % 3x3
b = [1 2 3];                     % 1x3

% older MATLAB: error (dims mismatch)
% modern MATLAB: b is broadcast across rows
C = A + b;                       % 3x3 result
C = A - b';
C = A .* b;

% common uses
x = (1:5)';                      % column
y = (1:5);                       % row
outer = x * y;                   % 5x5 outer product
grid = x + y;                    % 5x5 addition grid

% mean across rows
M = magic(5);
row_means = mean(M, 2);          % 5x1
centered = M - row_means;        % broadcast subtraction

% bsxfun (legacy, pre-R2016b)
C = bsxfun(@plus, A, b);         % same as A + b
20

Cell arrays & structs

Cell arrays

Les cell arrays contiennent des types mixtes. Utilisez {} pour accéder au contenu (supprime l'enveloppe cell) et () pour obtenir une sous-cell. cellfun applique une fonction à chaque cell — passez 'UniformOutput', false si les résultats sont hétérogènes. Les cell arrays sont la façon standard de contenir des chaînes de longueurs différentes (avant les string arrays).

matlab
% heterogeneous container
C = {'hello', 42, [1 2 3], magic(3)};

% access
C{1}                             % 'hello' (contents)
C(1)                             % {1x1 cell} (cell)
C{4}(2, 2)                       % access inside

% build dynamically
C = {};
for k = 1:5
  C{k} = rand(k);
end

% multi-element
[a, b, c] = C{1:3};              % unpack
C{1:3}                           % comma-separated list

% cellfun
nums = {1, 2, 3, 4};
squared = cellfun(@(x) x^2, nums);
lengths = cellfun(@length, C);

% convert
cell([1 2 3])                    % {1, 2, 3}
cell2mat({1 2; 3 4})             % [1 2; 3 4]
mat2cell(magic(4), [2 2], [2 2]) % 2x2 cell of blocks

Tableaux de structs

Les structs regroupent des champs nommés de tout type. Les tableaux de structs contiennent plusieurs enregistrements — {arr.field} rassemble un champ à travers tous les éléments dans un cell, [arr.field] dans un tableau régulier (si compatible). Les champs imbriqués utilisent le chaînage point. fieldnames liste les champs ; rmfield retourne une copie sans le champ.

matlab
% scalar struct
s.name = 'Alice';
s.age = 30;
s.scores = [90 85 92];

% struct constructor
s = struct('name', 'Bob', 'age', 25, 'scores', {[80 70]});

% struct array
students(1).name = 'Alice';
students(1).age = 30;
students(2).name = 'Bob';
students(2).age = 25;

% access across array
names = {students.name};         % all names (cell)
ages = [students.age];           % all ages (vector)

% nested
s.course.code = 'CS101';
s.course.credits = 3;
s.course.instructor.name = 'Dr. Smith';

% field operations
fieldnames(s)                    % list fields
isfield(s, 'age')                % check field
rmfield(s, 'age')                % remove field
orderfields(s)                   % sort fields

Tables (données tabulaires)

Les Tables (R2013b+) sont la façon moderne de contenir des données tabulaires — comme un DataFrame dans pandas. Accédez aux colonnes par nom (T.Age) ou index (T.(2)). sortrows trie par une ou plusieurs colonnes. readtable/writetable gèrent CSV, Excel, etc. summary donne des stats par colonne. Préférez les tables aux matrices brutes pour les données hétérogènes.

matlab
% create table
Names = {'Alice'; 'Bob'; 'Carol'};
Age = [30; 25; 42];
Score = [90; 80; 95];
T = table(Names, Age, Score);

% access
T.Age                            % column as vector
T.(2)                            % column by index
T{1, 2}                          % row 1, col 2 (cell-style)
T(1:2, :)                        % first 2 rows

% add/remove columns
T.Grade = {'A'; 'B'; 'A'};
T.Grade = [];                    % remove column

% filtering
T(T.Age > 26, :)                 % rows where Age > 26
find(T.Age > 26);

% sorting
T = sortrows(T, 'Age');
T = sortrows(T, {'Age', 'Score'}, 'descend');

% summary
summary(T)
T.Properties.VariableNames

% read/write
T = readtable('data.csv');
writetable(T, 'out.csv')

Timetables

Les Timetables (R2016b+) sont des tables avec horodatages de lignes. retime rééchantillonne/agrège (par ex., 'hourly', 'daily', ou TimeStep personnalisé). synchronize aligne plusieurs timetables sur un vecteur de temps commun. lag/lead décalent les colonnes. Bien plus propre que de gérer manuellement les indices de temps dans des matrices.

matlab
% create timetable with timestamps
Time = datetime(2024, 1, 1) + hours(0:23)';
Temp = 20 + 5 * randn(24, 1);
TT = timetable(Time, Temp);

% indexing by time
TT.timerange(datetime(2024,1,1,6,0,0), datetime(2024,1,1,12,0,0))
TT(datetime(2024,1,1,10,0,0), :) % row at specific time
TT('2024-01-01 10:00:00', :)

% resample / synchronize
TT_30min = retime(TT, 'regular', 'mean', 'TimeStep', minutes(30));
TT_hourly = retime(TT, 'hourly', 'mean');

% aggregate
TT_daily = retime(TT, 'daily', @mean);
TT_daily_max = retime(TT, 'daily', 'max');

% combine timetables
TT2 = synchronize(TT1, TT2, 'union');

% lagging
TT.PrevTemp = lag(TT.Temp, 1);

Maps (dictionnaires)

containers.Map est le hash map hérité — fonctionne dans toutes les versions MATLAB mais plus lent et non typé. dictionary (R2022b+) est le remplaçant moderne : typé, plus rapide et supporte la recherche vectorisée. Utilisez les maps quand vous avez besoin de recherche O(1) par clé au lieu de chercher dans un tableau de structs ou cell.

matlab
% containers.Map (pre-R2022b)
m = containers.Map;
m('apple') = 1;
m('banana') = 2;
m('cherry') = 3;

% access
m('apple')                       % 1
m.Keys                           % {'apple', 'banana', 'cherry'}
m.Values                         % [1, 2, 3]
isKey(m, 'apple')                % true
remove(m, 'banana');

% iterate
keys = m.keys;
for k = 1:length(keys)
  fprintf('%s -> %d\n', keys{k}, m(keys{k}));
end

% R2022b+ dictionary (faster, typed)
d = dictionary({'apple', 'banana'}, [1, 2]);
d('cherry') = 3;
d('apple')                        % 1
keys(d); values(d)
21

Optimisation

fmincon optimisation contrainte

fmincon est le cheval de bataille pour la minimisation non linéaire contrainte. La fonction nonlcon doit retourner [c, ceq] où c <= 0 (inégalité) et ceq = 0 (égalité). deal est une façon propre de retourner plusieurs sorties depuis une fonction anonyme. Définissez Algorithm selon le type de problème : 'interior-point' (général), 'sqp' (petit/moyen, souvent plus rapide).

matlab
% minimize objective with constraints
% min f(x) s.t. A*x <= b, Aeq*x = beq, lb <= x <= ub, c(x) <= 0, ceq(x) = 0

fun = @(x) (x(1) - 2)^2 + (x(2) - 3)^2;

% linear inequality: x1 + x2 <= 4
A = [1 1]; b = 4;
% linear equality: x1 - x2 = 0
Aeq = [1 -1]; beq = 0;
% bounds
lb = [0 0]; ub = [5 5];
% nonlinear: x1^2 + x2^2 >= 1 (so -(x1^2 + x2^2 - 1) <= 0)
nonlcon = @(x) deal(-(x(1)^2 + x(2)^2 - 1), []);

x0 = [1 1];
[x, fval, exitflag, output] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);

% options
opts = optimoptions('fmincon', 'Display', 'iter', ...
                    'Algorithm', 'interior-point');
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, opts);

fminunc sans contraintes

fminunc minimise des fonctions non linéaires sans contraintes. Fournir le gradient (via SpecifyObjectiveGradient) améliore considérablement la vitesse et la précision. L'approximation BFGS par défaut de Hessian fonctionne bien pour les problèmes lisses ; pour les grands, 'lbfgs' limite la mémoire. Vérifiez exitflag (>0 = convergé) et firstorderopt (devrait être minuscule).

matlab
% unconstrained minimization
fun = @(x) 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;  % Rosenbrock

x0 = [-1.2 1];
[x, fval, flag, out] = fminunc(fun, x0);

% with gradient (faster, more accurate)
syms x1 x2
f = 100*(x2 - x1^2)^2 + (1 - x1)^2;
grad = gradient(f, [x1, x2]);
fun_grad = matlabFunction(f, grad, 'Vars', {x1, x2});

opts = optimoptions('fminunc', 'SpecifyObjectiveGradient', true, ...
                    'Display', 'iter');
[x, fval] = fminunc(@(x) fun_grad(x(1), x(2)), x0, opts);

% check optimality
disp(out.firstorderopt)           % should be near 0

% Hessian option
opts.Hessian = 'bfgs';            % quasi-Newton (default)
opts.Hessian = 'lbfgs';           % for large sparse problems

linprog programmation linéaire

linprog résout les programmes linéaires. Pour les variables entières/binaires, utilisez intlinprog (remplace le bintprog déprécié). intcon liste quelles variables sont contraintes en entiers. Définissez lb=0, ub=1 pour binaire. L'algorithme dual-simplex est le défaut et le plus rapide pour la plupart des problèmes.

matlab
% min f'*x s.t. A*x <= b, Aeq*x = beq, lb <= x <= ub

% example: min -x1 - 2*x2
%   s.t.  x1 + x2 <= 4
%          x1 + 3*x2 <= 6
%          x1, x2 >= 0
f = [-1; -2];
A = [1 1; 1 3];
b = [4; 6];
lb = [0; 0];

opts = optimoptions('linprog', 'Display', 'iter');
[x, fval, exitflag, output] = linprog(f, A, b, [], [], lb, [], opts);

% integer programming (intlinprog)
intcon = 1:2;                     % variables 1 and 2 are integers
[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, []);

% binary variables: set lb=0, ub=1, and add to intcon
lb = [0; 0]; ub = [1; 1];
[x, fval] = intlinprog(f, intcon, A, b, [], [], lb, ub);

lsqcurvefit et ajustement de courbes

lsqcurvefit ajuste des modèles paramétriques aux données par moindres carrés. polyfit est le choix facile pour les polynômes. Pour R² (coefficient de détermination), calculez-le manuellement : 1 - SSE/SST. L'algorithme Levenberg-Marquardt est bon pour les problèmes sans contraintes ; trust-region-reflective gère les bornes.

matlab
% fit y = a*exp(b*x) to data
xdata = linspace(0, 5, 50)';
ydata = 2.5 * exp(-0.7 * xdata) + 0.05 * randn(50, 1);

model = @(p, x) p(1) * exp(p(2) * x);

x0 = [1, -1];
[params, resnorm, residual, exitflag] = lsqcurvefit(model, x0, xdata, ydata);

% with bounds
lb = [0, -5]; ub = [10, 0];
[params, resnorm] = lsqcurvefit(model, x0, xdata, ydata, lb, ub);

% polyfit for polynomials
p = polyfit(xdata, ydata, 3);     % cubic
yfit = polyval(p, xdata);

% fit with custom output
opts = optimoptions('lsqcurvefit', 'Display', 'off', ...
                    'Algorithm', 'levenberg-marquardt');
[params, resnorm] = lsqcurvefit(model, x0, xdata, ydata, [], [], opts);

% goodness of fit
sse = sum((ydata - model(params, xdata)).^2);
sst = sum((ydata - mean(ydata)).^2);
r2 = 1 - sse / sst;

Optimisation globale

Les outils d'optimisation globale (dans le Global Optimization Toolbox) aident avec les problèmes non convexes où les solveurs locaux restent coincés. MultiStart exécute un solveur local depuis de nombreux départs aléatoires. GlobalSearch est plus intelligent — il filtre les départs prometteurs. ga (algorithme génétique) et simulannealbnd sont sans dérivées. patternsearch est bon pour les problèmes non lisses.

matlab
% MultiStart: run local solver from many points
fun = @(x) x(1)^2 + x(2)^2 + 10*sin(x(1)) + 10*sin(x(2));
ms = MultiStart('Display', 'iter');
opts = optimoptions('fmincon', 'Algorithm', 'interior-point');
problem = createOptimProblem('fmincon', 'objective', fun, ...
                            'x0', [0 0], 'lb', [-5 -5], 'ub', [5 5]);
[x, fval] = run(ms, problem, 50);  % 50 starting points

% GlobalSearch: smarter, fewer starts
gs = GlobalSearch;
[x, fval] = run(gs, problem);

% ga (genetic algorithm)
[x, fval] = ga(fun, 2, [], [], [], [], [-5 -5], [5 5]);

% simulannealbnd (simulated annealing)
[x, fval] = simulannealbnd(fun, [0 0], [-5 -5], [5 5]);

% patternsearch
[x, fval] = patternsearch(fun, [0 0]);
22

Traitement d'image

Lecture et affichage d'images

imread retourne des tableaux uint8 pour la plupart des formats d'image. rgb2gray convertit RGB en niveaux de gris. im2double met à l'échelle vers [0, 1] — utilisez ceci (pas double()) avant le traitement flottant. imshow auto-met à l'échelle les images double : [0, 1] est la plage attendue. imwrite supporte les options qualité/compression.

matlab
% read and display
img = imread('photo.jpg');
imshow(img);

% info
size(img)                         % rows x cols x channels
class(img)                        % usually uint8
imfinfo('photo.jpg')              % metadata

% convert types
gray = rgb2gray(img);             % RGB -> gray
img_double = im2double(img);      % uint8 [0,255] -> double [0,1]
img_uint8 = im2uint8(img_double);

% write
imwrite(gray, 'gray.png');
imwrite(img, 'compressed.jpg', 'Quality', 80);

% display multiple
figure;
subplot(1, 2, 1); imshow(img); title('Original');
subplot(1, 2, 2); imshow(gray); title('Grayscale');

% pixel info
impixelinfo;                      % interactive pixel values
img(100, 200, :)                  % pixel at (row, col)

Filtrage et convolution

imgaussfilt est le flou gaussien moderne (remplace fspecial('gaussian') + imfilter). medfilt2 est le bon choix pour le bruit sel-et-poivre (le filtre moyen le smearing juste). fspecial crée des noyaux courants (sobel, prewitt, laplacian, gaussian, disk, motion). imfilter fait la corrélation par défaut — passez 'conv' pour la vraie convolution.

matlab
img = imread('cameraman.tif');
img = im2double(img);

% Gaussian blur
blurred = imgaussfilt(img, 2);    % sigma = 2
blurred = imgaussfilt(img, 2, 'FilterSize', 7);

% median filter (great for salt-and-pepper noise)
noisy = imnoise(img, 'salt & pepper', 0.05);
denoised = medfilt2(noisy, [3 3]);

% custom kernel
h = fspecial('sobel');            % edge detection
edges = imfilter(img, h);
h = fspecial('laplacian', 0);
sharpened = img - imfilter(img, h);

% 2D convolution vs correlation
out_conv = imfilter(img, h, 'conv');
out_corr = imfilter(img, h, 'corr');  % default

% unsharp masking
sharp = imsharpen(img, 'Amount', 1.5, 'Radius', 2);

Opérations morphologiques

Les opérations morphologiques travaillent sur les images binaires. Erode rétrécit les objets ; dilate les agrandit. Open (erode puis dilate) supprime le petit bruit ; close (dilate puis erode) remplit les petits trous. strel crée des éléments structurants — disk/square/line/octagon. bwareaopen supprime les petits objets ; imfill remplit les trous ; bwperim extrait les contours.

matlab
bw = imread('text.png');
bw = imbinarize(bw);              % grayscale -> binary

% basic ops
eroded = imerode(bw, strel('square', 3));
dilated = imdilate(bw, strel('disk', 2));
opened = imopen(bw, strel('square', 5));
closed = imclose(bw, strel('square', 5));

% structuring elements
se = strel('square', 3);
se = strel('disk', 5);
se = strel('line', 10, 45);       % length 10, angle 45 deg
se = strel('octagon', 3);

% remove small objects
clean = bwareaopen(bw, 50);       % remove <50 pixels

% skeleton
skel = bwmorph(bw, 'skel', Inf);

% fill holes
filled = imfill(bw, 'holes');

% boundary
boundary = bwperim(bw);

Détection de contours et segmentation

edge avec 'canny' est le détecteur de contours le plus robuste (spécifiez les seuils [low high] et sigma). imbinarize avec 'adaptive' gère l'éclairage non uniforme. bwconncomp trouve les composantes connectées ; regionprops extrait les mesures (Area, Centroid, BoundingBox, etc.). watershed sépare les objets en contact — calculez sur le gradient pour trouver les contours.

matlab
img = imread('coins.png');
img = im2double(img);

% edges
edges_sobel = edge(img, 'sobel');
edges_canny = edge(img, 'canny', [0.1 0.2], 1.5);
edges_prewitt = edge(img, 'prewitt');

% thresholding
bw = imbinarize(img);
bw_otsu = imbinarize(img, 'adaptive');  % local threshold

% connected components
cc = bwconncomp(bw);
stats = regionprops(cc, 'Area', 'Centroid', 'BoundingBox');
areas = [stats.Area];
[~, idx] = sort(areas, 'descend');
biggest = stats(idx(1));

% watershed segmentation
grad = imgradient(img);
L = watershed(grad);
L(L == 0) = NaN;
imshow(img); hold on; imshow(L, []);

Couleur et transformées

rgb2hsv, rgb2lab convertissent les espaces colorimétriques — HSV est intuitif pour la sélection de couleur ; L*a*b* sépare la luminance de la couleur (bon pour la différence de couleur). fft2 + fftshift centrent le spectre pour le filtrage. imresize/imrotate/imcrop sont des opérations géométriques — 'bilinear' (défaut) est généralement meilleur ; 'nearest' est le plus rapide mais pixelisé.

matlab
img = imread('peppers.png');

% color space conversion
hsv = rgb2hsv(img);
lab = rgb2lab(img);
gray = rgb2gray(img);
rgb = hsv2rgb(hsv);

% extract channels
R = img(:, :, 1);
G = img(:, :, 2);
B = img(:, :, 3);

% Fourier transform
f = fft2(double(gray));
f = fftshift(f);                  % center zero freq
mag = log(1 + abs(f));
imshow(mag, []);

% inverse
f_filtered = f;
f_filtered(abs(f) < 100) = 0;    % low-pass filter
filtered = real(ifft2(ifftshift(f_filtered)));
imshow(filtered, []);

% resize, rotate
small = imresize(img, 0.5);
rotated = imrotate(img, 45, 'bilinear', 'crop');
cropped = imcrop(img, [50 50 200 150]);  % [x y w h]
23

GUI/App Designer

Bases d'App Designer

App Designer (R2016a+) est l'outil GUI moderne, remplaçant GUIDE. Les composants sont accessibles via app.<Name>. Les callbacks reçoivent (app, event). Les propriétés personnalisées (dans la Code View) partagent l'état entre callbacks. Sauvegardez en .mlapp (binaire) ou exportez en .m. Exécutez en tapant le nom de l'app dans la fenêtre de commande.

matlab
% Open App Designer:
%   >> appdesigner
% Drag components from the left, set properties on the right.

% Callback structure (auto-generated):
function ButtonPushed(app, event)
    x = linspace(0, 2*pi, 100);
    plot(app.UIAxes, x, sin(x));
    app.ResultEditField.Value = 'Plot done';
end

% Access components via app.<ComponentName>
%   app.UIAxes, app.Button, app.EditField, app.Slider, ...

% Property panel: add custom properties
properties (Access = private)
    data;                          % shared between callbacks
end

% Startup callback:
function startupFcn(app)
    app.data = rand(10);
    app.Slider.Value = 50;
end

% Save as .mlapp, run with:
%   >> myApp  (if named myApp.mlapp)
% Or export to a standalone .m file.

UI programmatique avec uifigure

uifigure (R2016b+) est le framework UI programmatique moderne — supporte les widgets modernes (gauge, knob, switch, tree) que figure ne supporte pas. Définissez les callbacks via les propriétés *Fcn en utilisant des fonctions anonymes @(src, event) .... uiwait bloque jusqu'à la fermeture de la figure ; uiresume la libère.

matlab
% modern uifigure (R2016b+) — preferred
fig = uifigure('Name', 'My App', 'Position', [100 100 600 400]);

ax = uiaxes(fig, 'Position', [200 100 350 250]);
plot(ax, 1:10);

btn = uibutton(fig, 'Text', 'Plot', 'Position', [50 100 100 30]);
btn.ButtonPushedFcn = @(~,~) plot(ax, rand(1, 10));

slider = uislider(fig, 'Position', [50 200 100 3]);
slider.ValueChangedFcn = @(s,~) disp(s.Value);

% dropdown
dd = uidropdown(fig, 'Items', {'a', 'b', 'c'}, 'Position', [50 250 100 30]);
dd.ValueChangedFcn = @(s,~) fprintf('Selected: %s\n', s.Value);

% list box
lb = uilistbox(fig, 'Items', {'one', 'two', 'three'}, ...
               'Multiselect', 'on', 'Position', [50 50 100 80]);

% wait for user to close
uiwait(fig);

Composants UI courants

Composants UI modernes : uieditfield (texte ou numérique), uibuttongroup (gère les radio buttons), uicheckbox, uitable (lié à une table), uitabgroup/uitab (onglets). Tous prennent un parent comme premier argument et utilisent des paires nom-valeur pour les propriétés. Les callbacks se déclenchent sur interaction utilisateur ; accédez aux nouvelles valeurs via l'argument source.

matlab
fig = uifigure;

% label
lbl = uilabel(fig, 'Text', 'Enter value:', 'Position', [20 200 100 22]);

% edit field
ef = uieditfield(fig, 'numeric', 'Value', 42, 'Position', [130 200 100 22]);
ef.ValueChangedFcn = @(s,~) fprintf('New: %g\n', s.Value);

% button group with radio buttons
bg = uibuttongroup(fig, 'Title', 'Mode', 'Position', [20 100 200 80]);
r1 = uiradiobutton(bg, 'Text', 'A', 'Position', [10 40 100 22]);
r2 = uiradiobutton(bg, 'Text', 'B', 'Position', [10 10 100 22]);
r1.Value = true;

% check box
cb = uicheckbox(fig, 'Text', 'Enable', 'Position', [20 50 100 22]);

% table
tdata = table({'A'; 'B'}, [1; 2], 'VariableNames', {'Name', 'Value'});
uit = uitable(fig, 'Data', tdata, 'Position', [250 50 200 150]);

% tab group
tg = uitabgroup(fig);
t1 = uitab(tg, 'Title', 'Tab 1');
t2 = uitab(tg, 'Title', 'Tab 2');
plot(uiaxes(t1), 1:10);

Dialogues et invites

inputdlg collecte la saisie texte ; questdlg pour oui/non/annuler ; listdlg pour la sélection ; uigetfile/uiputfile pour les sélecteurs de fichiers ; msgbox/errordlg/warndlg pour les notifications. fullfile joint les chemins de manière portable (mieux que la concaténation de chaînes). Vérifiez toujours que l'utilisateur n'a pas annulé (retour vide ou ok == false).

matlab
% input dialog
answer = inputdlg({'Name:', 'Age:'}, 'User Info', [1 50; 1 10]);
if ~isempty(answer)
    name = answer{1};
    age = str2double(answer{2});
end

% question dialog
btn = questdlg('Save changes?', 'Confirm', 'Yes', 'No', 'Cancel', 'Yes');
switch btn
    case 'Yes', save_data();
    case 'No',  % discard
    case 'Cancel', return;
end

% list dialog
[sel, ok] = listdlg('PromptString', 'Select items:', ...
                    'ListString', {'Apple', 'Banana', 'Cherry'}, ...
                    'SelectionMode', 'multiple');

% file dialogs
[file, path] = uigetfile('*.csv', 'Select CSV');
[file, path] = uiputfile('*.mat', 'Save as');
fullpath = fullfile(path, file);

% message dialog
msgbox('Done!', 'Info', 'help');
errordlg('Something went wrong', 'Error');
warndlg('Check this', 'Warning');

Partage et déploiement

Pour le partage : les fichiers .mlapp nécessitent MATLAB ; les applications autonomes (via MATLAB Compiler) s'exécutent sans MATLAB mais nécessitent le MATLAB Runtime gratuit ; les web apps s'exécutent dans un navigateur via MATLAB Web App Server. L'export vers .m vous donne du code source lisible. Packagez comme toolbox pour la distribution via les Add-Ons.

matlab
% Run as standalone app
%   1. In App Designer: Designer Tab > App Store Details > Save as .mlapp
%   2. Share the .mlapp file — others open it in MATLAB

% Create standalone app (requires MATLAB Compiler)
%   >> mcr.build('myApp.mlapp')        % R2024a+
%   or
%   >> deploytool                       % legacy

% Web App (requires MATLAB Web App Server)
%   >> compiler.build.webApp('myApp.mlapp')

% Export to code (readable .m)
%   In App Designer: Designer Tab > Export > Export to .m file

% Pack as toolbox (for sharing with colleagues)
%   >> matlab.addons.toolbox.packageToolbox('myApp.prj)

% Tips:
%   - Use try/catch in callbacks to avoid silent failures
%   - Set app.UIFigure.Name to identify your app
%   - Test on a clean MATLAB session before deploying
24

E/S fichiers avancé

E/S fichier de bas niveau

fopen retourne -1 en cas d'échec — vérifiez toujours. fgetl lit une ligne sans le saut de ligne ; fgets le conserve. fscanf lit des données formatées ; fread lit du binaire. fseek/ftell naviguent. Fermez toujours fclose quand terminé (utilisez onCleanup pour la sécurité : c = onCleanup(@() fclose(fid));).

matlab
fid = fopen('data.txt', 'r');   % r, w, a, r+, w+
if fid == -1; error('Cannot open file'); end

% read line by line
while ~feof(fid)
  line = fgetl(fid);              % without newline
  fprintf('%s\n', line);
end

% formatted read
% data.txt: "Alice 30 90.5"
A = fscanf(fid, '%s %d %f', [3 1]);

% formatted write
fprintf(fid, '%s, %d, %.2f\n', 'Bob', 25, 85.3);

% binary I/O
data = fread(fid, [10 5], 'double');  % 10x5 doubles
fwrite(fid, data, 'double');

% position
fseek(fid, 0, 'bof');             % beginning
fseek(fid, 0, 'eof');             % end
pos = ftell(fid);

fclose(fid);                      % ALWAYS close

textscan pour données mixtes

textscan est plus flexible que fscanf — gère les types mixtes, délimiteurs personnalisés et retourne un cell array de colonnes. 'TreatAsEmpty' convertit les placeholders en NaN. 'CollectOutput' regroupe les colonnes de même type dans un seul tableau. fileread avale tout le fichier comme une chaîne — pratique pour les petits fichiers ou le traitement regex.

matlab
fid = fopen('data.csv', 'r');

% skip header line
header = fgetl(fid);

% parse remaining
% Format: Alice,30,90.5,B+
C = textscan(fid, '%s %d %f %s', ...
             'Delimiter', ',', ...
             'MultipleDelimsAsOne', true, ...
             'TreatAsEmpty', {'NA', 'N/A'}, ...
             'HeaderLines', 0);
fclose(fid);

names = C{1}; ages = C{2}; scores = C{3}; grades = C{4};

% alternative: read whole file at once
str = fileread('data.txt');

% from string
C = textscan('1 2 3\n4 5 6', '%d %d %d');
% C{1} = [1; 4], C{2} = [2; 5], C{3} = [3; 6]

% collectoutput (group columns of same type)
C = textscan(fid, '%s %d %d %f', 'CollectOutput', true);
% C{2} = [ages, more_ints] as one matrix

Fichiers MAT et save/load

save/load avec les fichiers .mat préservent les types et la structure des variables. -v7.3 supporte les fichiers > 2 Go (et est le défaut dans le MATLAB moderne). -append ajoute des variables sans réécrire. Pour les gros fichiers, chargez uniquement ce dont vous avez besoin par nom. Pour l'export texte, utilisez -ascii (limité) ou writematrix/writetable pour plus de contrôle.

matlab
A = magic(5);
B = struct('name', 'Alice', 'age', 30);
C = rand(100);

% save variables
save('data.mat', 'A', 'B', 'C');
save('data.mat', 'A', 'B', '-v7.3');  % large files > 2GB
save('data.mat', '-append', 'C');     % add to existing

% load
loaded = load('data.mat');       % struct with variables
loaded.A
loaded.B.age

% or load into workspace
load('data.mat');                % A, B, C now in workspace

% partial load (huge files)
info = whos('-file', 'bigdata.mat');
loaded = load('bigdata.mat', 'A');  % only A

% save specific format
save('data.txt', 'A', '-ascii', '-double');
save('data.csv', 'A', '-ascii', '-delimiter', ',');

% compressed
save('data.mat', 'A', '-v7.3', '-nocompression');

HDF5 et formats scientifiques

HDF5 est le standard pour les grands jeux de données numériques — supporte le chunking, la compression et les dimensions extensibles. h5read avec start/count vous permet de lire des tranches sans charger tout le fichier. NetCDF est courant en climatologie/océanographie ; FITS en astronomie. MATLAB supporte aussi nativement TIFF, DICOM, audio et les formats vidéo.

matlab
% HDF5 (great for large scientific datasets)
% write
h5create('data.h5', '/dataset1', [100 50 20]);
data = rand(100, 50, 20);
h5write('data.h5', '/dataset1', data);

% read
info = h5info('data.h5');
data = h5read('data.h5', '/dataset1');
partial = h5read('data.h5', '/dataset1', [1 1 1], [10 10 5]);

% append (extendable datasets)
h5create('data.h5', '/growable', [100 Inf], 'ChunkSize', [100 100]);
for k = 1:5
  h5write('data.h5', '/growable', rand(100, 100), [1 (k-1)*100+1]);
end

% NetCDF (climate/ocean data)
ncid = netcdf.open('data.nc', 'NC_NOWRITE');
varid = netcdf.inqVarID(ncid, 'temperature');
data = netcdf.getVar(ncid, varid);
netcdf.close(ncid);

% FITS (astronomy)
fitsdisp('image.fits');
data = fitsread('image.fits');

JSON et XML

jsonencode/jsondecode (R2016b+) gèrent JSON nativement. Les structs deviennent des objets JSON ; les cell arrays deviennent des tableaux. Pour XML, xmlread retourne un objet DOM Java — utilisez les méthodes Java pour traverser. xmlwrite sérialise un DOM vers un fichier. Pour le XML complexe, envisagez xml2struct tiers ou l'API DOM directement.

matlab
% JSON (R2016b+)
data = struct('name', 'Alice', 'age', 30, 'scores', [90 80 85]);
txt = jsonencode(data, 'PrettyPrint', true);
disp(txt);

decoded = jsondecode(txt);
decoded.name                     % 'Alice'

% JSON with cell arrays for mixed types
data = struct('items', {{'apple', 42, [1 2 3]}});
txt = jsonencode(data);

% read JSON file
txt = fileread('config.json');
config = jsondecode(txt);

% XML
doc = xmlread('data.xml');
root = doc.getDocumentElement;
children = root.getChildNodes;
for k = 0:children.getLength - 1
  node = children.item(k);
  if node.getNodeType == doc.ELEMENT_NODE
    fprintf('%s: %s\n', node.getNodeName, char(node.getTextContent));
  end
end

% write XML
doc = com.mathworks.xml.XMLUtils.createDocument('root');
root = doc.getDocumentElement;
child = doc.createElement('item');
child.appendChild(doc.createTextNode('hello'));
root.appendChild(child);
xmlwrite('out.xml', doc);
25

Calcul parallèle

Boucles parfor

parfor exécute les itérations de boucle en parallèle sur les workers. Les itérations doivent être indépendantes. Les variables sont classées : sliced (chaque itération touche un index unique), broadcast (lecture seule), reduction (combinées avec une op associative comme + ou *) et temp (créées à l'intérieur). La classification détermine ce qui est autorisé.

matlab
% requires Parallel Computing Toolbox
% start pool
pool = gcp('nocreate');
if isempty(pool), parpool; end

% parfor: parallel for loop
N = 1000;
results = zeros(1, N);
parfor k = 1:N
  results(k) = some_expensive_function(k);
end

% constraints:
%   - iterations must be independent (no order dependency)
%   - body cannot contain break/return
%   - variables classified as sliced, broadcast, reduction, temp

% reduction variables
total = 0;
parfor k = 1:N
  total = total + compute(k);
end

% sliced variables (independent indexing)
data = rand(N, 100);
out = zeros(N, 1);
parfor k = 1:N
  out(k) = mean(data(k, :));
end

spmd et tableaux distribués

spmd exécute le même code sur tous les workers, avec labindex identifiant chacun. Utilisez pour les algorithmes data-parallel où les workers communiquent (par ex., style MPI). Les tableaux distribués étalent une grande matrice sur les workers — les opérations dessus restent distribuées ; gather() ramène le résultat au client. Composite stocke les valeurs par worker.

matlab
% spmd: single program, multiple data
spmd
  % code runs on every worker
  % labindex: this worker's ID (1 to numlabs)
  % numlabs: total workers
  fprintf('Worker %d of %d\n', labindex, numlabs);

  % each worker computes a chunk
  local_data = rand(100, 1);
  local_sum = sum(local_data);
end

% combine results
total = sum([local_sum{:}]);

% distributed arrays (split across workers)
D = distributed.rand(10000, 10000);  % huge matrix
local_size = size(D, 'local')        % each worker's chunk
total_size = size(D)                  % logical total

% operations auto-distribute
S = D * D';
S_local = gather(S);                  % pull to client (if fits)

% Composite (cell-like, one per worker)
C = Composite();
spmd
  C{labindex} = magic(labindex + 1);
end
C{1}                              % access worker 1's value

gpuArray

gpuArray déplace les données vers le GPU ; les opérations sur les gpuArrays s'exécutent sur le GPU automatiquement. gather() ramène les données. Les opérations élément par élément et de multiplication matricielle voient la plus grande accélération ; le code scalaire ou à branchement non. arrayfun sur les gpuArrays vous permet d'exécuter des fonctions personnalisées élément par élément sur le GPU sans écrire de CUDA.

matlab
% requires GPU support (most NVIDIA GPUs)
% move data to GPU
A = gpuArray(rand(10000));
B = gpuArray(rand(10000));

% operations run on GPU
C = A * B;                        % still on GPU
D = sin(A) + cos(B);
E = sum(A, 1);

% bring back to CPU
C_cpu = gather(C);

% check GPU
gpuDevice                        % info about current GPU
gpuDeviceCount                   % number of available GPUs
gpuDevice(1)                     % select device 1

% element-wise ops are typically fastest on GPU
% matrix multiply also very fast (cuBLAS)

% custom kernels (PTX)
k = parallel.gpu.CUDAKernel('my_kernel.ptx', 'my_kernel.cu');
result = feval(k, A, B);

% arrayfun on GPU (element-wise custom functions)
f = @(x) x^2 + sin(x);
result = arrayfun(f, A);

batch et job

batch exécute une fonction ou un script en arrière-plan — utile pour les longs jobs que vous ne voulez pas bloquer la session MATLAB. wait(job) bloque jusqu'à la fin ; fetchOutputs récupère les résultats. Supprimez toujours delete(job) pour libérer les ressources. 'Pool', N utilise N workers supplémentaires pour parfor à l'intérieur de la fonction batch.

matlab
% run a function in background
job = batch(@my_function, 0, {arg1, arg2});

% check status
job.State                        % 'queued', 'running', 'finished'
wait(job);                       % block until done

% get results
results = fetchOutputs(job);
delete(job);                     % clean up

% batch script
job = batch('my_script.m');

% with pool
job = batch(@my_func, 1, {x}, 'Pool', 4);  % 4 extra workers

% batch with attached files
job = batch(@my_func, 1, {x}, ...
            'AttachedFiles', {'data.mat', 'helper.m'}, ...
            'CurrentFolder', '/path/to/work');

% list jobs
jobs = findJob(pool);
for j = jobs
  fprintf('Job %d: %s\n', j.ID, j.State);
end

% parallel pool settings
parpool('local', 4);              % 4 workers
delete(gcp('nocreate'));          % shut down pool

Conseils de performance

Préallouez les tableaux (zeros/ones) — agrandir des tableaux dans des boucles est le tueur de performance n°1 de MATLAB. Vectorisez (sin(x) au lieu de boucler) — plus clair et souvent plus rapide. Le JIT rend les boucles simples rapides, mais la vectorisation gagne encore pour les maths. profile viewer trouve les goulots d'étranglement. Utilisez la simple précision pour les grosses données ; écrivez des fichiers MEX pour les vrais points chauds.

matlab
% 1. Preallocate arrays
% BAD
for k = 1:1000
  x(k) = k^2;                    % grows array each iteration
end

% GOOD
x = zeros(1, 1000);
for k = 1:1000
  x(k) = k^2;
end

% 2. Vectorize instead of looping
% BAD
for k = 1:length(x)
  y(k) = sin(x(k));
end

% GOOD
y = sin(x);                      % one vectorized call

% 3. Use JIT-friendly patterns
% simple loops are now fast (JIT), but vectorize for clarity

% 4. Profile to find bottlenecks
profile on;
my_function();
profile viewer;

% 5. Prefer single precision for huge data
A = rand(10000, 'single');       % half the memory

% 6. MEX for critical sections
% compile C code: mex my_func.c
26

Orienté objet

Définition de classe

Sauvegardez classdef dans un fichier nommé <ClassName>.m. Les propriétés contiennent les données ; les méthodes définissent le comportement. Le constructeur doit être nommé d'après la classe et gérer nargin==0 (appelé sans args). Les propriétés dependent sont calculées à l'accès via les méthodes get.X. disp surcharge l'affichage. Les méthodes statiques ne prennent pas obj.

matlab
% file: Point.m
classdef Point
  properties
    x = 0
    y = 0
  end

  properties (Dependent)
    r                              % computed on access
  end

  methods
    function obj = Point(x, y)
      if nargin > 0
        obj.x = x;
        obj.y = y;
      end
    end

    function r = get.r(obj)
      r = sqrt(obj.x^2 + obj.y^2);
    end

    function obj = move(obj, dx, dy)
      obj.x = obj.x + dx;
      obj.y = obj.y + dy;
    end

    function disp(obj)
      fprintf('Point(%.2f, %.2f), r=%.2f\n', obj.x, obj.y, obj.r);
    end
  end

  methods (Static)
    function p = origin()
      p = Point(0, 0);
    end
  end
end

Classes valeur vs handle

Les classes valeur copient à l'affectation (comme int ou struct) ; les classes handle passent par référence (comme les objets Java). Pour les objets mutables (une connexion DB, un composant UI), utilisez handle. Les classes valeur sont plus simples et plus sûres pour les données immuables. Les classes handle héritent de handle et supportent événements/écouteurs et un destructeur delete.

matlab
% Value class (default) — copied on assignment
classdef VPoint
  properties; x; end
  methods
    function obj = VPoint(x); obj.x = x; end
    function obj = setX(obj, x); obj.x = x; end
  end
end

p = VPoint(1);
p2 = p;                           % copy
p2 = setX(p2, 5);
disp(p.x)                         % still 1 (unchanged)

% Handle class — passed by reference
classdef HPoint < handle
  properties; x; end
  methods
    function obj = HPoint(x); obj.x = x; end
    function setX(obj, x); obj.x = x; end   % no return needed
  end
end

h = HPoint(1);
h2 = h;                           % same object
h2.setX(5);
disp(h.x)                         % 5 (shared)

% handle class features:
%   - events and listeners
%   - destructor (delete method)
%   - copy() method

Héritage et polymorphisme

Sous-classe avec <. Appelez le constructeur de superclasse avec obj@SuperClass(args). Le polymorphisme fonctionne naturellement — appelez la méthode sur le type de base, et la bonne surcharge s'exécute. MATLAB supporte l'héritage multiple (séparez les superclasses avec &), mais une seule peut être une classe concrète ; les autres doivent être des interfaces.

matlab
% base class
classdef Animal
  properties; name; end
  methods
    function obj = Animal(name); obj.name = name; end
    function speak(obj)
      error('Abstract: subclass must override');
    end
    function describe(obj)
      fprintf('%s says: ', obj.name);
      obj.speak();
      fprintf('\n');
    end
  end
end

% subclass
classdef Dog < Animal
  methods
    function obj = Dog(name); obj = obj@Animal(name); end
    function speak(obj); fprintf('Woof'); end
  end
end

classdef Cat < Animal
  methods
    function obj = Cat(name); obj = obj@Animal(name); end
    function speak(obj); fprintf('Meow'); end
  end
end

% polymorphism
animals = {Dog('Rex'), Cat('Whiskers'), Dog('Buddy')};
for k = 1:length(animals)
  animals{k}.describe();
end

% multiple inheritance
classdef FlyingDog < Dog & IFlyable
  ...
end

Événements et écouteurs

Les événements nécessitent une classe handle. Déclarez les événements dans un bloc events. notify déclenche un événement ; addlistener s'abonne. Les écouteurs peuvent être des fonctions ou des fonctions anonymes @(src, event). Les données d'événement personnalisées sous-classent event.EventData. Les écouteurs sont supprimés quand l'objet source est supprimé (ou vous pouvez les supprimer explicitement).

matlab
classdef Thermometer < handle
  properties
    temperature = 20
  end

  events
    temperatureChanged
    overheat
  end

  methods
    function set.temperature(obj, t)
      obj.temperature = t;
      notify(obj, 'temperatureChanged');
      if t > 100
        notify(obj, 'overheat');
      end
    end

    function obj = Thermometer()
      % add listener to own event
      addlistener(obj, 'overheat', @(s,e) disp('WARNING: too hot!'));
    end
  end
end

% usage
t = Thermometer();
lh = addlistener(t, 'temperatureChanged', @(s,e) ...
  fprintf('Now: %.1f\n', s.temperature));
lh2 = addlistener(t, 'overheat', @onOverheat);

t.temperature = 25;               % triggers temperatureChanged
t.temperature = 105;              % triggers both

% custom event data
classdef OverheatData < event.EventData
  properties; temp; end
end
% notify(obj, 'overheat', OverheatData(t));

Énumération et propriétés

Les classes d'énumération définissent des instances fixes — utiles pour les machines à états, options et types. Chaque valeur d'enum peut transporter des données via des propriétés. Les attributs de propriété contrôlent l'accès : SetAccess=private rend en lecture seule depuis l'extérieur ; Constant pour les constantes de compilation ; Hidden masque de l'affichage ; Access={?Class1, ?Class2} restreint à des classes spécifiques.

matlab
% enumeration class
classdef Color
  enumeration
    Red [1 0 0]
    Green [0 1 0]
    Blue [0 0 1]
  end
  properties
    rgb
  end
  methods
    function obj = Color(rgb)
      obj.rgb = rgb;
    end
  end
end

c = Color.Red;
disp(c.rgb)                       % [1 0 0]

% switch on enum
switch c
  case Color.Red; disp('red');
  case Color.Green; disp('green');
end

% property attributes
classdef Account
  properties (SetAccess = private)
    balance = 0                   % readable outside, settable only inside
  end
  properties (Access = {?Account, ?Bank})
    internal_id                   % only Account and Bank classes
  end
  properties (Constant)
    PI = 3.14159                  % compile-time constant
  end
  properties (Hidden)
    cache                         % not shown by disp/struct
  end
end

Was this helpful?