en funktion der kan ranke to talrækker

Tags:    c++

Hej udviklere,

Jeg prøver at finde ud af hvordan jeg kan passere et argument til en funktion, der fortæller hvilken variabel i en struct som funktionen skal arbejde på. Måske er løsningen for mig at gå til problemet på en helt anden måde, så jeg beskriver lige hele ideen.
jeg har siddet i et stykke tid og bokset med at lave en funktion der skal kunne udføre en spearman rank correlation. Problemet er at jeg har en række punkter med en x og en y værdi, altså (x,y). For at kunne lave testen skal alle mine x'er rankes fra laveste til højeste, og det skal alle mine y'er også. For at få det til at hænge sammen har jeg lavet en struct:
Fold kodeboks ind/udKode 


Derved får jeg en vector:
Fold kodeboks ind/udKode 

som jeg sorterer med et predikat, som jeg har skrevet til at fortælle sort hvilken variabel den skal sortere for:
Fold kodeboks ind/udKode 

og så kan jeg faktisk bare rangere den ved at gå gennem vectoren med en for-løkke og give Vec.Rang2 værdien af indexet.

Problemet er at nogle værdier er ens (eks: 1,2,3,3,4), og at håndtere dette kræver en del mere kode, så der bliver en større sag. (Hele koden er indsat her, hvis der er noget jeg ikke har fået forklaret ordentligt):
Fold kodeboks ind/udKode 


Jeg vil derfor gerne putte det væk i en funktion. Ideelt skulle jeg kunne kalde denne funktion først med en besked om at sortere Vec.Var1 og læse værdien ind i Vec.Rang1, og dernæst med Vec.Var2 og Vec.Rang2.
Men er der nogen måde jeg kan gøre dette, eller burde jeg gentænke hele den måde jeg har løst problemet?




Indlæg senest redigeret d. 07.09.2006 22:39 af Bruger #8249
9 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hej udviklere,

Jeg prøver at finde ud af hvordan jeg kan passere et argument til en funktion, der fortæller hvilken variabel i en struct som funktionen skal arbejde på. Måske er løsningen for mig at gå til problemet på en helt anden måde, så jeg beskriver lige hele ideen.
jeg har siddet i et stykke tid og bokset med at lave en funktion der skal kunne udføre en spearman rank correlation. Problemet er at jeg har en række punkter med en x og en y værdi, altså (x,y). For at kunne lave testen skal alle mine x'er rankes fra laveste til højeste, og det skal alle mine y'er også. For at få det til at hænge sammen har jeg lavet en struct:
Fold kodeboks ind/udKode 


Derved får jeg en vector:
Fold kodeboks ind/udKode 

som jeg sorterer med et predikat, som jeg har skrevet til at fortælle sort hvilken variabel den skal sortere for:
Fold kodeboks ind/udKode 

og så kan jeg faktisk bare rangere den ved at gå gennem vectoren med en for-løkke og give Vec.Rang2 værdien af indexet.

Problemet er at nogle værdier er ens (eks: 1,2,3,3,4), og at håndtere dette kræver en del mere kode, så der bliver en større sag. (Hele koden er indsat her, hvis der er noget jeg ikke har forklaret):
Fold kodeboks ind/udKode 


Jeg vil derfor gerne putte det væk i en funktion. Ideelt skulle jeg kunne kalde denne funktion først med en besked om at sortere Vec.Var1 og læse værdien ind i Vec.Rang1, og dernæst med Vec.Var2 og Vec.Rang2.
Men er der nogen måde jeg kan gøre dette, eller burde jeg gentænke hele den måde jeg har løst problemet?


Har du overvejet en OO løsning? En OO løsning kan give dig et større overblik, men da jeg ikke lige er inde i den rank korlition vil jeg ikke uddybe mig nærmere. Jeg kan dog sige at med en OO løsning (eller bare design) får du en et andet syn på sage. Designet vil, hvis det er sådan nogenlunde, give dig en bedre ide om hvordan det færdige resultat kommer til at se ud. Men jeg ved jo ikke hvor meget du er inde i at designe små strukturer med UML eller om du føler dig godt til rette med OOP.



Jeg har overvejet OO, men kan ikke helt gennemskue hvordan det vil løse problemet. Sagen er den at uanset hvordan jeg tænker på det, virker det som om at jeg er nødt til at holde de 4 variable sammen der hører til ét datapunkt. Men jeg ville være rigtig interesseret i at se et klassedesign der løser problemet, udover det rent principielle spørgsmål om man kan specificere et bestemt element af en datastruktur når man kalder en funktion.
Selve Rank Korrelationen består bare af lidt regneri, når først man har rangtallene er det lige ud af landevejen. Den kode jeg har skrevet til det ser sådan ud:
Fold kodeboks ind/udKode 

Jeg er lige nu i gang med at stifte bekendtskab med UML men det er helt klart ikke min stærke side - så det er særdeles muligt at løsningen ligger i en OO approach, jeg kan bare ikke gennemskue det.



Nu er mit C godt nok lidt rustent, men kunne du ikke have en struct i observation for hver variabel?

struct corVar {
double value;
double rank;
};

struct observation {
corVar x;
corVar y;
};

Du kan så kalde din funktion med en pointer til den corVar du vil arbejde med!





Tak, det ser rigtigt ud, og der er i hvert fald ingen tvivl om at det er en mere elegant datastruktur du foreslår. Jeg kan dog stadig ikke helt gennemskue hvordan jeg skal få det til at virke. Hvad skal jeg bede pointeren pege på? Det er formodentlig blot en helt enkelt ting jeg bare ikke lige kan få hovedet om. Jeg går ud fra du tænker sådan nogenlunde:
Fold kodeboks ind/udKode 

så jeg kan lave noget i retning af:
Fold kodeboks ind/udKode 

men hvordan helt præcist flytte p? Igen tror jeg det kunne være rimeligt enkelt, men bær over med mig :) og tak for indsatsen



Indlæg senest redigeret d. 07.09.2006 22:35 af Bruger #8249
Problemet er at hver observation ikke har et navn, men blot indgår som et element i en vektor. Og det jeg er ude efter er at få min pointer til at pege på den rigtige CorVar i hvert element i vektoren, efterhånden som den bliver gået igennem i for-loopet.



Altså nu mener jeg ikke selve programmeringen, men det design man laver når man vil opbygge det hele i OOP hjælper med overskueligheden og derved kan man nogen gange se gennem problemet og se løsningen da man har lavet smarte UML diagrammer og stikord/brainstorming. Det har hjulpet mig mange gange.



OK - jeg prøver at kigge på det. Løsningen med pointere synes jeg ikke helt jeg kan få til at virke - men jeg er ved at lære lidt mere OOP, så det kan være det hjælper mig. Ellers er jeg stadig modtagelig for andre forslag ;)



Hej nu har jeg selv løst den - jeg skulle bare ranke hver vektor for sig. jeg endte med en struct der lignede meget den jeg fik foreslået:
Fold kodeboks ind/udKode 

så kunne jeg bruge obsID til at holde styr på dem.
Den overordnede problematik med at bede en vector eller et struct om et dybt element er jeg stadig lost overfor :) men mon ikke løsningen ligger i OOP?
Tak for jeres mange gode forslag!



Jeg endte med en funktion der alt i alt så sådan her ud (hvis nogen synes det er sjovt):
Fold kodeboks ind/udKode 




t