Distanza di Hamming



  • Distanza di Hamming
    di Migua Ing data: 23/01/2016 13:44:33

    Ciao a tutti, qualcuno di voi mi potrebbe dare una mano??
    Avendo una matrice formata da n righe, dove ogni riga contiene sempre gli stessi venti numeri, ma distribuiti casualmente. (vedi Allegato)
    Il mio obiettivo è di poter selezionare una riga qualunque (delle n righe presenti) e poter calcolare ( attraverso l'utilizzo di codice VBA ) la distanza di Hamming di una riga selezionata rispetto alle restanti n-1 righe.
    Secondo voi è possibile fare ciò?? Perchè non ne vengo più fuori.
    Mirko



  • di patel data: 23/01/2016 15:29:18

    perché dovremmo sapere cos'è la distanza di hamming ? non avresti fatto meglio a spiegare cos'è ?
    è forse questo un forum di ingegneria o matematica ?





  • di Migua Ing data: 23/01/2016 15:50:33

    Hai ragione, mi scuso per lerrore.
    La distanza di Hamming tra due stringhe di ugual lunghezza è il numero di posizioni nelle quali i simboli corrispondenti sono diversi. In altri termini, la distanza di Hamming misura il numero di sostituzioni necessarie per convertire una stringa nell'altra.

    Ad esempio La distanza di Hamming tra 2143896 e 2233796 è 3.



  • di alfrimpa data: 23/01/2016 16:15:34

    Ciao Mirko

    Scusa ma io continuo a non capire.

    Puoi spiegare, in maniera semplice, perchè tra i due numeri che hai indicato la distanza di Hamming è 3?

    Lo chiedo anche per facilitare l'individuazione di un'ipotesi di soluzione.

    Alfredo?





  • di Gianfranco data: 23/01/2016 16:40:27

    Ciao
    se ho capito bene si riduce a quante lettere diseguali ci sono tra due cifre.

    es
    123456
    133466
    ...........
    -1---1-
    =2
    123456
    133546
    ---------
    -1-11-

    =3

    se ho capito





  • di Migua Ing data: 23/01/2016 17:19:53

    Praticamente, il concetto è quello che ha descritto Gianfranco però avendo stringhe formate sempre dagli stessi numeri (senza ripetizioni), cambia solo l''ordine di disposizione.

    ................ P1 P2 P3 P4 P5 P6
    - stringa 1 : 1, 2, 7 , 4, 9, 12
    - stringa 2 : 1, 2, 4 , 7, 9, 12


    La distanza di Hamming in questo caso è 2; cioè la differenza di posizione che c'è tra la postazione P3 e P4.
    Quindi dovrei trovare un misuratore di tale 'scostamento', selezionando una stringa, rispetto a tutte le altre n-1 stringhe.
    Grazie mille per il vostro interessamento..



  • di alfrimpa data: 23/01/2016 20:56:24

    Ciao Mirko

    Qui sotto propongo una prima idea con una function che va comunque perfezionata sulla base dell'ultimo esempio che hai fatto.

    Alfredo

    P.S. Hai allegato un'immagine con la quale non si può far nulla; devi allegare un file di Excel con i dati inseriti. 
     
    Function Hamming(rng1 As Range, rng2 As Range)
    Dim i As Integer
    For i = 1 To rng1.Cells.Count
        If rng1.Cells(1, i) <> rng1.Cells(2, i) Then
        Hamming = Hamming + 1
        End If
    Next i
    End Function






  • di Migua Ing data: 23/01/2016 21:48:36

    Ciao Alfredo, ho seguito il tuo consiglio ed ho allegato un file Excel che può meglio spiegare il problema.
    Nel mentre provo ad adattare le righe di codice che hai condiviso.
    Grazie mille per il tuo supporto.



  • di patel data: 24/01/2016 09:03:27

    secondo me la funzione corretta è questa
     
    Function Hamming(rng1 As Range, rng2 As Range)
    Dim i As Integer
    For i = 1 To rng1.Cells.Count
        If rng1.Cells(1, i) <> rng2.Cells(1, i) Then
        Hamming = Hamming + 1
        End If
    Next i
    End Function






  • di Migua Ing data: 24/01/2016 18:02:50

    Ciao, ho provato ad implementare il codice consigliato da voi, solo che non capisco la funzione Hamming come viene utilizzata.
    Comunque sia, sono arrivato ad una soluzione, ed ho condiviso il codice VBA di tale soluzione per chiunque possa essere interessato.
    in questo codice si ha la possibilità di scegliere il numero di stringa 'k' che si vuole tenere come riferimento, rispetto alla quale calcolare la distanza di Hamming ( con la restanti stringhe).
     
    Dim k As Integer
    Dim LoopCol As Integer
    Dim LoopRig As Integer
    k = Cells(3, 2)
    For LoopCol = 1 To 10
        For LoopRig = 1 To 10
            If LoopRig <> k Then
                If Cells(LoopRig + 6, LoopCol + 3) = Cells(k + 6, LoopCol + 3) Then
                Cells(LoopRig + 6, LoopCol + 14) = 0
                ElseIf Cells(LoopRig + 6, LoopCol + 3) <> Cells(k + 6, LoopCol + 3) Then
                Cells(LoopRig + 6, LoopCol + 14) = 1
                End If
            ElseIf LoopRig = k Then
            End If
        Next LoopRig
    Next LoopCol
    End Sub