2016-02-28, 21:32
  #481
Medlem
Citat:
Ursprungligen postat av bigkjell85
Jo har suttit en bra stund, men det står helt still känns det som.

Har iaf kommit fram till dessa tankar:

Börjar med att förenkla problemet och vill istället finna längsta sekvensen av enbart talet 2.
Men fan inte ens det klarar jag klura ut.. Total nybörjare
Var ska jag sätta in att jag endast är ute efter siffran 2?? Ska jag använda if-sats eller nått annat? Känns jävligt frustrerande att inte ha en aning..

Kod:
function longest = les(x)
  longest = min(length(x),1);   
  len = 1;
  
   for i = 2:length(x)
      if x(i)==x(i-1)
          len = len+1;
      else
          len = 1;
      end
      if len>longest 
          longest = len;
      end
  end
end
Min första tanke är att du borde kunna använda AND-villkor, så något i stil med:
Kod:
function longest = les(x)
  longest = min(length(x),1);   
  len = 1;
  
   for i = 2:length(x)
      if x(i)==x(i-1)  && x(i)==2;
          len = len+1;
      else
          len = 1;
      end
      if len>longest 
          longest = len;
      end
  end
end
för att filtrera ut alla sekvenser av tvåor. Om det är det smidigaste sättet har jag ingen aning om, men det borde fånga det du vill ha och är generaliserbart genom en indexering till så att du har
Kod:
 for i = 2:length(x)
     for j = 0:9
         if x(i)==x(i-1)  && x(i)==j;
när du skall ha det generella fallet.
__________________
Senast redigerad av Linara 2016-02-28 kl. 21:34.
Citera
2016-02-28, 22:09
  #482
Medlem
matteyass avatar
Citat:
Ursprungligen postat av bigkjell85
Ok, nu är jag med. Tack!
Hur går man vidare härifrån? Alltså nu får jag ju bara veta hur lång den längsta sekvensen av samma tal är. Hur ska man tänka för att få lösa problemet för varje tal mellan 0-9 och dess positioner i vektorn?
Vill inte ha hela lösningar, bara lite starthjälp.
I det här fallet är Linaras förslag mer komplicerat, enligt mitt tycke. (rätt kul egenskap, ibland är generella problem enklare än specifika: https://en.wikipedia.org/wiki/Inventor%27s_paradox)

if-blocket som kollar len > longest är det kodblock som sparar längden på längsta sekvensen. Vet du hur den funkar? Eftersom det blocket kör sin kod när du hittat en ny längsta sekvens så kan det väl vara en god tanke att göra nåt där inne? Spara undan vilken siffra det handlar om, exempelvis.

Om du vill plocka ut mer info från funktionen måste du även ändra första raden. function X = f(x) returnerar ett element, X. Det kan vara en lista (med massor av element) eller vad som helst, men det som returneras måste vara en enhet så att säga. För att få ut fler element kör man function [X,Y,Z,...] = f(x).

Sen när du använder f(x) i konsolen så kan du köra exempelvis [apa, kaka] = f(whatever) så får du ut det som definerats som X och Y i funktionen. Är du intresserad av X och Z istället kan du köra [apa, ~, kaka] = f(whatever).
__________________
Senast redigerad av matteyas 2016-02-28 kl. 22:11.
Citera
2016-02-28, 22:45
  #483
Medlem
Citat:
Ursprungligen postat av matteyas
I det här fallet är Linaras förslag mer komplicerat, enligt mitt tycke. (rätt kul egenskap, ibland är generella problem enklare än specifika: https://en.wikipedia.org/wiki/Inventor%27s_paradox)

if-blocket som kollar len > longest är det kodblock som sparar längden på längsta sekvensen. Vet du hur den funkar? Eftersom det blocket kör sin kod när du hittat en ny längsta sekvens så kan det väl vara en god tanke att göra nåt där inne? Spara undan vilken siffra det handlar om, exempelvis.

Om du vill plocka ut mer info från funktionen måste du även ändra första raden. function X = f(x) returnerar ett element, X. Det kan vara en lista (med massor av element) eller vad som helst, men det som returneras måste vara en enhet så att säga. För att få ut fler element kör man function [X,Y,Z,...] = f(x).

Sen när du använder f(x) i konsolen så kan du köra exempelvis [apa, kaka] = f(whatever) så får du ut det som definerats som X och Y i funktionen. Är du intresserad av X och Z istället kan du köra [apa, ~, kaka] = f(whatever).
Intressant! Hade jag ingen koll på och är sånt man missar när man inte sitter vid en dator med matlab på och kan testa. Verkar ju helt klart mycket smidigare än att ta delproblemen och bygga allt själv
Citera
2016-02-28, 23:30
  #484
Medlem
Jag tänker mig nått sånt här? Är dock osäker på beginning = ?; och ending = ? ;

Kod:
function [longest,beginning,ending] = les(x)
  longest = min(length(x),1);   
  len = 1;
   beginning = ?; ending = ?;  
     for i = 2:length(x)
      if x(i)==x(i-1)
          len = len+1;
      else
          len = 1;
      end
      if len>longest 
          longest = len;
           beginning = ? ending = ?
      end
  end
end
  end
Citera
2016-02-29, 00:06
  #485
Medlem
BlaBlaBrahs avatar
Citat:
Ursprungligen postat av bigkjell85
Jag tänker mig nått sånt här? Är dock osäker på beginning = ?; och ending = ? ;

Kod:
function [longest,beginning,ending] = les(x)
  longest = min(length(x),1);   
  len = 1;
   beginning = ?; ending = ?;  
     for i = 2:length(x)
      if x(i)==x(i-1)
          len = len+1;
      else
          len = 1;
      end
      if len>longest 
          longest = len;
           beginning = ? ending = ?
      end
  end
end
  end
Fundera på vad värdena för följande variabler är när befinner dig i ditt andra if-block:
i
x(i)
len
Citera
2016-02-29, 03:19
  #486
Medlem
matteyass avatar
Citat:
Ursprungligen postat av bigkjell85
Kod:
function [longest,beginning,ending] = les(x)
  longest = min(length(x),1);   
  len = 1;
   beginning = ?; ending = ?;  
     for i = 2:length(x)
      if x(i)==x(i-1)
          len = len+1;
      else
          len = 1;
      end
      if len>longest 
          longest = len;
           beginning = ? ending = ?
      end
  end
end
  end
Här är mitt kodförslag. Jag föreslår att du tittar på det sparsamt, och implementerar ditt eget förslag. Det finns inga rätt och fel; kodning är lite som konst (jag har aldrig varit speciellt konstnärlig ska väl tilläggas).

Kod:
function [longest, start_index, value] = les(x)
n = length(x);

% make sure x has at least one element
if n == 0
    longest = 0;
    start_index = -1;
    value = NaN;
    return % quits the function
end

% initialize variables, assuming length(x) == 1,
% any other case will be handled by the for-loop
longest = 1;
start_index = 1;
value = x(1);

len = 1;
for i = 2:n
    if x(i)==x(i-1)
        len = len+1;
    else
        len = 1;
    end
    if len>longest
        longest = len;
        start_index = i - len + 1;
        value = x(i);
    end
end
end
Notera att vi kan få ut index till slutet av sekvensen då vi vet start_index och längd på sekvensen.
Citera
2016-02-29, 09:48
  #487
Medlem
Citat:
Ursprungligen postat av matteyas
Kod:
function [longest, start_index, value] = les(x)
n = length(x);
% make sure x has at least one element
if n == 0
    longest = 0;
    start_index = -1;
    value = NaN;
    return % quits the function
end

Jag hänger inte riktigt med på vad det översta if-blocket fyller för funktion, speciellt vad detta är :
value = NaN; ?

Jag har även svårt att tolka :

Kod:
if len>longest       
        longest = len;
        start_index = i - len + 1;   % <=
        value = x(i);                % <=                    
    end
Citera
2016-02-29, 10:38
  #488
Medlem
Citat:
Ursprungligen postat av bigkjell85
Jag hänger inte riktigt med på vad det översta if-blocket fyller för funktion, speciellt vad detta är :
value = NaN; ?

Jag har även svårt att tolka :

Kod:
if len>longest       
        longest = len;
        start_index = i - len + 1;   % <=
        value = x(i);                % <=                    
    end
Det första blocket är en "idiot"-check som ser till att om du ger funktionen input med något den inte är tänkt för att hantera så kraschar den inte eller skapar andra problem. Det är fullt möjligt att mata in en tom vektor till den. Koden x=[]; ger dig en tom vektor, dvs en som saknar värden och matar du in det i funktionen så händer det saker man inte vill utan ett test om input är ok.

Det är inget man tänker på i början när man lär sig koda, men det är väldigt bra att ha med den typen av tester i kod eftersom användare generellt kommer att göra konstiga saker som att mata in en textsträng till funktioner som skall ha tal som input, negativa tal till en funktion som bara tar positiva tal eller nåt annat som inte är tänkt att göras.

NaN är en vanlig förkortning för "Not a Number" och påvisar att det sökta värdet saknas.

start_index = i - len + 1; ger dig startindex för sekvensen som är longest i vektorn du matat in. i är aktuellt index för hur långt funktionen hunnit i undersökningen av värden i din vektor och att len+1 används är för att när sekvensen slutar så måste du räkna bakåt hur lång den var för att komma till där den började. Om du siffersekvensens längd (len) steg tillbaka så hamnar du på indexet före start, där du har en annan siffra. Därför len+1 och inte bara len.

value = x(i); ger dig vilket värde som ligger i position i i vektorn x. Det sparar vilken siffra som sekvensen longest består av eftersom alla siffror i sekvensen är lika.
__________________
Senast redigerad av Linara 2016-02-29 kl. 10:50.
Citera
2016-02-29, 11:35
  #489
Medlem
Citat:
Ursprungligen postat av Linara
... Därför len+1 och inte bara len.

Smart!

Dock får jag fortfarande endast ut hur längden på sekvensen.

Kod:
 w=[3 1 4 4 2 1 4 5 8 8 8 1 4 0]  % vektorn w

les(w)   % anropar funktionen

ans =    % får ut svaret 

     3
Citera
2016-02-29, 12:46
  #490
Medlem
matteyass avatar
Citat:
Ursprungligen postat av bigkjell85
Smart!

Dock får jag fortfarande endast ut hur längden på sekvensen.

Kod:
 w=[3 1 4 4 2 1 4 5 8 8 8 1 4 0]  % vektorn w

les(w)   % anropar funktionen

ans =    % får ut svaret 

     3
Om en funktion har flera outputs måste du spara undan allihopa för att få tag i dom. Kör exempelvis [len, index, tal] = les(w) för att få ut allt från funktionen.
Citera
2016-02-29, 14:25
  #491
Medlem
Citat:
Ursprungligen postat av matteyas
Om en funktion har flera outputs måste du spara undan allihopa för att få tag i dom. Kör exempelvis [len, index, tal] = les(w) för att få ut allt från funktionen.


Ja okej, det visste jag inte. Har testat och lagt till positionen för slutläget i sekvensen.

Jag kommer nu fram till längsta sekvensen, dess start-slut position och vilket nummer det gäller.

Jag vill ha samma information för alla siffror (0-9).

Min första tanke är att implementera for k = 0:9 någonstans?

Är det möjligt att ha for-loop inuti en annan for-loop?
Citera
2016-02-29, 16:05
  #492
Medlem
Citat:
Ursprungligen postat av bigkjell85
Ja okej, det visste jag inte. Har testat och lagt till positionen för slutläget i sekvensen.

Jag kommer nu fram till längsta sekvensen, dess start-slut position och vilket nummer det gäller.

Jag vill ha samma information för alla siffror (0-9).

Min första tanke är att implementera for k = 0:9 någonstans?

Är det möjligt att ha for-loop inuti en annan for-loop?
Ja, det kallas nästlade loopar (nested loops) och är ett vanligt sätt att arbeta över två eller fler index.
http://www.tutorialspoint.com/matlab/matlab_nested_loops.htm
Det går definitivt att lösa problemet du har på det sättet.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in