[C] Algoritmo di Clustering

di il
9 risposte

[C] Algoritmo di Clustering

Salve, devo fare un progetto per un esame all' università, ma sono rimasto un po con le spalle al muro.
In pratica devo Scrivere una funzione in C alla quale passo una matrice 15 x 10 composta da numeri che possono essere: 0,1,2 o 3.
Devo trovare il gruppo più grande possibile di 1, 2 o 3 che devono essere connessi solo tramite le direzioni cardinali.
Ad esempio passo alla funzione:
012333323
011233000
011230000

Lui dovrebbe trovarmi quel gruppo di tre che sono connessi e passarmeli a zero.

Ho scritto questa funzione per trovare il gruppo più grande e segnarmi gli indici dell elemento più in basso a destra del gruppo più grande, solo che mi trova roba assurda e non funziona:
int ricerca(int matrice[15][10] )
{
    int c,d,i,u,j,x,c1,c2,k,indo=0,indv=0;
    int *p;
    c1=1;
    p=&matrice[0][0];
    for(i=0; i<15; i++)
    {
        for (j=0; j<10; j++)
        {
            if(matrice[i][j]!=0)
            {
                x=matrice[i][j];
                if(x==matrice[i][j+1] || x==matrice[i+1][j] )
                {
                    c1=c1+1;
                    if(x!=matrice[i][j+1])
                    {
                        c1=c1;
                    }
                    if(x!=matrice[i+1][j])
                    {
                        c1=c1;
                    }
                    if(c1>k)
                    {
                        k=c1;
                        indo=i;
                        indv=j;
                        p=&matrice[i][j];
                    }
                    if(x!=matrice[i][j+1] && x!=matrice[i+1][j])
                    {
                        c1=0;
                    }
                }
            }
        }
    }
    printf("%d \n %d \n %d \n",k,indo,indv);


}

9 Risposte

  • Re: [C] Algoritmo di Clustering

    Ciao med90,

    premetto che non ho mai affrontato l'analisi dei gruppi. Leggo ora su wiki 4 algoritmi di clustering più usati (K-Meansm, K-Medoids, Fuzzy C-Means, QT Clustering).

    Quale hai usato? Hai provato ad usare il debug?
  • Re: [C] Algoritmo di Clustering

    Ciao
    In realtà nessuno di quei 4, è un algoritmo che sto cercando di crearmi io per la ricerca del gruppo più grande di numeri adiacenti, da distruggere subito dopo(ossia convertire quei numeri in 0 che in questo programma rappresentano i "buchi"),


    Ho chiamato il thread algoritmo di clustering perchè secondo me rendeva bene l idea.

    Tuttavia lo si può vedere come un algoritmo che data una matrice 15 x 10 deve trovare il gruppo più grande di numeri adiacenti
  • Re: [C] Algoritmo di Clustering

    C'è qualche problema...
    
    ...
    	for (i = 0; i < 15; i++) {
    		for (j = 0; j < 10; j++) {
    ...
    				if (x == matrice[i][j + 1] // <----- FIXME
    
    tutti quei punti con j +1 o i + 1 vanno in overflow

    edit:
    Ma non sarebbe sufficiente usare due iterazioni y-x,una funzioncina che restituisce la lunghezza valida e poi cercare il MAX dei vari valori?
    
    void validlen (int *matrix, int y,int x, int *leny, int *leny);
    
  • Re: [C] Algoritmo di Clustering

    Ma se faccio come dici tu non trovo il numero più grande nella matrice?
  • Re: [C] Algoritmo di Clustering

    Scusami, cena anticipata. Correggo il tiro...

    Così penso sia più semplice:
    
    void validlen (int *matrix, int maxy,int maxx, int y, int x, int *leny, int *lenx);
    
    L'idea sarebbe di partire dalla coordinata y-x leggere il carattere e scorrere fino a rottura (significa finché non cambia) su/giu e salvo *leny. Stessa cosa sinistra/destra.

    A livello superiore nelle due iterazioni y-x insieme al MAX(leny+lenx) tengo traccia del riferimento y-x.

    Penso sia molto semplice... no?
  • Re: [C] Algoritmo di Clustering

    Allora vediamo se ho ben capito:

    Metto come prima due for una per la coordinata x e una per la coordinata y, all interno pongo questa funzione a cui passo la matrice, il valore corrente di x e il valore corrente di y , passo a una variabile l x-esimo y-esimo valore di x e lo faccio scorrere su e giù andando a salve la lunghezza della riga lungo y e la stessa cosa faccio lungo x.
    Tuttavia se quello sotto il valore x-esimo, y-esimo ha accanto lo stesso valore non me lo perdo?

    Esempio:


    000213000
    022210000
    002220000
    000020000

    Quel 2 in grassetto non me lo perderei?

    Ps: sempre se ho capito bene ciò che intendevi dire
  • Re: [C] Algoritmo di Clustering

    sempre se ho capito bene ciò che intendevi dire
    Infatti non avevo capito!

    edit:
    Ma.... allora perché non guardare gli algoritmi che esistono? Ora mi sfugge, ma ho già visto questa roba... mi sembra che Knuth abbia documentazione a riguardo
  • Re: [C] Algoritmo di Clustering

    Eh gli ho dato un occhiata ma sono abbastanza difficili da implementare
  • Re: [C] Algoritmo di Clustering

    Ecco,mi ricordavo bene....
    Ti ho trovato il testo leggi:
Devi accedere o registrarti per scrivere nel forum
9 risposte