Contents

Introduction à Matlab

créer une matrice, on ajoute un point virgule pour ne pas afficher le résultat de la commance

M = [1 2 3
     4 5 6
     7 8 9]
disp(size(M))
M =

     1     2     3
     4     5     6
     7     8     9

     3     3

accès aux valeurs, index (ligne,colonne)

M(1,1)=18
M =

    18     2     3
     4     5     6
     7     8     9

L'opérateur ":"

%L'opérateur : permet d'acceder à toute une ligne (ou colonne), on peut
%l'utiliser pour accéder ou modifier toute une ligne (ou colonne)
M(4,:)=9  %ajoute une nouvelle ligne et inscrit la valeur 9

%il permet aussi de générer des suites
disp(1:5) % 1 à 5
disp(1:0.5:2) %1 à 2 avec un pas de 0.5
M =

    18     2     3
     4     5     6
     7     8     9
     9     9     9

     1     2     3     4     5

            1          1.5            2

L'opérateur []

%L'opérateur [] efface une matrice ou peut retirer une ligne (ou colonne)
M(4,:) = []
%il permet aussi de concacténer des matrices ou vecteur
MMM= [M M M]
M =

    18     2     3
     4     5     6
     7     8     9


MMM =

    18     2     3    18     2     3    18     2     3
     4     5     6     4     5     6     4     5     6
     7     8     9     7     8     9     7     8     9

Transpose '

%Les lignes deviennent les colonnes et vice versa
M2 = M';
M
M2
M =

    18     2     3
     4     5     6
     7     8     9


M2 =

    18     4     7
     2     5     8
     3     6     9

Produit vectoriel

%le produit vectoriel donne un nouveau vecteur perpendiculaire au 2 vecteur
%donné en argument
v1 = [1 0 0]';
v2 = [1 1 0]';
v3 = cross(v1,v2);
disp(v3)
     0
     0
     1

Produit scalaire

%le produit scalaire
scalaire = v1'*v3;
%devrait donner 0 pour 2 vecteurs perpendiculaires
disp(scalaire)
     0

Produit matriciel

M*M2;

Multiplication éléments à éléments, l'opérateur '.'

M.*M2; %noter le . devant *
M(:,1).*M(:,2); %multiplie les éléments de la 1ere colonne de M avec ceux de la 2iem.
M.^4; %exposant, chaque éléments de M est élevé à la 4;

M.*M.*M,M.^3
ans =

        5832           8          27
          64         125         216
         343         512         729


ans =

        5832           8          27
          64         125         216
         343         512         729

Inversion inv()

Minv = inv(M);
%multiplier une matrice par son inverse doit donner la matrice identité
disp(M*Minv)
            1            0            0
 -5.5511e-017            1  1.7764e-015
 -1.1102e-016            0            1

SVD

[U,S,V] = svd(M);
U
S
V
%M est le produit de ces trois matrices particulières
USV = U*S*V'
M
U =

     -0.76366      0.64503    -0.027757
     -0.33698     -0.43488     -0.83506
     -0.55071     -0.62834      0.54946


S =

       22.428            0            0
            0       10.245            0
            0            0      0.22197


V =

     -0.84488      0.53419     0.028619
     -0.33966       -0.577      0.74276
     -0.41329     -0.61782     -0.66894


USV =

           18            2            3
            4            5            6
            7            8            9


M =

    18     2     3
     4     5     6
     7     8     9

Itération (for)

%similaire à c++

%le produit éléments par éléments M.*M
for i=1:size(M,1) %toutes les lignes
    for j=1:size(M,2) %toutes les colonnes
        M3(i,j) = M(i,j)*M(i,j);
    end
end
M3
M.*M
M3 =

   324     4     9
    16    25    36
    49    64    81


ans =

   324     4     9
    16    25    36
    49    64    81

Affichage de points et courbes (Plot)

clear all  %efface les variables crées dans la premiere partie de l'introduction


x = [-pi:0.1:pi]; %crée un vecteur qui varie entre -pi et pi avec un pas de 0.1
y = 3*sin(x); % y est le sinus de chaque valeur de x multiplié par 3
figure(1),clf %clf efface le contenu de la figure

subplot(1,2,1)  %subplot permet d'avoir plusieurs axes sur la meme figure
plot(x,y,'b-')  %consulter l'aide pour connaitre les arguments de plot
title('Courbe sinus d''amplitude 3') %ajoute une titre
xlabel('X') %nomme les axes
ylabel('Y')
axis equal
subplot(1,2,2)
plot(x,y,'b.')
axis equal
title('Points d''un sinus d''amplitude 3')
xlabel('X')
ylabel('Y')

Affichage de droites

%on peut facilement tracer une droite, il suffit d'avoir les 2 points aux
%extrémités de la droite

pts = [1 1
       5 1
       3 3];
figure(1),clf
hold on  %hold permet de ne pas effacer le contenu de la figure lorsqu'on veut superposer des points, courbes, droites
p1 = pts(1,:);
p2 = pts(2,:);
line([p1(1,1) p2(1,1)], [p1(1,2) p2(1,2)]); %format line( [x1 x2], [y1 y2])
axis([0 6 0 6]);  %réajuste les limites de l'axe pour bien voir le contenu


clear all

Résolution de système d'équation simple avec SVD

%SVD permet de résoudre facilement un système d'équation, par exemple
%trouver l'équation d'une droite passant par un ensemble de points

Pts = [[1:10]' [1:10]' ones(10,1)]; %génère des points
% Pts(:,1:2) = Pts(:,1:2)+rand(10,2)*2; %on pourrait ajouter un peu de bruit au coordonnées x,y des points

%un point (x,y) passant par une droite L=(a,b,c)' doit respecter l'équation:
%ax+by+c = 0
%en coordonnées homogènes, le points a la forme P=(x,y,1) (on ajoute
%simplement un 1 à la fin du vecteur).
%L'équation de la droite devient donc:
% P'*L = 0
%si on a a une série de points en coordonnées homogènes:
%Pts = [x1 y1 1
%       x2 y2 1
%       x3 y3 1
%       x4 y4 1];
%l'équation reste la même :
% Pts*L = 0
%Lorsque L est inconnu, on a un systeme de la forme Ax=0, il se résoue
%facilement avec SVD

Eqn = [ Pts(:,1) Pts(:,2) ones(size(Pts,1),1)];  %on aurait pu simplement écrire Eqn=Pts;
[U,S,V] = svd(Eqn);

%la solution est le vecteur singulier de Eqn qui correspond à la plus
%petite valeur singulière. L'Algorithme SVD met les valeurs singulières
%dans S en ordre décroissant. Donc c'est la derniere colonne de V qui est
%la solution.

L = V(:,end);
%on normalise L pour avoir un vecteur normal unitaire.
L = L./sqrt(L(1)^2+L(2)^2);

%on peut tracer la droite en prenant un vecteur parallele à la droite, i.e
%perpendiculaire au vecteur normal de la droite
v = [-L(2) L(1) 0]';

%voici une droite tracer à +/-8 unitée du point centroid,
centroid = mean(Pts,1); % la moyenne selon les lignes
p1 = centroid+8*v'; %+8 fois le vecteur unitaire v
p2 = centroid-8*v'; %-8 fois le vecteur unitaire v

figure(1),clf,hold on
plot(Pts(:,1),Pts(:,2),'b.')
line([p1(1) p2(1)],[p1(2) p2(2)],'Color','g','Linewidth',2)

%vérification de l'erreur:
err = Pts*L;

fprintf(1,'\r\nErreur moyenne: %0.2e',mean(err)); %matlab supporte la commande fprintf !
Erreur moyenne: -8.33e-016