importnumpyasnpdefradred(matr):# Funksjon rom radreduserer en matrise
shift=0# Variabel som teller antall kolonner som har 0 på hver relevante entry i kolonnen. Hvis en kolonne består av bare 0, ønsker vi å hoppe over den i algoritmen
forkolinrange(len(matr[0])):# Vi skal kjøre gjennom alle kolonnene i matrisen og radredusere
ifall(matr[rad][kol]==0forradinrange(kol-shift,len(matr))):# Vi må sjekke om alle entriene i kolonnen fra diagonalen og nedover er 0. Hvis shift != 0, betyr det at vi har "hoppet over" en kolonne, kol-shift kompanserer for dette hoppet.
shift+=1# Hvis alt var 0, så skal vi hoppe over denne kolonne. Shift variabelen teller antallet slike kolonner, derfor øker vi shift med 1
continue# continue hopper over resten av loopen. Dette ønsker vi fordi kolonnen består av 0, så vi vil radredusere neste rad
matr=sortere(matr,kol-shift,kol)# sortere() setter første ikke-0 rad opp til riktig høyde
matr=dele(matr,kol-shift,kol)# dele() deler ned alle variablene i den valge raden slik at entrien på [kol-shift][kol] blir 1
matr=redu(matr,kol-shift,kol)# redu() reduserer alle entryene i kol kolonnen til 0
return(matr)# Vi er nå ute av loopen, og radreduksjonen er ferdig. Vi returnerer den radreduserte matrisen.
1
2
3
4
5
defsortere(matr,h,b):# Funksjon som finner første rad med ikkenull entry i kolonne b, fra og med rad h. Denne raden byttes med rad h.
forradinrange(h,len(matr)):# Vi looper gjennom alle radene fra og med h
ifmatr[rad][b]!=0:# Tester om entry b i raden er ikke-0
matr[rad],matr[h]=matr[h],matr[rad]# Hvis sant, så bytter vi raden med rad h
returnmatr# når vi har byttet raden ønsker vi å returnere den sorterte matrisen.
defredu(matr,h,b):# Funksjon som reduserer alle entriene til 0, i en kolonne b, fra og med nivå h+1
forradinrange(len(matr)):# Looper gjennom alle radene fra og med rad h+1
skalar=matr[rad][b]/matr[h][b]# Sjekker verdien til matrisen i entrien på en gitt rad i kolonne b, denne skal vi nulle ut. # MERK VIKTIG AT DENNE IKKE ER INNE I LOOPEN, DA VIL DEN BLI REDEFINERT HVER LOOP!!
ifskalar==0orrad==h:# Hvis denne allerede er 0, så er vi ferdig
continue# Continue hopper da til neste runde i loopen
forkolinrange(b,len(matr[0])):# Vi ønsker å ta matr[rad]-skalar*matr[h], slik at vi får 0 på entry matr[rad][b]. Vi gjør dette komponentvis ved å loope gjennom alle
matr[rad][kol]=matr[rad][kol]-skalar*matr[h][kol]returnmatr# Loopen er slutt, og reduksjonen er ferdig. Returnerer den reduserte matrisen
defdele(matr,h,b):# Denne matrisen delen skalerer ned rad h, slik at entry b i rad h blir 1
skalar=1/matr[h][b]# Sjekker verdien til matrisen i entrien på rad h kolonne b, denne skal vi skalere med. # MERK VIKTIG AT DENNE IKKE ER INNE I LOOPEN, DA VIL DEN BLI REDEFINERT HVER LOOP!!
forkinrange(len(matr[h])):# Looper over alle kolonnene i raden
matr[h][k]=skalar*matr[h][k]# Skalerer ned entriene
returnmatr# Returnerer den modifiserte matrisen