Vektorregning i R

I min begynderguide om programmering med R, introducerede jeg kort til vektorer. I denne artikel fokuserer jeg noget mere på vektorregning i R. 
Regning med vektorer er vigtigt at kende til, fordi det kan bruges til mange forskellige beregninger. I matematik er en vektor en størrelse, der er en række med tal. I R programmering er en vektor en størrelse, der er en række med elementer af samme datatype. Det kan være tal, men det kunne f.eks. også være en række med forskellige tekststrenge. I det meste af denne artikel, hvor vi skal regne med vektorer, vil vi dog antage at datatypen for elementerne er tal.
For at oprette en vektor bruger du funktionen c. Som argument indtaster du alle de elementer som vektoren skal bestå af. I dette eksempel opretter jeg for eksempel en vektor a, som består af en række af 5 tal.

a<-c(1,3,6,4,2)

For at hente værdi nummer 3 skal jeg skrive:

a[3]

Bemærk at dette er anderledes i forhold til arrays (rækker af datastørrelser) i andre programmeringssprog, hvor indexet ofte begynder med 0. I R begynder indexet med 1. Og for at se hele vektoren kan jeg bruge kommandoen.

a[]

Du kunne faktisk også bare have skrevet a, hvilket også ville returnere værdierne. I denne artikel vil jeg dog bruge notationen a[] for at illustrere at der er tale om en vektor. Såvidt så godt.

Læg to vektorer sammen

I matematik kan du også lægge to vektorer sammen eller trække dem fra. Dette kan du kun gøre for to vektorer der har den samme længde, dvs. det samme antal tal i rækken. Her vil du blot få en ny vektor af samme længde, men hvor elementerne for den samme index er lagt sammen. Dvs. de tal på plads nr. 1 er lagt sammen, de tal på plads nr. 2 er lagt sammen osv.
I R sker der nøjagtig det samme, hvis du forsøger at lægge to vektorer af samme længde sammen. Du får her en ny vektor med samme længde, hvor værdierne for samme index er lagt sammen. I nedenstående eksempel har vi for eksempel en vektor a og vektor b med hver 5 værdier, som bliver lagt sammen til en ny vektor c der også har 5 værdier.

a<-c(1,3,6,4,2)
b<-c(4,7,6,4,3)
c<-a+b
c[]

Resultatet af disse kommandoer ville være at indholdet af vektor c blev returneret. Det ville give resultatet:

5 10 12 8 5

Den vil altså have taget 1+4, 3+7, 6+6, 4+4 og 2+3 og skabt den nye vektor c. I dette eksempel, hvor du lægger to vektorer sammen kunne du lige så godt have trukket dem fra hinanden, hvilket sker på samme måde.

Vektorer af forskellig længde

Hvad hvis du gør det samme, men med vektorer af forskellig længde? Dette ville du ikke kunne gøre i matematik, og i R programmering får du en advarsel, men det kan faktisk lade sig gøre. Et eksempel kunne være nedenstående hvor vektor a har 5 værdier, men vektor b har 6 værdier.

a<-c(1,3,6,4,2)
b<-c(4,7,6,4,3,3)
c<-a+b
c[]

Så ville du få følgende fejl: “I a + b : longer object length is not a multiple of shorter object length“, men følgende vil blive returneret fra c:

5 10 12 8 5 4

Den nye vektor c vil altså have samme længde som den længste vektor. Når R skal lægge tallene sammen, starter den bare forfra i vektor a, når den skal have det sidste tal for vektor b. Du får altså et resultat, men ikke et resultat der giver mening.

Gang et tal med en vektor

I matematik ganger du et tal med en vektor, ved at gange tallet ind i hver koordinat. Det samme sker i R ved at bruge koden:

a<-c(1,3,6,4,2)
c<-5*a
c[]

Får du følgende resultat:

5 15 30 20 10

Gang to vektorer sammen

I matematik kan du ikke gange to vektorer sammen i klassisk forstand. Dette kan du godt i R, og det foregår på samme måde som da du lagde to vektorer sammen. Den nye vektor skabes ved at gange værdierne med samme index sammen. I nedenstående eksempel har vi en vektor a og vektor b med 5 værdier, og vi laver en ny vektor c også med 5 værdier med at gange de enkelte værdier sammen.

a<-c(1,3,6,4,2)
b<-c(4,7,6,4,3)
c<-a*b
c[]

Her ville c returnere:

4 21 36 16 6

Igen har den altså ganget hver enkel værdi sammen og lavet en ny vektor med resultatet og samme længde som før. På samme måde som før, starter a bare forfra, hvis der skal ganges med en værdi der har et index der er højre end a’s største index.
I matematik kan du ikke dividere to vektorer, men i R kan du gøre det på samme måde som de bliver ganget sammen. Altså hvor hver værdi så bliver divideret med hinanden.

Prikproduktet

Selvom du i matematik ikke kan gange to vektorer sammen i klassisk forstand, kan du godt lave et produkt af to vektorer. Et af dem er det såkaldte prikprodukt eller skalarprodukt, hvor du får et almindeligt tal (også kaldet en skalar). Dette foregår i matematik ved at du ganger tallene med samme index og lægger alle resultater sammen:

a=(1,3,6,4,2)
b=(4,7,6,4,3)
a prik b = 1*4+3*7+6*6+4*4+2*3 = 83

Det er også muligt at få samme resultat i R, men her skal du ikke bruge “*” for at gange de to vektorer sammen, men derimod “%*%”.

a<-c(1,3,6,4,2)
b<-c(4,7,6,4,3)
c<-a%*%b
c[]

Dette ville returnere en vektor med kun én værdi, dvs. en skalar, der netop har værdien 83.

Krydsproduktet

I matematik findes der også et andet produkt af to vektorer, der hedder et krydsprodukt. Her ville produktet være en ny vektor af samme længde, som udregnes ved en bestemt formel. Dette kan du også i R, men det er ikke indbygget i R. Det findes derimod i en pakke der hedder pracma, som du kan installere og bruge ved at skrive kommandoerne:

install.packages("pracma")
library(pracma)

Herefter kan du udregne krydsproduktet på følgende måde:

a<-c(1,2,3)
b<-c(4,5,6)
c<-cross(a,b)
c[]

Dette ville returnere en ny vektor c med værdierne:

-3 6 -3

Der altså netop er krydsproduktet af de to vektorer.

0 0 votes
Article Rating

Andreas Andersen

Forfatter og grundlægger af IT-blogger.dk, der har blogget om IT-emner siden 2012. Findes på Mastodon på @aphandersen@ansico.dk

You may also like...

Abonner
Giv besked ved
guest

0 Comments
mest stemt på
nyeste ældste
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x