JohanB
Artikelen: 0
Berichten: 60
Lid geworden op: di 04 mar 2008, 16:33

Merge in matlab.

ik loop al een hele tijd rond met volgende code in matlab:

Code: Selecteer alles

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?
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Merge in matlab.

hoe komt het dat bij verschillende input mijn resultaat verschillend is?
Waarom verwacht je dat je resultaat hetzelfde zou blijven bij verschillende input?
Gebruikersavatar
Vladimir Lenin
Artikelen: 0
Berichten: 829
Lid geworden op: do 25 sep 2008, 14:15

Re: Merge in matlab.

Volgens mij zie ik al je fout: bij de tweede index van de tweede toewijzing:

Code: Selecteer alles

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
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."

--Vladimir Lenin-- (Владимир Ильич Ульянов)
JohanB
Artikelen: 0
Berichten: 60
Lid geworden op: di 04 mar 2008, 16:33

Re: Merge in matlab.

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?
Gebruikersavatar
Vladimir Lenin
Artikelen: 0
Berichten: 829
Lid geworden op: do 25 sep 2008, 14:15

Re: Merge in matlab.

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

Code: Selecteer alles

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)
"Als je niet leeft zoals je denkt, zul je snel gaan denken zoals je leeft."

--Vladimir Lenin-- (Владимир Ильич Ульянов)
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Merge in matlab.

JohanB schreef: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.
JohanB
Artikelen: 0
Berichten: 60
Lid geworden op: di 04 mar 2008, 16:33

Re: Merge in matlab.

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.
Tommeke14
Artikelen: 0
Berichten: 771
Lid geworden op: zo 02 mar 2008, 16:17

Re: Merge in matlab.

ah ik heb die oefening enkele dagen geleden gemaakt

Dit is wat ik ervan heb gemaakt:

Code: Selecteer alles

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-)
dirkwb
Artikelen: 0
Berichten: 4.246
Lid geworden op: wo 21 mar 2007, 20:11

Re: Merge in matlab.

Code: Selecteer alles

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.
Tommeke14
Artikelen: 0
Berichten: 771
Lid geworden op: zo 02 mar 2008, 16:17

Re: Merge in matlab.

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.be/wisk/data/InlMatlab/opgavenMATLAB.pdf

opgave 14
dirkwb
Artikelen: 0
Berichten: 4.246
Lid geworden op: wo 21 mar 2007, 20:11

Re: Merge in matlab.

Tommeke14 schreef: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.
JohanB
Artikelen: 0
Berichten: 60
Lid geworden op: di 04 mar 2008, 16:33

Re: Merge in matlab.

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.
EvilBro
Artikelen: 0
Berichten: 7.081
Lid geworden op: vr 30 dec 2005, 09:45

Re: Merge in matlab.

Code: Selecteer alles

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

Terug naar “Informatica en programmeren”