2 arrays nach gleichen werten absuchen

  • hi,

    in folgendem quelltext werden statistische größen einer messreihe ausgegeben.
    sie werden von einer ini eingelesen, die zuvor von einem unterprogramm erstellt wurde.

    unter anderem soll auch der modalwert ausgegeben werden. (häufigster wert in einem array).
    ergo das array in ein anderes kopiert, 2 verschachtelte schleifen mit laufvariablen und per if anweisung überprüfen ob die werte identsch sind. wenn dies der fall ist, soll eine zählvariable hochgesetzt werden. hier liegt das problem. ich weiß nciht, wie ich diese ausdrücken soll. die messreihe hat n werte. die anzhal schwankt je nach versuch.
    z...zählvariable
    0 <= z <= n

    schleife für vergleich (zeile 90 bis 104)

    Spoiler anzeigen
    [autoit]


    Do
    Do
    If $w[$i] = $q[$j] Then
    $z[$i] = $z[$i] + 1
    ; MsgBox(0, "", $i & ", " & $j) ;Indexkontrolle
    Else
    $z[$i] = 0
    EndIf
    If $j = ($n - 1) Then
    $j = 0
    EndIf
    $j = $j + 1
    Until $j = ($n - 1)
    $i = $i + 1
    Until $i = $n

    [/autoit]

    gesamtes unterprogramm

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt ("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ;Global $q[999]

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=E:\autoit\diagramm\auswertung.kxf
    $Form2 = GUICreate("Auswertung", 234, 311, 302, 218)
    $Group1 = GUICtrlCreateGroup("Auswertung", 0, 0, 233, 265)
    $Label1 = GUICtrlCreateLabel("Median", 8, 25, 39, 17)
    $Label2 = GUICtrlCreateLabel("geometr. Mittelwert", 8, 50, 93, 17)
    $Label3 = GUICtrlCreateLabel("arithmet. Mittelwert", 8, 75, 92, 17)
    $Label4 = GUICtrlCreateLabel("Modalwert", 8, 100, 53, 17)
    $Label5 = GUICtrlCreateLabel("Spannweite", 8, 140, 60, 17)
    $Label6 = GUICtrlCreateLabel("Varianz", 8, 165, 39, 17)
    $Label7 = GUICtrlCreateLabel("Standartabweichung", 8, 190, 102, 17)
    $Input1 = GUICtrlCreateInput("0", 140, 25, 73, 21)
    $Input2 = GUICtrlCreateInput("0", 140, 50, 73, 21)
    $Input3 = GUICtrlCreateInput("0", 140, 75, 73, 21)
    $Input4 = GUICtrlCreateInput("0", 140, 100, 73, 21)
    $Input5 = GUICtrlCreateInput("0", 140, 140, 73, 21)
    $Input6 = GUICtrlCreateInput("0", 140, 165, 73, 21)
    $Input7 = GUICtrlCreateInput("0", 140, 190, 73, 21)
    $Label8 = GUICtrlCreateLabel("Klasseneinteilung", 8, 215, 86, 17)
    $Label9 = GUICtrlCreateLabel("Klassenweite", 8, 240, 66, 17)
    $Input8 = GUICtrlCreateInput("0", 140, 215, 73, 21)
    $Input9 = GUICtrlCreateInput("0", 140, 240, 73, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Ok", 0, 272, 65, 33, 0)
    GUICtrlSetOnEvent ($Button1, "run_")
    GUISetOnEvent($GUI_EVENT_CLOSE, "exit_")
    GUISetState()
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(125)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func exit_()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func run_()
    $n=IniRead("cache.ini", "Anzahl", "n", "0")
    Dim $w[$n], $q[$n], $z[$n]
    For $i = 0 to ($n - 1)
    $w[$i]=IniRead("cache_werte.ini", "Werte", "w" & $i, "0")
    Next
    _ArraySort($w)
    $h = $n / 2
    If $h = Int($h) Then ;median
    GUICtrlSetData($Input1, $w[$h])
    IniWrite("auswertung.ini", "Ergebnisse", "Median" , $w[$h])
    Else
    $h1 = $h + 0.5
    $h2 = $h - 0.5
    $m = ($w[$h1] + $w[$h2]) / 2
    GUICtrlSetData($Input1, $m)
    IniWrite("auswertung.ini", "Ergebnisse", "Median" , $m)
    EndIf
    $s = 0
    For $i = 0 to ($n - 1) ; quadrat mittelwert
    $q[$i] = $w[$i] * $w[$i]
    $s = $s + $q[$i]
    Next
    $m2 = Sqrt($s / $n)
    $m2 = Round($m2, 3)
    GUICtrlSetData($Input2, $m2)
    IniWrite("auswertung.ini", "Ergebnisse", "quadrat. Mittelwert" , $m2)

    [/autoit] [autoit][/autoit] [autoit]

    $s = 0
    For $i = 0 to ($n - 1) ; mittelwert
    $s = $s + $w[$i]
    Next
    $m1 = $s/$n
    $m1 = Round($m1, 3)
    GUICtrlSetData($Input3, $m1)
    IniWrite("auswertung.ini", "Ergebnisse", "Mittelwert" , $m1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 to ($n - 1); modalwert
    $q[$i] = $w[$i]
    Next
    $i = 0
    $j = 0
    Do
    Do
    If $w[$i] = $q[$j] Then
    $z[$i] = $z[$i] + 1
    ; MsgBox(0, "", $i & ", " & $j) ;Indexkontrolle
    Else
    $z[$i] = 0
    EndIf
    If $j = ($n - 1) Then
    $j = 0
    EndIf
    $j = $j + 1
    Until $j = ($n - 1)
    $i = $i + 1
    Until $i = $n
    _ArrayDisplay($z)

    [/autoit] [autoit][/autoit] [autoit]

    $spann = $w[0] - $w[$n-1] ; spannweite
    $spann = sqrt($spann * $spann)
    $spann = Round($spann, 3)
    GUICtrlSetData($Input5, $spann)
    IniWrite("auswertung.ini", "Ergebnisse", "Spannweite" , $spann)
    $s1 = 0
    For $i = 0 To ($n - 1) ; varianz
    $h1 = $w[$i] - $m1
    $s1 = $s1 + $h1 * $h1
    Next
    $var = $s1 / ($n - 1)
    $var = Round($var, 3)
    GUICtrlSetData($Input6, $var)
    IniWrite("auswertung.ini", "Ergebnisse", "Varianz" , $var)

    [/autoit] [autoit][/autoit] [autoit]

    $sabw = Sqrt($var) ; standartabweichung
    $sabw = Round($sabw, 3)
    GUICtrlSetData($Input7, $sabw)
    IniWrite("auswertung.ini", "Ergebnisse", "Standartabweichung" , $sabw)

    [/autoit] [autoit][/autoit] [autoit]

    $klas = Sqrt($n) ; klasseneinteilung
    If $klas < 6 Then
    $klas = 6
    GUICtrlSetData($Input8, $klas)
    IniWrite("auswertung.ini", "Ergebnisse", "Klasseneinteilung" , $klas)
    ElseIf $klas > 12 Then
    $klas = 12
    GUICtrlSetData($Input8, $klas)
    IniWrite("auswertung.ini", "Ergebnisse", "Klasseneinteilung" , $klas)
    Else
    $klas = Round($klas)
    GUICtrlSetData($Input8, $klas)
    IniWrite("auswertung.ini", "Ergebnisse", "Klasseneinteilung" , $klas)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $weite = $spann / $klas ; klassenweite
    $weite = Round($weite, 3)
    GUICtrlSetData($Input9, $weite)
    IniWrite("auswertung.ini", "Ergebnisse", "Klassenweite" , $weite)

    [/autoit] [autoit][/autoit] [autoit]

    $i = 0
    Do
    IniWrite("cache_werte_sortiert.ini", "Werte", "w" & $i, $w[$i])
    $i = $i + 1
    Until $i = $n - 1
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von bocky3 (24. Juni 2009 um 11:28)

    • Offizieller Beitrag

    Ich würde das mit einem Scripting.Dictionary-Objekt lösen:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; Zufallswerte zum testen erstellen
    $n = Random(50, 99, 1)
    Dim $w[$n]
    For $i = 0 To $n - 1
    $w[$i] = Random(0, 9, 1)
    Next
    ; Zufallswerte zum testen erstellen
    _ArrayDisplay($w) ; Zufallswerte anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    $aModal = _ArrayModal($w)
    _ArrayDisplay($aModal)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ArrayModal($w)
    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.CompareMode = 1
    For $i = 0 To UBound($w) - 1
    If $oDictionary.Exists($w[$i]) Then
    $oDictionary.Item($w[$i]) = $oDictionary.Item($w[$i]) + 1
    Else
    $oDictionary.Add($w[$i], 1)
    EndIf
    Next
    Local $aOut[$oDictionary.Count][2], $i = 0
    $colKeys = $oDictionary.Keys
    $str = ''
    For $strKey In $colKeys
    $aOut[$i][0] = $strKey
    $aOut[$i][1] = $oDictionary.Item($strKey)
    $i += 1
    Next
    $oDictionary = ''
    _ArraySort($aOut, 1, 0, 0, 1)
    Return $aOut
    EndFunc ;==>_ArrayModal

    [/autoit]
  • ich hab versehentlich den index vertauscht ...

    Spoiler anzeigen
    [autoit]


    Do
    Do
    If $w[$i] = $q[$j] Then
    $z[$j] = $z[$j] + 1
    ; MsgBox(0, "", $i & ", " & $j) ;Indexkontrolle
    Else
    $z[$i] = 0
    EndIf
    If $j = ($n - 1) Then
    $j = 0
    EndIf
    $j = $j + 1
    Until $j = ($n - 1)
    $i = $i + 1
    Until $i = $n
    _ArrayDisplay($z)

    [/autoit]


    so funktioniert es.

    inwieweit bietet mir das dictonary vorteile gegenüber der 2 wiederholschleifen?

  • danke für die hinweise/hilfe.
    dictonary in diesem zusammenhang werde ich mir bei gelegenheit ansehen.

    mfg bocky