Der er lige nu 1451 online.
Start Lektieforum Se video Test dig selv Opgaver
Opret spørgsmål

IT

MATLAB

08. juni 2012 af 

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)
08. juni 2012 af 

#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)
08. juni 2012 af 

du kan også bruge

b = hist(A,10)

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



08. juni 2012 af 

@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)
08. juni 2012 af 

#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



13. juni 2012 af 

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)
13. juni 2012 af 

#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



13. juni 2012 af 

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)
13. juni 2012 af 

#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



14. juni 2012 af 

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)
14. juni 2012 af 

#9: Hvad har du selv prøvet?

---

mvh

Jerslev



14. juni 2012 af 

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)
14. juni 2012 af 

#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



14. juni 2012 af 

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)
14. juni 2012 af 

#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



14. juni 2012 af 

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?    



14. juni 2012 af 

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)
14. juni 2012 af 

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

#16: Hvad er din kode?

---

mvh

Jerslev



14. juni 2012 af 

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)
14. juni 2012 af 

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

---

mvh

Jerslev


Forrige
1
2
Der er 32 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.