Matematik
længde af vektor
Hvordan kan jeg skabe en funktion i R som giver mig længden af en vektor? Jeg ved godt, at der allerede er en i programmet, men jeg vil gerne prøve selv at skabe en.
længden er antalet af elementer i en vektor
f.eks. er længden af (2,1,2,3) 4.
Svar #2
24. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
jo men hvordan skriver jeg den i programmet R?
Svar #5
25. juli 2014 af hesch (Slettet)
#2:
Ad #4: Jeg har fornemmet, at det er selve biblioteksfunktionen: length(v) du vil programmere i R ?
Jeg har også fornemmet, ved scanning af links, at sådanne programmæssige detaljer er svære at programmere i R, og at biblioteksfunktioner derfor typisk er programmeret i Assembler, Fortran eller C.
Du skal sætte dig ind i, hvordan R overfører parametre til funktioner. Dette kan typisk ske via en stak, og hvis antallet af parametre må være variabelt, må stakken jo fx på toppen indeholde dette antal. Ellers kan funktioner ikke skelne mellem parametre, return-adresse, og hvad der ellers må ligge på denne stak.
Antallet kan også være angivet på anden vis, men pointen er, at du sætter dig ind i hvordan. Dette er forudsætningen for at kunne programmere funktionen.
Svar #6
25. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
jeg er sandelig inde i R, og ja jeg vil slev skabe length- funktionen og ikke bruge den i selve koden!
Hvordan vil du evt gøre det i andre programmer?
Svar #7
26. juli 2014 af peter lind
dim v(n) opretter en vektor (array i programeringssprog) med dimensionen n
f(v)
l:= 0
for i = 1 to n
l= l+v(i)*v(i)
next
return sqr(l)
Svar #8
26. juli 2014 af hesch (Slettet)
#6: Jeg ved ikke hvordan R virker, men kan se, at man i et sprog som Delphi kan anvende dynamiske arrays. Disse håndteres her ved at allokere dynamisk memory, og altså ikke overføre disses værdier på stakken, men overfører dem fx vha. en pointer til det allokerede memory..
Men lad os nu sige, at R ved funktionskaldet: length(2,1,2,3) overfører værdier og antal værdier ved at 'pushe' værdier på stakken, herefter antallet af værdier, og til sidst return-address ved call length, så kunne length-funktionen assemblerprogrammeres noget i retning af:
length:
push bp ; save bp
mov bp,sp ; bp = sp = top of stack
mov ax,[ss:bp+6] ; n located behind bp and returnaddress ( offset 6 bytes )
pop bp ; recover bp
ret ; return ax = n
Med forbehold for fejl :)
Svar #10
26. juli 2014 af hesch (Slettet)
#9: Der står i #0: Længden er antallet af elementer i en vektor. ( vektorens dimension ).
Der skal ikke beregnes en absolut længde, eller lignende, af vektoren:
length(2,1,2,3) = 4 ( elementer )
svarende til at length( 'abcdefg' ) = 7.
Ja, det skulle forestille Microsoft assembler ( Intel 287 niveau ). Delphi er blot mit eksempel på et andet programmeringssprog, der håndterer dynamiske arrays.
Svar #11
26. juli 2014 af peter lind
#10 Opgaven går ud på at lave en funktion, der finder længden af en vektor. For at gøre det er det nødvendigt at funktionen indeholder en beregning af længden. Din løsning flytter kun rundt på nogle data. Det er ikke nok
Svar #12
26. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
jo, men hvordan skaber du en vektor af dimension n i R?
Svar #13
27. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
nu fik jeg det til at virke!!!!
se her!
m=100
lengthR=function(x){
y=c()
for(i in 1:m){
y[i]= (x[i]==x[i])==TRUE
}
s=subset(y,y==TRUE)
sum(s)
}
x=c(1,2,1,2,2,3)
lengthR(x)
# 6
Svar #14
27. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
Det eneste problem kan være kørsel-tiden! jeg har sat m til 100, men sætter jeg den til noget højere kan det måske tage længere tid at beregne........
Svar #15
27. juli 2014 af Therk
Hvis du vil gøre det på den måde, så brug i stedet en while-løkke.
lengthR=function(x){
y <- x[!is.na(x)]
STOP <- 0
s <- 0
i <- 1
while(STOP !=1){
ifelse(is.na(y[i]),
STOP <- 1,
s <- s+1)
i <- i+1
}
return(s)
}
Den funktion har dog flere problemer: Den virker ikke på arrays med indeksering fra andet end 1, den går i en uendelig løkke, hvis din vektor, x, er tom (så en tom vektor skal defineres som x <- c(NA) ) og sikkert flere, som jeg umiddelbart ikke har tænkt på.
Svar #16
27. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)
#15 Det ser rigtig godt ud! Hvad synes du om min version?
Svar #17
28. juli 2014 af Therk
#16#15 Det ser rigtig godt ud! Hvad synes du om min version?
Jeg har rettet den til en while-løkke, da en for-løkke har det problem, at enhver vektor større end m kommer ud som m, mens enhver vektor mindre end m bruger unødig regnetid. Jeg har brugt is.na(x) i stedet for dit (x[i]==x[i])==TRUE tjek, da du netop kontrollerer, om værdierne indeholder NA eller NaN. Den eneste fordel din for-løkke har er, at den ikke går i et uendeligt loop - det kan du dog undgå i while-løkken ved at indsætte et ekstra stop. Jeg ville dog stadig bruge length, men jeg kan da godt forstå det forståelsesmæssige i at skrive sin egen.
Svar #18
28. juli 2014 af skyri (Slettet)
Bemærk at jeres funktioner igonerer NA og NaN værdier i vektoren. Længden af x=c(1, NA, NaN, 2) er ifølge jeres funktioner 2.
Hvis du gerne må bruge funktioner på vektorer (fx sum og is.na), kan jeg slet ikke se behovet for en løkke. Én mulighed er at sætte alle elementer til 1, hvorefter længden af vektoren kan findes som dens sum. Et bud på en funktion, der både virker på tomme vektorer og vektorer der indeholder NA værdier:
lengthR=function(x)
ifelse(is.null(x),0,sum(is.na(x)*0+1))
Svar #19
28. juli 2014 af Therk
#18Bemærk at jeres funktioner igonerer NA og NaN værdier i vektoren. Længden af x=c(1, NA, NaN, 2) er ifølge jeres funktioner 2.
Hvis du gerne må bruge funktioner på vektorer (fx sum og is.na), kan jeg slet ikke se behovet for en løkke. Én mulighed er at sætte alle elementer til 1, hvorefter længden af vektoren kan findes dens sum. Et bud på en funktion, der både virker på tomme vektorer og vektorer der indeholder NA værdier:
lengthR=function(x)
ifelse(is.null(x),0,sum(is.na(x)*0+1))
Meget bedre bud.
Skriv et svar til: længde af vektor
Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk?
Klik her for at oprette en bruger.