Vectoren: Vectorrekening in MATLAB
Rekenen met vectoren
Optelling, scalaire vermenigvuldiging en lineaire combinatie Je kunt vectoren optellen, met een scalar vermenigvuldigen en combineren. Dit gaat op de manier die je zou mogen verwachten. Het enige opmerkelijke aan optelling, maar wat wel een prettige bijkomstigheid blijkt te zijn, is dat je ook een getal bij een vector mag optellen of aftrekken en dat dit dan als een vector van geschikte lengte met alleen maar dat gegeven getal wordt opgevat zodat de optelling of verschil betekenis heeft.
>> u = [1; 2]; v = [3; 4];
>> u + v
ans =
4
6
>> 5*u
ans =
5
10
>> 5*u - 2*v
ans =
-1
2
>> u + 1
ans =
2
3
Vermenigvuldiging, inproduct, uitproduct en Hadamard product Tot nu toe zijn we het inproduct, het uitproduct en het Hadamard product tegengekomen. MATLAB faciliteert deze berekeningen:
>> clear all
>> u = [1;2;3]; v = [4;5;6];
>> inproduct = dot(u, v)
inproduct =
32
>> uitproduct = cross(u, v)
uitproduct =
-3
6
-3
>> Hadamard_product = u .* v
Hadamard_product =
4
10
18
>> u*v
Error using *
Inner matrix dimensions must agree.
>> u' * v % nog een manier om het inproduct van u en v uit te rekenen
ans =
32
Wat we van bovenstaand voorbeeld leren is dat het vermeningvuldigingsteken *
een speciale betekenis heeft, namelijk van vermenigvuldiging van matrices. MATLAB kan de vectoren opvatten als matrices met één kolom of één rij, en het product van een rijvector en kolomvector met gelijke dimensie kun je dan uitrekenen: dit is dan weer het inproduct.
Rekenkundige bewerkingen Met een puntje voor het vermenigvuldigingsteken, dus met .*
, geef je aan dat je vermenigvuldiging componentsgewijs wilt toepassen. Dit kan je ook met andere rekenkundige operatoren doen zoals deling en machtsverheffing. Op deze manier kun je ook snel vectoren construeren die gedefinieerd zijn door indexeringsfuncties of eenvoudig grafieken van functies maken. We geven wat voorbeelden ter illustratie.
>> clear all
>> u = [3;4]; v = [5;6];
>> u ./ v % componentsgewijze deling
ans =
0.6000
0.6667
>> u .^ 2 % componentsgewijze machtsverheffing
ans =
9
16
>> sqrt(sum(u.^2)) % berekening van de Euclidische norm van u
ans =
5
>> i = 1:5; v = 1 ./ (i + 1) % v_i = 1/(i+1)
v =
0.5000 0.3333 0.2500 0.2000 0.1667
>> t = 0:0.01:pi;
>> y = t - 1/6*t.^3 + 1/120*t.^5 - 1/5040*t.^7;
>> s = sin(t);
>> plot(t,s, '-b', t, y, '-r') % grafiek van sinus (in blauw) en veeltermfunctie (in rood)
Vectorisatie Het laatste voorbeeld van een sinusgrafiek illustreert ook dat MATLAB 'begrijpt' dat de enige zinvolle toepassing van wiskundige functies op vectoren is dat ze componentsgewijs gebruikt worden. Deze manier van werken heet vectorisatie en maakt de MATLAB taal zo bondig en helder. We geven nog een paar voorbeelden ter illustratie.
>> clear all
>> x = 1:5
x =
1 2 3 4 5
>> sqrt(x) % componentsgewijs worteltrekken
ans =
1.0000 1.4142 1.7321 2.0000 2.2361
>> log(x) % componentsgewijs natuurlijke logaritme toepassen
ans =
0 0.6931 1.0986 1.3863 1.6094
>> exp(x) % componentsgewijs exponentiele functie toepassen
ans =
2.7183 7.3891 20.0855 54.5982 148.4132
>> clear all
>> i = 1:6; v = (-1).^i ./ i % v_i = (-1)^i/i
v =
-1.0000 0.5000 -0.3333 0.2500 -0.2000 0.1667
>> minmax = [min(v) max(v) ] % minimum en maximum
minmax =
-1.0000 0.5000
>> sum(v) % alle componenten sommeren
ans =
-0.6167
>> cumsum(v) % cummulatieve sommatie
ans =
-1.0000 -0.5000 -0.8333 -0.5833 -0.7833 -0.6167
> sv = sign(v) % tekens van de componenten
sv =
-1 1 -1 1 -1 1
>> dsv = diff(sv) % verschillen in opeenvolgende tekens
dsv =
2 -2 2 -2 2
>> find(dsv>0) % indices met overging van - naar + teken in v
ans =
1 3 5