De kolommen van een reële -matrix kunnen geïnterpreteerd worden als vectoren in een
-dimensionale ruimte. Deze vectoren zijn niet noodzakelijk orthonormaal (d.w.z. onderling loodrecht en met lengte 1).
Het Gram-Schmidt algoritme construeert uitgaande van de kolommen van een reeks van vectoren, allen lineaire combinaties
van de kolommen van die wel orthonormaal zijn.
Noem de vector die geassocieerd is met de -de kolom van . In een eerste stap zoeken we vectoren
die onderling loodrecht zijn, namelijk:
en voor :
In deze uitdrukking staat voor het scalair product van de vectoren en
.
In een laatste stap, normeren we de vectoren , namelijk
met de klassieke norm van de vector , gedefinieerd als de vierkantswortel uit de som van de kwadraten
van de componenten van .
Schrijf de functie orthonormaal()
met als enig argument een NumPy-tabel, met rijen en kolommen, en .
Het resultaat van de functie is een NumPy-tabel, eveneens bestaande uit rijen en kolommen, waarvan de kolommen de vectoren
voorstellen, verkregen via de hierboven beschreven aanpak. Je mag aannemen dat de originele tabel niet-singulier is.
Voorbeeld
a = [[1.0, 2.0, 3.0],[4.0, 5.0, 6.0], [9.0, 8.0, 4.0]]
orthonormaal(np.array(a)) =
[[ 0.10101525 0.61796622 -0.77968819]
[ 0.40406102 0.69066813 0.59976014]
[ 0.90913729 -0.37562653 -0.17992804]]