Suivant:
Calculer avec MATLAB Précédent:Présentation
et généralités
Voir: Table des matière
- Index - Accueil
>> clearComme on ne définit pas de manière explicite le type d'une variable, il est parfois utile de pouvoir le déterminer. Cela est possible grâce aux commandes ischar, islogical et isreal. ischar(x) retourne 1 si x est de type chaîne de caractères et 0 sinon. islogical(x) retourne 1 si x est de type logique et 0 sinon. La commande isreal(x) est à utiliser avec discernement: elle retourne 1 si x est réel ou de type chaîne de caractères ((-:) et 0 sinon (x est complexe à partie imaginaire non nulle ou n'est pas un tableau de valeurs réelles ou de caractères).
>> x = 2; z = 2+i; rep = 'oui';
>> whos
Name Size Bytes Class
rep 1x3 6 char array
x 1x1 8 double array
z 1x1 16 double array (complex)
Grand total is 5 elements using 30 bytes
>>
>> ischar(rep)
ans =
1
>> ischar(x)
ans =
0
>> isreal(z)
ans =
0
>> isreal(x)
ans =
1
>> isreal(rep)
ans =
1
>>
>> z = [1+i, 2, 3i]
z =
1.0000 + 1.0000i 2.0000 0 + 3.0000i
>> y = [1+i, 2, 3 i]
y =
1.0000 + 1.0000i 2.0000 3.0000 0 + 1.0000i
>>
>> ch1 = 'bon'Si une chaîne de caractères doit contenir le caractère apostrophe (') celui-ci doit être doublé dans la chaîne (ainsi pour affecter le caractère apostrophe (') à une variable on devra écrire '''', soit 4 apostrophes (-:).
ch1 =
bon
>> ch2 = 'jour'
ch2 =
jour
>> whos
Name Size Bytes Class
ch1 1x3 6 char array
ch2 1x4 8 char array
Grand total is 7 elements using 14 bytes
>> ch = [ch1,ch2]
ans =
bonjour
>> ch(1), ch(7), ch(1:3)
ans =
b
ans =
r
ans =
bon
>> ch3 = 'soi';
>> ch = [ch(1:3), ch3, ch(7)]
ans =
bonsoir
>>
>> rep = 'aujourd'hui'La chaîne de caractères vide s'obtient par 2 apostrophes ''. La commande isempty permet de tester si une variables de type chaîne de caractères est vide ou non. La commande strcmp permet de tester si deux chaines de caractères sont égales ou non.
??? rep = 'aujourd'hui
|
Missing operator, comma, or semi-colon.
>> rep = 'aujourd''hui'
rep =
aujourd'hui
>> apos = ''''
apos =
'
>>
>> x = 123; y = exp(log(x));
>> tst = ( x==y );
>> if tst, disp('x est egal a y '), else disp('x est different de y '), end
x est different de y
>> whos
Name Size Bytes Class
tst 1x1 8 double array (logical)
x 1x1 8 double array
y 1x1 8 double array
Grand total is 3 elements using 24 bytes
>> format long
>> x, y, tst
x =
123
y =
1.229999999999999e+02
tst =
0
>> format, clear
>>
>> x1 = [1 2 3], x2 = [4,5,6,7], x3 = [8; 9; 10]Les éléments d'un vecteur peuvent être manipulés grâce à leur indice dans le tableau. Le k-ieme élément du vecteur x est désignée par x(k). Le premier élément d'un vecteur a obligatoirement pour indice 1. En pratique ceci impose de faire des translations d'indices si par exemple on souhaite définir une suite (x0 , x1 , ... , xn). Le terme x0 de la suite correspondra à l'élément x(1) du vecteur et le terme xN à l'élément x(N+1). Il est possible de manipuler plusieurs éléments d'un vecteur simultanément. Ainsi les éléments k à l du vecteur x sont désignés par x(k:l). On peut également manipuler facilement les éléments d'un vecteur dont les indices sont en progression arithmétique. Ainsi si l'on souhaite extraire les éléments k, k+p, k+2p,..., k+Np = l, on écrira x(k:p:l). Plus généralement, si K est un vecteur de valeurs entières, X(K) retourne les éléments du vecteur X dont les indices sont les éléments du vecteur K. Reprenons l'exemple précédent.
x1 =
1 2 3
x2 =
4 5 6 7
x3 =
8
9
10
>> length(x2), length(x3)
ans =
4
ans =
3
>> whos
Name Size Bytes Class
x1 1x3 24 double array
x2 1x4 32 double array
x3 3x1 24 double array
Grand total is 10 elements using 80 bytes
>> x3'
ans =
8 9 10
>> X = [x1 x2 x3']
X =
1 2 3 4 5 6 7 8 9 10
>>
>> X(5)Il est très facile de définir un vecteur dont les composantes forment une suite arithmétique. Pour définir un vecteur x dont les composantes forment une suite arithmétique de raison h, de premier terme a et de dernier terme b, on écrira x = a:h:b. Si a-b n'est pas un multiple de h, le dernier élément du vecteur x sera a + Ent((a-b)/h) h où Ent est la fonction partie entière. La commande linspace permet de définir un vecteur x de longueur N dont les composantes forment une suite arithmétique de premier terme a et de dernier terme b (donc de raison (a-b)/N). Les composantes du vecteur sont donc linéairement espacés. La syntaxe est x = linspace(a,b,N).
ans =
5
>> X(4:10)
ans =
4 5 6 7 8 9 10
>> X(2:2:10)
ans =
2 4 6 8 10
>> K = [1 3 4 6]; X(K)
ans =
1 3 4 6
>>
>> x = 1.1:0.1:1.9
x =
Columns 1 through 7
1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
Columns 8 through 9
1.8000 1.9000
>> x = 1.1:0.2:2
x =
1.1000 1.3000 1.5000 1.7000 1.9000
>> x = linspace(1.1,1.9,9)
ans =
Columns 1 through 7
1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
Columns 8 through 9
1.8000 1.9000
>>
ones(1,n) | : | vecteur ligne de longueur n dont tous les éléments valent 1 |
ones(m,1) | : | vecteur colonne de longueur m dont tous les éléments valent 1 |
zeros(1,n) | : | vecteur ligne de longueur n dont tous les éléments valent 0 |
zeros(m,1) | : | vecteur colonne de longueur m dont tous les éléments valent 0 |
rand(1,n) | : | vecteur ligne de longueur n dont les éléments sont générés de manière aléatoire entre 0 et 1 |
rand(m,1) | : | vecteur colonne de longueur m dont les éléments sont générés de manière aléatoire entre 0 et 1 |
>> A = [1,3;4,2]Un élément d'une matrice est référencé par ses numéros de ligne et de colonne. A(i,j) désigne le i-ième élément de la j-ièmeligne ligne de la matrice A. Ainsi A(2,1) désigne le premier élément de la deuxième ligne de A,
A =
1 3
4 2
>> A = [1 3
4 2]
A =
1 3
4 2
>> A = [1,3
4,2]
A =
1 3
4 2
>>
>> A(2,1)La commande size permet d'obtenir les dimensions d'une matrice A donnée. On peut soit obtenir de manière séparée le nombre de lignes et de colonnes par les instructions size(A,1)et size(A,2)respectivement, soit obtenir le nombre m de lignes et le nombre n de colonnes par l'instruction [m,n] = size(A).
ans =
4
>>
On peut construire très simplement une matrice << par blocs >> . Si A, B, C, D désignent 4 matrices (aux dimensions compatibles), on définit la matrice bloc,
par l'instruction K = [A B ; C D]. Voici un exemple de construction par blocs de la matrice
>> A11 = [35 1 6; 3 32 7; 31 9 2];
>> A12 = [26 19; 21 23; 22 27];
>> A21 = [ 8 28 33; 30 5 34];
>> A22 = [17 10; 12 14];
>> B11 = [ A11 A12; A21 A22 ]
B11 =
35 1 6 26 19
3 32 7 21 23
31 9 2 22 27
8 28 33 17 10
30 5 34 12 14
>> B12 = [ 24 25 20 15 16]';
>> B = [ B11 B12];
>> B21 = [ 4 36 29 13 18 11];
>> B = [ B ; B21]
B =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
>>
eye(n) | : | la matrice identité de dimension n |
ones(m,n) | : | la matrice à m lignes et n colonnes dont tous les éléments valent 1 |
zeros(m,n) | : | la matrice à m lignes et n colonnes dont tous les éléments valent 0 |
rand(m,n) | : | une matrice à m lignes et n colonnes dont les éléments sont générés de manière aléatoire entre 0 et 1 |
Signalons que si les entiers m et n sont égaux on peut se contenter de ne spécifier qu'une seule valeur de dimension: ones(n) est la matrice carrée de dimension n dont tous les éléments valent 1. Mentionnons enfin la commande magic(n) qui permet d'obtenir une matrice magique de dimension n.
>> eye(3)
ans =
1 0 0
0 1 0
0 0 1
>> ones(3,2)
ans =
1 1
1 1
1 1
>> zeros(2)
ans =
0 0
0 0
>> rand(2,3)
ans =
0.4565 0.8214 0.6154
0.0185 0.4447 0.7919
>> magic(6)
ans =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
>>
>> A = magic(5)Si l'on souhaite échanger les colonnes 2 et 3 de la matrice A une première possibilité consiste à exécuter:
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> A(1,:)
ans =
17 24 1 8 15
>> A(:,2)
ans =
24
5
6
12
18
>>
>> v = A(:,2); A(:,2) = A(:,3); A(:,3) = v;On peut également extraire plusieurs lignes ou colonnes simultanément. Si J est un vecteur d'entiers, A(:,J)est la matrice issue de A dont les colonnes sont les colonnes de la matrice A d'indices contenus dans le vecteur J. De même A(J,:)est la matrice issue de A dont les lignes sont les lignes de la matrice A d'indices contenus dans le vecteur J. D'une façon plus générale, il est possible de n'extraire qu'une partie des éléments des lignes et colonnes d'une matrice. Si L et C sont deux vecteurs d'indices, A(L,C)désigne la matrice issue de la matrice A dont les éléments sont les A(i,j) tels que i soit dans L et j soit dans C.
A =
17 1 24 8 15
23 7 5 14 16
4 13 6 20 22
10 19 12 21 3
11 25 18 2 9
>>
>> A = magic(5)Dans la dernière instruction, on a utilisé la forme spéciale permettant de définir un vecteur dont les composantes sont en progression arithmétique, voir le paragraphe 2.3. Une seconde possibilité pour échanger les lignes 2 et 3 de la matrice A consiste à exécuter:
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
>> L = [1 3 5]; C = [3 4];
>> A(L,C)
ans =
1 8
13 20
25 2
>> A(1:2:5,3:4)
ans =
1 8
13 20
25 2
>>
>> J = [1 3 2 4]; A = A(:,J)Il existe des commandes MATLAB permettant de manipuler globalement des matrices. La commande diag permet d'extraire la diagonale d'une matrice: si A est une matrice, v=diag(A) est le vecteur composé des éléments diagonaux de A. Elle permet aussi de créer une matrice de diagonale fixée: si v est un vecteur de dimension n, A=diag(v) est la matrice diagonale dont la diagonale est v.
A =
17 1 24 8 15
23 7 5 14 16
4 13 6 20 22
10 19 12 21 3
11 25 18 2 9
>>
>> A=eye(3); diag(A)On n'est pas obligé de se limiter à la diagonale principale ... La commande diagadmet un second paramètre k pour désigner la k sur-diagonale (si k>0) ou la k sous-diagonale (si k<0).
ans =
1
1
1
>> v=[1:3]
v =
1 2 3
>> diag(v)
ans =
1 0 0
0 2 0
0 0 3
>>
>> A = [4 5 6 7 ; 3 4 5 6On construit à l'aide de la commande diagtrès simplement des matrices tridiagonales . Par exemple la matrice correspondant à la discrétisation par différences finies du problème de Dirichlet en dimension 1 s'obtient ainsi
2 3 4 5; 1 2 3 4]
A =
4 5 6 7
3 4 5 6
2 3 4 5
1 2 3 4
>> diag(A,1)
ans =
5
5
5
>> diag(A,-2)
ans =
2
2
>>
>> N=5;On dispose également de la commande tril permet d'obtenir la partie triangulaire inférieure (l pour lower) d'une matrice. La commande triupermet d'obtenir la partie triangulaire supérieure (u pour upper) d'une matrice.
>> A=diag(2*ones(N,1)) - diag(ones(N-1,1),1) - diag(ones(N-1,1),-1)
A =
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2
>>
>> A = [ 2 1 1 ; -1 2 1 ; -1 -1 2]Comme pour la commande diag, les commandes triu et triladmettent un second paramètre k. On peut ainsi obtenir la partie triangulaire supérieure (ou inférieure) à partir de la k diagonale. Ainsi,
A =
2 1 1
-1 2 1
-1 -1 2
>> triu(A)
ans =
2 1 1
0 2 1
0 0 2
>> tril(A)
ans =
2 0 0
-1 2 0
-1 -1 2
>>
>> tril(A,-1)On obtient la transposée de la matrice Aà coefficients réels en tapant A'. Si la matrice est à coefficients complexes, A' retourne la matrice adjointe de A.
ans =
0 0 0
-1 0 0
-1 -1 0
>> tril(A,1)
ans =
2 1 0
-1 2 1
-1 -1 2
>>
>> A = [0 1 2; -1 0 1; -2 -1 0]
A =
0 1 2
-1 0 1
-2 -1 0
>> A'
ans =
0 -1 -2
1 0 -1
2 1 0
>>
>> N=5;
>> A=diag(2*ones(N,1)) - diag(ones(N-1,1),1) - diag(ones(N-1,1),-1)
A =
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2
>> nnz(A)
ans =
13
>> B = sparse(A)
B =
(1,1) 2
(2,1) -1
(1,2) -1
(2,2) 2
(3,2) -1
(2,3) -1
(3,3) 2
(4,3) -1
(3,4) -1
(4,4) 2
(5,4) -1
(4,5) -1
(5,5) 2
>> whos
Name Size Bytes Class
A 5x5 200 double array
B 5x5 180 sparse array
N 1x1 8 double array
Grand total is 39 elements using 388 bytes
>> spy(A)
>>
Figure 2: Résultat de la commandespy(B).
Pour les très grosses matrices creuses, il n'est bien entendu pas souhaitable d'utiliser une structure pleine (full) pour définir la matrice avant de passer en stockage sparse. La commande sparsepermet de définir une matrice creuse directement sous la forme sparse. On l'utilise de la façon suivante: A = sparse(is,js,s,n,m) pour définir une matrice A à n lignes et m colonnes dont les coefficients sont nuls (et donc non mémorisés) sauf les éléments ais(l),js(l) qui valent s(l) pour l variant de 1 à L longueur du tableau s (L = length(s)).
>> N=5;Les commandes spdiags, speyeet sprandpermettent de construire des matrices diagonales, identités et des matrices dont les éléments sont des nombres aléatoires avec un stockage sparse. Elles s'utilisent de la même manière que leur équivalent diag, eyeetrand pour les matrices pleines.
>> s =[2*ones(1,N), -ones(1,N-1), -ones(1,N-1)]
s =
Columns 1 through 12
2 2 2 2 2 -1 -1 -1 -1 -1 -1 -1
Column 13
-1
>> is = [1:N,1:N-1,2:N]
is =
Columns 1 through 12
1 2 3 4 5 1 2 3 4 2 3 4
Column 13
5
>> js = [1:N,2:N,1:N-1]
js =
Columns 1 through 12
1 2 3 4 5 2 3 4 5 1 2 3
Column 13
4
>> B = sparse(is,js,s,N,N)
B =
(1,1) 2
(2,1) -1
(1,2) -1
(2,2) 2
(3,2) -1
(2,3) -1
(3,3) 2
(4,3) -1
(3,4) -1
(4,4) 2
(5,4) -1
(4,5) -1
(5,5) 2
>> A = full(B)
A =
2 -1 0 0 0
-1 2 -1 0 0
0 -1 2 -1 0
0 0 -1 2 -1
0 0 0 -1 2
>>
(c) Stéphane Balac - Centre de Mathématiques - INSA de Lyon