Avatar billede LennartH Nybegynder
18. juni 2010 - 11:42 Der er 5 kommentarer og
1 løsning

Find 2 sæt der ligner hinanden

Jeg har et array der indlæser fx. 50 linier (rækker) med præcis 8 kolonner (0...7). Hver kolonne indeholder værdier fra 0-255. Jeg skal så, beregningsmæssigt, finde 2 kolonner der ligner hinanden i opførsel (afvigelse).

Jeg har forsøgt med denne formel:

Afvigelse = ((O - F) / F) * 100
... herefter ...
Sum (Afvigelse) / (antal rækker)

Hvor O = Observeret data (Aktuelle værdi i cellen)
F = Forventet data (Sum af kolonnen / antal rækker)

Jeg er ikke sikker på at det er en korrekt måde at beregne det på. Håber problembeskrivelsen er klar nok.

Mvh, LH
Avatar billede arne_v Ekspert
18. juni 2010 - 15:12 #1
Ofte ville man finde den raekke hvor sum(1..8, (X-basisX)^2) er mindst.
Avatar billede arne_v Ekspert
20. juni 2010 - 20:46 #2
Noget eksempel kode:

using System;

namespace E
{
    public struct Row
    {
        public byte[] Data;
    }
    public struct RowPair
    {
        public int Ix1;
        public int Ix2;
    }
    public class Program
    {
        private static Random rng = new Random();
        public static Row GenRow()
        {
            Row res;
            res.Data = new byte[8];
            for(int i = 0; i < 8; i++)
            {
                res.Data[i] = (byte)rng.Next(0, 255);
            }
            return res;
        }
        public static Row[] GenMultiRows(int n)
        {
            Row[] res = new Row[n];
            for(int i = 0; i < n; i++) res[i] = GenRow();
            return res;
        }
        public static int Diff(Row r1, Row r2)
        {
            int res = 0;
            for(int i = 0; i < 8; i++)
            {
                res += (r1.Data[i] - r2.Data[i]) * (r1.Data[i] - r2.Data[i]);
            }
            return res;
        }
        public static RowPair FindMostLikely(Row[] v)
        {
            int maxdif = int.MaxValue;
            RowPair maxix;
            maxix.Ix1 = -1;
            maxix.Ix2 = -1;
            for(int i = 0; i < v.Length - 1; i++)
            {
                for(int j = i + 1; j < v.Length; j++)
                {
                    int tmp = Diff(v[i],v[j]);
                    if(tmp < maxdif)
                    {
                        maxix.Ix1 = i;
                        maxix.Ix2 = j;
                        maxdif = tmp;
                    }
                }
            }
            return maxix;
        }
        public static void Main(string[] args)
        {
            Row[] v = GenMultiRows(50);
            RowPair mx = FindMostLikely(v);
            Console.WriteLine(mx.Ix1 + " " + mx.Ix2);
            Console.ReadKey();
        }
    }
}
Avatar billede LennartH Nybegynder
22. juni 2010 - 11:18 #3
Tak for dine forslag. Hvis jeg bruger din løsning så får jeg rigtig nok en sammenligning med sum, men det giver ikke det korrekte 'billede'.

Hvis jeg bruger 15 rækker data i de 8 kolonner:

int[] iBit0 = new int[] { 209, 113, 161, 81, 241, 241, 81, 49, 209, 1, 81, 49, 33, 97, 129 };
        int[] iBit1 = new int[] { 30, 29, 36, 28, 29, 29, 30, 31, 29, 34, 35, 34, 34, 31, 30, 31 };
        int[] iBit2 = new int[] { 88, 97, 198, 119, 77, 87, 80, 71, 76, 84, 73, 86, 76, 70, 83, 76 };
        int[] iBit3 = new int[] { 130, 108, 130, 0, 160, 125, 215, 218, 145, 110, 0, 27, 178, 252, 169 };
        int[] iBit4 = new int[] { 30, 30, 33, 30, 29, 30, 29, 30, 29, 34, 34, 34, 34, 31, 31, 31 };
        int[] iBit5 = new int[] { 234, 74, 154, 106, 202, 202, 106, 10, 234, 58, 106, 10, 26, 90, 186 };
        int[] iBit6 = new int[] { 247, 249, 247, 246, 247, 241, 248, 249, 4, 15, 17, 29, 26, 19, 13 };
        int[] iBit7 = new int[] { 13, 19, 26, 29, 17, 15, 4, 249, 248, 241, 247, 246, 247, 249, 247 };

så vil din beregning kvalificere Bit6 og Bit7 og de ligner slet ikke hinanden. Jeg har vist 3 dump med ovennævnte data her: http://www.dancar.dk/WebCalcX/
Jeg har brugt chart for at visualisere at det er Bit0 & Bit5, samt Bit1 & Bit4 der er de sæt der ligner hinanden mest.

jeg beklager meget at jeg ikke har forklaret det rigtigt.
Avatar billede LennartH Nybegynder
10. august 2010 - 09:11 #4
Ja, undskyld den sene tilbagemelding.
Det er faktisk en korrekt udregning du udfører med dit kodeeksempel. Af en eller anden grund kan beregningen ikke li' at værdien er nul.

Men jeg vil gerne acceptere dit forslag.
Lægger du lige et svar?
Avatar billede LennartH Nybegynder
10. august 2010 - 09:13 #5
Hov ... det var ikke mig der skulle lægge et svar
Avatar billede arne_v Ekspert
10. august 2010 - 15:32 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester