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:
struct Observation {
double Var1; //de to variable
double Var2;
double Rang1; // og deres rang
double Rang2;
};
Derved får jeg en vector:
std::vector<Observation> Vec
som jeg sorterer med et predikat, som jeg har skrevet til at fortælle sort hvilken variabel den skal sortere for:
sort (Vec.begin(), Vec.end(), ForVar2);
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):
double SpearmanRank (const vector<double>& Vec1, const vector<double>& Vec2)
{
typedef vector<double>::size_type siz_d;
siz_d ObsInd = Vec1.size(); // her laver jeg en vektor der kan holde værdierrne og rangtal sammen
vector<Observation> Vec(ObsInd); // af samme størrelse som de to inputvektorer
if (Vec1.size() != Vec2.size())
{
throw domain_error("Korrelation af to ikke lige lange talrækker");
}
for (siz_d i = 0; i != ObsInd; ++i) // her kopieres de to vectors ind i en datastruktur der kan holde
{ // værdier og rangtal sammen
Vec[i].Var1 = Vec1[i];
Vec[i].Var2 = Vec2[i];
}
typedef vector<Observation>::size_type siz_t;
const siz_t AntalObs = Vec.size(); // en variabel der kan holde styr på antallet af observationer
// alt dette burde gøres til en funktion, men hvordan?
sort (Vec.begin(), Vec.end(), ForVar1); // her rankes Var1 og rangen indskrives i Rang1
siz_t i = 0;
while(i != AntalObs)
{
if(i == AntalObs-1 || Vec[i].Var1 != Vec[i+1].Var1)
{
Vec[i].Rang1 = i+1;
++i;
}
else
{
siz_t j = i;
siz_t sum = j;
do
{
++j;
sum += j;
}
while(j != AntalObs-1 && Vec[j].Var1==Vec[j+1].Var1);
if(j == AntalObs-1)
{
++j;
sum += j;
}
for(siz_t x=i; x!=j; ++x)
Vec[x].Rang1 = sum/(j-i+1);
i=j;
}
}
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