obliczanie rang dla współczynnika korelacji Spearmana

Odpowiedz Nowy wątek
2011-10-12 22:22
0

Witam.
Potrzebny mi kod w języku C++, który przeprowadzi taką oto operację :

Powiedzmy, że mam tablicę uporządkowanych rosnąco elementów :

indeks : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 11 12... (indeksowanie od 1 a nie od 0 jest celowe i świadome)
liczba : 1, 2, 2, 2, 3, 4, 4, 5, 6, 7, 7, 7...

Program ma za zadanie nadać tym liczbom rangi.
Sposób nadawania rang jest następujący :

Jeżeli liczba w tablicy jest unikalna, np. "1", to jej ranga jest jej indeksem w tablicy, czyli 1

Jeżeli liczby w tablicy się powtarzają, tak jak np. "2", to rangą dla "dwójek" jest średnia arytmetyczna z ich indeksów, czyli w tym wypadku średnia z 3 elementów (bo są 3 "dwójki) z indeksów : (2+3+4)/3 = 3 <- dla każdej "dwójki" ranga będzie wynosiła 3.

Jak napisać program który wykonywałby właśnie taki algorytm ?
Z góry dziękuję za pomoc i pozdrawiam.

Pozostało 580 znaków

2011-10-13 10:33
0

s- suma liczb do średniej
x- ilość liczb w średniej
pętla po tablicy indeksów z licznikiem "i"
sprawdzasz czy aktualnie czytana różni się od ostatniej liczby
jeżeli tak: obliczasz rangę dla poprzedniej liczby, x = 1, s = i;
jeżeli nie: s = s + i, x++

edytowany 2x, ostatnio: piszczu, 2011-10-13 10:40

Pozostało 580 znaków

2011-10-13 14:39
0

Chyba udało mi się tak na szybko to ogarnąć:

float suma=0;
int ile =0;
for (i=0; i<licznik; i++)
{
  if(tablica[i]!=tablica[i+1])   //jeżeli następny element jest rozny od poprzedniego
  {
     if(ile==0) //jeżeli tylko jeden element
     {
        ranga[i]=i+1; // "+1" bo rangowanie zaczyna się od jedynki a nie od zera
     }else
     {
        suma=suma+i+1; //zwieksz sume o ostatnia sprawdzana
        ile++;       //zwieksz liczbe elementow
        for (int z=(i-(ile-1)); z<=i; z++)      //cofnij sie do pierwszej powtarzajacej sie liczby
        {
           ranga[z]=suma/(ile);  //ranga = srednia z sumy indeksow
        }
      }
   ile=0;
   suma=0;

  }else
  {
    suma=suma+i+1; //jezeli liczby takie same, licz ich sume
    ile++;
  }

} 

Mały test :

1 2 2 2 3 4 4 5 6 7 //liczby

1 3 3 3 5 6.5 6.5 8 9 10 //ich rangi (indeksowanie od 1)

Przeprowadziłem kilka prób i wyniki są dobre, ale może ktoś rzuci okiem czy kod ma sens.

edytowany 1x, ostatnio: Prometeo, 2011-10-13 14:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0