Springen naar inhoud

Merge in matlab.


  • Log in om te kunnen reageren

#1

JohanB

    JohanB


  • >25 berichten
  • 60 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 10:04

ik loop al een hele tijd rond met volgende code in matlab:
function res=merge1(rij1,rij2)

n=length(rij1)
m=length(rij2)

rij=[];

  for teller=1 : 2 : min(n,m)
  
	  rij(teller)=rij1(teller)
	  rij(teller+1)=rij2(teller)
	 
  end
  
  rij
bedoeling is om twee rijen te mergen, ik weet dat dit stukje nog niet af is maar wat het wel al zou moeten doen doet het ook niet? als ik een rij neem 1 2 3 4 5 6 en 1 2 3 4 5 6 dan bekom ik 1 2 3 4 5 6
als ik een rij neem 7 7 7 7 en 8 8 8 8 8 dan bekom ik wel 7 8 7 8 7 enz hoe komt het dat bij verschillende input mijn resultaat verschillend is?

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 26 februari 2009 - 10:57

hoe komt het dat bij verschillende input mijn resultaat verschillend is?

Waarom verwacht je dat je resultaat hetzelfde zou blijven bij verschillende input?

#3

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 11:43

Volgens mij zie ik al je fout: bij de tweede index van de tweede toewijzing:
function res=merge1(rij1,rij2)

n=length(rij1)
m=length(rij2)

rij=[];

  for teller=1 : 2 : min(n,m)
  
	  rij(teller)=rij1(teller)
	  rij(teller+1)=rij2(teller+1)
	 
  end
  
  rij
in dat geval moet je wel telkens controleren dat de lengte van rij2 niet te klein is in verhouding tot teller+1. Daar je maar met stappen van 2 controleert.

Het verschil is:
stel je hebt een rij a, b, c, d en een rij e, f, g, h. In jouw geval zou je uitkomen: a, e, c, g. Terwijl als ik je vraag goed begrijp (en dus de code juist aangepast heb, je met mijn code a, f, c, h uitkomt.

Wat dus de output bij jou probleem met de rijen 1, 2, 3, 4, 5, 6 en nogmaals 1, 2, 3, 4, 5, 6 was is 1, 1, 3, 3, 5, 5

Veranderd door Vladimir Lenin, 26 februari 2009 - 11:49

"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#4

JohanB

    JohanB


  • >25 berichten
  • 60 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 12:31

ik heb als input
rij1 1 2 3 4 5 6 7 8 9
rij2 1 2 3 4 5 6 7 8 9

en bekom met bovenstaande code volgende output:
1 2 3 4 5 6 7 8 9

als ik nu
rij1 7 7 7 7 7 7 7 7 7
rij2 8 8 8 8 8 8 8 8 8
dan bekom ik

7 8 7 8 7 8 7 8
dus afwisselend.
hoe komt het dat ik in het eerste geval niet
1 1 2 2 3 3 4 4 ... bekom?

#5

Vladimir Lenin

    Vladimir Lenin


  • >250 berichten
  • 829 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 13:09

Oh bedoelde je dat, ik had je vraag niet goed begrepen, dan is het simpel:

function res=merge1(rij1,rij2)

n=length(rij1)
m=length(rij2)

rij=[];

  for teller=1 : 2 : 2*min(n,m)
  
	  rij(teller)=rij1((teller+1)/2)
	  rij(teller+1)=rij2((teller+1)/2)
	 
  end
  
  rij

ik begreep even niet wat je er van wilde maken, mijn excuses

Verder denk ik dat je het bereik van je for, dan ook moet verdubbelen. Anders zal het algoritme ophouden bij de helft van de opdracht. dus 2*2*min(n,m)

Veranderd door Vladimir Lenin, 26 februari 2009 - 13:10

"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."
--Vladimir Lenin-- (Владимир Ильич Ульянов)

#6

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 26 februari 2009 - 13:35

ik heb als input
rij1 1 2 3 4 5 6 7 8 9
rij2 1 2 3 4 5 6 7 8 9

en bekom met bovenstaande code volgende output:
1 2 3 4 5 6 7 8 9

Ik niet. Ik krijg [1 1 3 3 5 5 7 7 9 9]. Dat verwacht ik ook op basis van de code.

#7

JohanB

    JohanB


  • >25 berichten
  • 60 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 18:59

nu zie ik weer waar ik fout zit het zou 1 1 2 2 3 3 4 4 5 5 moeten zijn namelijk het eerste element van de eerste rij dan het eerste element van de tweede rij dan weer het tweede element van de eerste rij enz
met een stapgroote van twee kom je er niet maar als ik dit verander naar een stap groote naar ťťn dan krijg ik 1 2 3 4 5... ipv 1 1 2 2 3 3 4 4 5 5 waarom krijg ik dit niet.

#8

Tommeke14

    Tommeke14


  • >250 berichten
  • 771 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 19:09

ah ik heb die oefening enkele dagen geleden gemaakt

Dit is wat ik ervan heb gemaakt:
function res= merge(rij1,rij2)
B = [];
for i=1:length(rij1)+length(rij2)
	if i <length(rij1)
		B = [B,rij1(1,i)];
	end
	   if i <length(rij2)
		B = [B,rij2(1,i)];
	end 
end
 res = B;
end
Het zal wss wel veel simpeler kunnen dan dat, maar zo werkt het alleszins 8-)

Veranderd door Tommeke14, 26 februari 2009 - 19:10


#9

dirkwb

    dirkwb


  • >1k berichten
  • 4173 berichten
  • Moderator

Geplaatst op 26 februari 2009 - 19:14

function res=merge1(rij1,rij2)



n=length(rij1)

m=length(rij2)



rij=[];



  for teller=1 : 1 : min(n,m)

  

	  rij(2*teller-1)=rij1(teller)

	  rij(2*teller)=rij2(teller)

	

  end

  

  rij
Quitters never win and winners never quit.

#10

Tommeke14

    Tommeke14


  • >250 berichten
  • 771 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 19:18

Volgens mij heeft JohanB deel van opdracht vergeten te zeggen (ik ken de oefening namelijk omdat ik dezelfde heb 8-) )
Als bvb rij1 leeg is, wordt de resulterende rij gevuld met de overige elementen van rij2
(voorgaande oplossing kan dat niet doen)

Om verwarring te voorkomen:
http://wwwtw.vub.ac....gavenMATLAB.pdf
opgave 14

Veranderd door Tommeke14, 26 februari 2009 - 19:23


#11

dirkwb

    dirkwb


  • >1k berichten
  • 4173 berichten
  • Moderator

Geplaatst op 26 februari 2009 - 19:22

Volgens mij heeft JohanB deel van opdracht vergeten te zeggen (ik ken de oefening namelijk omdat ik dezelfde heb :D )
Als bvb rij1 leeg is, wordt de resulterende rij gevuld met de overige elementen van rij2
(voorgaande oplossing kan dat niet doen)

Ja dat dacht ik al 8-)

Maar het was de bedoeling dat ik het idee gaf en dat hij het verder afmaakte...
Quitters never win and winners never quit.

#12

JohanB

    JohanB


  • >25 berichten
  • 60 berichten
  • Ervaren gebruiker

Geplaatst op 26 februari 2009 - 20:46

Bedankt ik heb het ook gevonden. Ik weet dat, dat maar een deel kan maar het tweede deel is triviaal als je het eerst hebt.

#13

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 26 februari 2009 - 22:50

function ret = merge(rij1, rij2)

  k = min(length(rij1),length(rij2));



  a(1:2:(2*k-1)) = rij1(1:k);

  a(2:2:(2*k))   = rij2(1:k);

  ret = [a rij1(k+1:end) rij2(k+1:end)];

end





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures