IT

MATLAB

08. juni 2012 af madschristensen (Slettet)

Hej allesammen 

 

Sidder og arbejder med en opgave i matlab, og har fået et lille problem.

 

Ud fra en vektor (1:20) skriver den vilkårlige tal fra 5-110.

Jeg have dem inddelt i intervaller. 

Intervallerne skal gå fra, den mindste værdi, til den største, med et interval på 20.

har derfor programmet intervallerne til at være:

Interval =min(fordelingen):20:max(fordelingen)

Dette virker udemærker, hvor jeg så får intervallet opgivet. jeg får f.eks. : 

20 40 60 70 80 

Men hvordan får jeg matlab til at udregne, hvor mange værdier fra vektoreren, som ligger i hvert af de intervaller?


Brugbart svar (1)

Svar #1
08. juni 2012 af Jerslev

#0: Du kan lave et tjek for hvert interval. Så snart et tal er indenfor intervallet kan den gemme et 1-tal i en vektor. Efterfølgende kan du summere op over vektoren.

Gør dette for hvert interval.

- - -

mvh

Jerslev


Brugbart svar (1)

Svar #2
08. juni 2012 af jnl123

du kan også bruge

b = hist(A,10)

som inddeler/tæller værdier af vektoren A i 10-intervaller


Svar #3
08. juni 2012 af madschristensen (Slettet)

@jerslev

Hvordan gør jeg så det?

For hver gang at mam kører funktionen, får jeg nye random til, så intervallerne skal jo følge med også.. 


Brugbart svar (1)

Svar #4
08. juni 2012 af Jerslev

#3: Du er nød til at lave en for-løkke, der kører samtlige værdier i vektoren igennem. Den skal dernæst undersøge, hvilket interval den første værdi hører til og så fylde ind i en vektor i det tilhørende interval. Det er enormt besværligt at skrive matlab-kode her dog.

- - -

mvh

Jerslev


Svar #5
13. juni 2012 af madschristensen (Slettet)

hmm.. har du mulighed for at skrive koden her alligevel? eller hvordan?

Har prøvet i flere dage nu, og kan simpelthen ikke få det til at virke..

Det ville være en stor hjælp


Brugbart svar (2)

Svar #6
13. juni 2012 af Jerslev

#5: dette ville være mit forslag:

Antaget din vektor med de tilfældige tal kaldes v.

Du kan dernæst lave intervalopdelingen som du selv har gjort:

interval = min(v):20:max(v);

Nu vil vi tjekke, om dine værdier i v ligger i de forskellige intervaller. Til det formål laves en vektor til hvert interval.

for i=1:length(v)

tal=v(i);

interval1(i)=0;

interval2(i)=0;

interval3(i)=0;

if and(v(i) >= min(v), v(i)<min(v)+interval)

interval1(i)=1;

elseif and(v(i)>=min(v)+interval,v(i)<min(v)+2*interval)

interval2(i)=1;

elseif and(....

end

Umiddelbart skulle dette gerne tjekke hver eneste værdi i din vektor v for at se, hvilket interval tallet tilhører. Programmet danner da en vektor til hvert interval, og hvis det i´te tal i v-vektoren tilhører intervallet, laves et 0 om til et 1-tal i den intervalvektor, tallet tilhører. Til slut kan du finde summen af indgangen i de enkelte intervalvektorer og denne sum skulle da gerne svare til antallet af tal i de enkelte intervaller.

 

Man kan sikkert lave programmere mere automatiseret til at tage tilfældige størrelser af intervallerne og maksimumværdier på den tilfældige fordeling, men det har jeg ikke skrevet med. Du kan selv udfylde resten.

- - -

mvh

Jerslev


Svar #7
13. juni 2012 af madschristensen (Slettet)

Tak for det.. der er kommet nogenlunde styr på det nu :) 

Har et andet problem, hvis du kan hjælp mig med det. 

I den samme vektor A, hvor der er tilfældige tal imellem 5-110. Der skal jeg lave en funktion, der laver en vektor B af samme størrelse, men kun har værdierne 1 eller 0. Så man ved et givent interval f.eks. min(x):1:min(x)+30 angiver et 1 i vektor B, på den plads i vektor A, hvor et tal der har været indenfor intervallet har været. Hvis tallet i vektor A ligger udenfor intervallet, returneres et 0 i vektor B, på den tilsvarende plads..

Kan du se dig ud af, hvordan man skal lave en funktion til det?


Brugbart svar (1)

Svar #8
13. juni 2012 af Jerslev

#7: Lav et tjek, der kører samtlige værdier af vektor A igennem. Lav i dette tjek en if-løkke, der undersøger, om din betingelse er opfyldt. Hvis den er opfyldt, skal den sætte den i´te indgang i B lig med 1, men er betingelsen ikke opfyldt, skal den sætte den i´te indgang lig med 0.

- - -

mvh

Jerslev


Svar #9
14. juni 2012 af madschristensen (Slettet)

Tak for svaret.. 

Kunne jeg evt. få dig til at skrive lidt mere om det eller selve funktionen? For har prøvet mig lidt frem nu, og kan ikke lige få det til at virke.. 


Brugbart svar (1)

Svar #10
14. juni 2012 af Jerslev

#9: Hvad har du selv prøvet?

- - -

mvh

Jerslev


Svar #11
14. juni 2012 af madschristensen (Slettet)

Jamen jeg har kaldt vektoren med de vilkårlige tal for A. 

Så har jeg lavet en der hedder B= 20.. Det er den værdi, som det første interval skal starte med..

Så jeg har skrevet:

If A< B+20

   C=1

else

C= 1

 

Har også prøve at skrive

 

If A< B+20

   disp=('1')

else

  disp=('0'=

 

 

Det virker bare ikke?


Brugbart svar (1)

Svar #12
14. juni 2012 af Jerslev

#11: Du er nødt til at gå samtlige værdier i din vektor A igennem hver for sig og lave et tjek på dem alle. Du skal derfor have en for-løkke til at gå alle værdierne igennem.

Udover det er der vist nogle rent syntaks-fejl i din kode. disp tager ikke et = - det er bare disp('1').

Jeg ville også mene, at der skulle stå C=0 efter din 'else'.

- - -

mvh

Jerslev


Svar #13
14. juni 2012 af madschristensen (Slettet)

Ja. det er rigtigt.. gik lige lidt for hurtigt med at svare tilbage.. 

Hvis jeg laver den så:

 

For A=("navn på vektoren")

   for B=20

if A<B+20

  C=1

else 

C=0 

 

end

Men det virker heller ikke? :S


Brugbart svar (1)

Svar #14
14. juni 2012 af Jerslev

#13: Du er nødt til at læse værdierne i vektor A en af gangen.

B=20                  %grænse du selv sætter

C=[];

for i=1:length(A)

if A(i) < B+20

    C(i) = 1;

else

C(i) = 0;

end

 

- - -

mvh

Jerslev


Svar #15
14. juni 2012 af madschristensen (Slettet)

Det virker nogenlunde nu..

Den giver 20 vektorer, hvor størrelsen bare er omvendt. altså 1 række med 20 søjler.

Den første vektor, er der 1 søjler, den næste er der 2 osv.. Så den alder sidste vektor er den "rigtige".. Hvordan får jeg kun den til at stå der?

Min problem nu, er at jeg skal gange den nye vektor her, men en anden vektor, på en lidt specielt måde:

Den nye              vektor D               resultat

      1                           67                         67

      0                          14                           0

      1                           7                            7

      1                          14                           14

       0                          45                            0

Hvis man ganger dem normalt. Så blir de jo ganget, som man normalt ganger matricer. hvilket den ikke skal?    


Svar #16
14. juni 2012 af madschristensen (Slettet)

Tror jeg har fået den til at gange vektorerne som de rigtigt skal.

 

Men hvordan får jeg den nye vektor C, til kun at være 1 vektor istedet for 20??


Brugbart svar (1)

Svar #17
14. juni 2012 af Jerslev

#15: Hvis du skal gange vektorers indgange sammen hver for sig, skal du bruge 'punktum-gange'. Altså .*

#16: Hvad er din kode?

- - -

mvh

Jerslev


Svar #18
14. juni 2012 af madschristensen (Slettet)

Ja.. det fandt jeg ud af.. 

Nu skal jeg gange en vektor, lad os kalde den for R. Den skal jeg gange med den nye C vektor, på den måde jeg lige beskrev.

Altså:

G=D.*C(i)

Det giver gangske rigtigt en vektor af samme størrelse om A.. Men der er kun 0 taller.. De 1 taller som vi fandt ud af at der var i C, er der ikke? 

 


Brugbart svar (1)

Svar #19
14. juni 2012 af Jerslev

#18: Prøv at fjerne dit (i) fra vektor C.

- - -

mvh

Jerslev


Svar #20
14. juni 2012 af madschristensen (Slettet)

Det siger den fejl i :S

Det er som om at man skal samle de to vektorer.. C(i)=1 og C(i)=0 .. Selvom at de giver den samme vektor når man kører dem.. Så når man gange den med D.. Så tager den kun som om at C(i) er en 0 vektor.. 


Forrige 1 2 Næste

Der er 31 svar til dette spørgsmål. Der vises 20 svar per side. Spørgsmålet kan besvares på den sidste side. Klik her for at gå til den sidste side.