Matematik

længde af vektor

23. juli 2014 af thomaslarsen90Arocketmailcom (Slettet) - Niveau: Universitet/Videregående

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.


Brugbart svar (0)

Svar #1
23. juli 2014 af SuneChr

f:\: \: \left ( a_{1},a_{2}\, ,...\, ,a_{n} )\: \: \curvearrowright\: n\in \mathbb{N}\subseteq \mathbb{R}


Svar #2
24. juli 2014 af thomaslarsen90Arocketmailcom (Slettet)

jo men hvordan skriver jeg den i programmet R?


Brugbart svar (0)

Svar #3
24. juli 2014 af hesch (Slettet)

#2:  Det er et IT-spørgsmål, ikke et matematik-spørgsmål.


Brugbart svar (0)

Svar #4
24. juli 2014 af Therk

~ \\ \verb|Thomas <- function(v){ | \\ \verb| l <- length(v)|\\ \verb| return(l)| \\ \verb|}|

Eller hvad tænker du på?


Brugbart svar (0)

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?


Brugbart svar (0)

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)


Brugbart svar (0)

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       :)


Brugbart svar (0)

Svar #9
26. juli 2014 af peter lind

#8 Det er assembler ikke delphi. Der mangler udregningerne.


Brugbart svar (0)

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.


Brugbart svar (0)

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........


Brugbart svar (0)

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?


Brugbart svar (0)

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.


Brugbart svar (0)

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))


Brugbart svar (0)

Svar #19
28. juli 2014 af Therk

#18

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 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.