21 svar
691 visningar
charlizo121 19
Postad: 23 jan 2020 18:29

For loop

Hej!

Jag försöker göra en for loop med euklidiska normen. Jag har en vektor b = på 240 element. och när jag kör norm på min vektor b så får jag ett värde. Jag vet inte hur jag kan göra det till en vektor så att jag sedan kan det element som har högst och lägst värde.

charlizo121 19
Postad: 23 jan 2020 22:07

oj min for loop blir såhär:

for t = 1:240

x = norm(b(t))

end

Problemet är att den skriver ut alla värden för sig. Jag vill ha det som en lång vektor med alla värden för att jag sedan skall kunna ta fram max o min värdet i vektorn. 

parveln 703 – Fd. Medlem
Postad: 23 jan 2020 22:10

Skapa en vektor innan loopen som du lägger in värdena i. Förslagsvis preallokerar du minne med t ex X = zeros(240);

charlizo121 19
Postad: 23 jan 2020 22:14
parveln skrev:

Skapa en vektor innan loopen som du lägger in värdena i. Förslagsvis preallokerar du minne med t ex X = zeros(240);

Jag förstår inte riktigt vad du menar med ditt förslag. Jag har min b vektor som jag fått från en gausseliminering . Jag har ju min beräkning inne i loopen så hur ska jag lägga värderna av x innan loopen ? 

Tegelhus 227
Postad: 24 jan 2020 09:36
charlizo121 skrev:
parveln skrev:

Skapa en vektor innan loopen som du lägger in värdena i. Förslagsvis preallokerar du minne med t ex X = zeros(240);

Jag förstår inte riktigt vad du menar med ditt förslag. Jag har min b vektor som jag fått från en gausseliminering . Jag har ju min beräkning inne i loopen så hur ska jag lägga värderna av x innan loopen ? 

Du skapar en "tom" (egentligen fylld med nollor) vektor X först, sen tilldelar du den ett värde i taget inne i loopen, förslagsvis genom X(t) = ...

charlizo121 19
Postad: 24 jan 2020 13:14 Redigerad: 24 jan 2020 13:14
Tegelhus skrev:
charlizo121 skrev:
parveln skrev:

Skapa en vektor innan loopen som du lägger in värdena i. Förslagsvis preallokerar du minne med t ex X = zeros(240);

Jag förstår inte riktigt vad du menar med ditt förslag. Jag har min b vektor som jag fått från en gausseliminering . Jag har ju min beräkning inne i loopen så hur ska jag lägga värderna av x innan loopen ? 

Du skapar en "tom" (egentligen fylld med nollor) vektor X först, sen tilldelar du den ett värde i taget inne i loopen, förslagsvis genom X(t) = ...

Hej sorry jag misstförtod min uppgift. Det är så att jag har en b vektor som består av nollor med 240 element. Jag ska räkna ut x via Ax=b då jag redan har A i uppgiften.  Jag ska byta ut varje element var för sig mot -2 och räkna ut x via AX =b . Ja ska sedan ta normen för alla x och även kunna hita max o min. Detta ska ske genom att använda en for loop.

SaintVenant 3956
Postad: 24 jan 2020 15:10
charlizo121 skrev:

Hej sorry jag misstförtod min uppgift. Det är så att jag har en b vektor som består av nollor med 240 element. Jag ska räkna ut x via Ax=b då jag redan har A i uppgiften.  Jag ska byta ut varje element var för sig mot -2 och räkna ut x via AX =b . Ja ska sedan ta normen för alla x och även kunna hita max o min. Detta ska ske genom att använda en for loop.

Ganska oklart vad du menar, är det så här:

enorm=zeros(240,1);
maxmin=zeros(240,2);

for i=1:240

      b(i)=-2;
      x=A\b;
      enorm(i)=norm(x);
      maxmin(i,1)=max(x);
      maxmin(i,2)=min(x);

end

Om inte får du vara mer tydlig.

charlizo121 19
Postad: 24 jan 2020 15:24 Redigerad: 24 jan 2020 15:25
Ebola skrev:

Det jag menar är att jag har en vektor som består av nollor och har 240 element. Jag skall byta ut vartannat värde till minus 2 var för sig och räkna ut (x) från Ax = b där jag har A redan givet och vektorn är b. Så i första steget har jag min vektor b = 0 -2 0 0 osv  och så får jag ett x från x = A\b. Sedan så gör jag det  igen där jag har b = 0 0 0 -2 0 0 osv. Jag flyttar -2 med 2.  Sedan får jag ett nytt x värde. Detta ska ske i en for loop och jag ska få ett nytt x värde. Jag ska göra så för alla gånger -2 ersätts till ny plats. Därfefters skall ajg använda euklidiska normen för att summera alla x jag får. 

j = 2;
v =0; 
for v = 0:100  Osäker på hur långt det ska gå. 
b = zeros(240,1); b(j+v)=-2 ; % f
x = A\b;

v = v+2;

Så har jag skrivit och jag få inte flera x med olika värden efter varandra utan jag får ett x värde när jag kör som ser ut att vara typ en summa av alla itterationer.  

Ganska oklart vad du menar, är det så här:

enorm=zeros(240,1);
maxmin=zeros(240,2);

for i=1:240

      b(i)=-2;
      x=A\b;
      enorm(i)=norm(x);
      maxmin(i,1)=max(x);
      maxmin(i,2)=min(x);

end

Om inte får du vara mer tydlig.

charlizo121 19
Postad: 24 jan 2020 16:44

Vet inte hur jag ska byta plats på -2  i b för varje iteration.

SaintVenant 3956
Postad: 24 jan 2020 19:15

Du kan väl skriva 

for i=2:2:240

       b(i) = -2;

       x = A\b;

       ...

       b(i) = 0;

end

charlizo121 19
Postad: 25 jan 2020 11:59
Ebola skrev:

Du kan väl skriva 

for i=2:2:240

       b(i) = -2;

       x = A\b;

       ...

       b(i) = 0;

end

Betyder din kod att alla varanan 2 4 6 osv är -2 ? eller betyder den att den räknar ut för x för varsin -2 på varanan plats i b. ? 

SaintVenant 3956
Postad: 26 jan 2020 19:39
charlizo121 skrev:

Betyder din kod att alla varanan 2 4 6 osv är -2 ? eller betyder den att den räknar ut för x för varsin -2 på varanan plats i b. ? 

Eftersom sista raden är b(i)=0; så återställs naturligtvis vektorn efter varje loop.

Om du testar koden kan du säkert se vad den gör, ha för vana att göra det när du programmerar. Eftersom du har en lång vektor kan du helt enkelt testa koden för en kortare vektor och printa vektorn efter varje loop för att se vad som händer med den.

Laguna Online 30711
Postad: 27 jan 2020 08:10
Ebola skrev:
charlizo121 skrev:

Betyder din kod att alla varanan 2 4 6 osv är -2 ? eller betyder den att den räknar ut för x för varsin -2 på varanan plats i b. ? 

Eftersom sista raden är b(i)=0; så återställs naturligtvis vektorn efter varje loop.

Om du testar koden kan du säkert se vad den gör, ha för vana att göra det när du programmerar. Eftersom du har en lång vektor kan du helt enkelt testa koden för en kortare vektor och printa vektorn efter varje loop för att se vad som händer med den.

Varför blev det vartannat element (for i = 2:2:240)? Man ska väl sätta varje element i b till -2 i tur och ordning?

Jag kan tänka mig att det är normen man ska hitta maximum och minimum för, för övrigt.

SaintVenant 3956
Postad: 27 jan 2020 13:11
Laguna skrev:

Varför blev det vartannat element (for i = 2:2:240)? Man ska väl sätta varje element i b till -2 i tur och ordning?

Jag kan tänka mig att det är normen man ska hitta maximum och minimum för, för övrigt.

Charlizo skrev så här:

Jag skall byta ut vartannat värde till minus 2 var för sig och räkna ut (x) från Ax = b där jag har A redan givet och vektorn är b. Så i första steget har jag min vektor b = 0 -2 0 0 osv  och så får jag ett x från x = A\b. Sedan så gör jag det  igen där jag har b = 0 0 0 -2 0 0 osv. Jag flyttar -2 med 2. 

Det kanske är normen som man ska hitta ett maximum för, uppgiftsbeskrivningen var oklar och förhoppningsvis har hen löst uppgiften.

Laguna Online 30711
Postad: 27 jan 2020 14:02
Ebola skrev:
Laguna skrev:

Varför blev det vartannat element (for i = 2:2:240)? Man ska väl sätta varje element i b till -2 i tur och ordning?

Jag kan tänka mig att det är normen man ska hitta maximum och minimum för, för övrigt.

Charlizo skrev så här:

Jag skall byta ut vartannat värde till minus 2 var för sig och räkna ut (x) från Ax = b där jag har A redan givet och vektorn är b. Så i första steget har jag min vektor b = 0 -2 0 0 osv  och så får jag ett x från x = A\b. Sedan så gör jag det  igen där jag har b = 0 0 0 -2 0 0 osv. Jag flyttar -2 med 2. 

Det kanske är normen som man ska hitta ett maximum för, uppgiftsbeskrivningen var oklar och förhoppningsvis har hen löst uppgiften.

Jaha, det gjordes en redigering djupt inuti ett inlägg. 

charlizo121 19
Postad: 27 jan 2020 15:33 Redigerad: 27 jan 2020 15:41

När den körs får jag en lista på x  där det blir ett mellanrum och så får man nästa x värden som en lista undan. Hur gör jag då för att få euklidiska formen för alla dessa x. Koden sparar ju inte alla x utan matar bara ut dem från for slingan. Jag tänkte att man kan använda norm funktionen.

charlizo121 19
Postad: 27 jan 2020 15:53

När jag lägger till norm(X) under b(0)= 0. Så får jag massa normen för varje x (arje iteration) och inte för alla x tillsammans.

Laguna Online 30711
Postad: 27 jan 2020 15:58

Det här förstår jag inte riktigt: "Därfefters skall ajg använda euklidiska normen för att summera alla x jag får".

Har du en bild på uppgiften?

charlizo121 19
Postad: 27 jan 2020 16:08
Laguna skrev:

Det här förstår jag inte riktigt: "Därfefters skall ajg använda euklidiska normen för att summera alla x jag får".

Har du en bild på uppgiften?

Det jag menar är att jag har nu fått x som matas ut för varje -2 i varannan position. Det jag vill ha nu är roten ur (summan av alla x) dvs normen.  Om jag skriver normen efter loopen får jag ett x värde vilket borde stämma och det borde vara den totala .Men jag behvöer även ta fram minimala och max då jag har en massa x. Så jag antar att jag även ska ta normen för varje x varsin och kolla vilken som har minst och stört värde.  Jag antar det kan göras efter loopen också.

Laguna Online 30711
Postad: 27 jan 2020 17:48

Om du vill summera något kan du sätta en variabel

summa=0;

före loopen och sedan plussa på variabeln inne i loopen. 

charlizo121 19
Postad: 27 jan 2020 19:48 Redigerad: 27 jan 2020 20:31

,,

charlizo121 19
Postad: 27 jan 2020 20:31

Det jag missade med min fråga är att jag ska spara varje x som matas ut från loopen . I nuläget så viar den x som en list amed siffror efter varandra och om jag lägger in norm / max / min etc i loopen så kommer den ta på sista x värdet som körs i iterationen. 

Svara
Close