Array nummerieren und mit Formel berechnen??

  • Hey @ all,

    ich hoffe hier sind welche besonders gut in Mathe, weil ich bei folgendem Problem völlig auf dem Schlauch stehe:
    Ich habe ein Array, bei dem alle 3 Dimensionen gleich groß sind: $aArray[16][16][16]. Die Anzahl der Werte, die in diesen Array passen ist also 16^3. Wenn ich den Array nun folgendermaßen nummeriere:

    [autoit]

    d | [a] [b] [code=c]
    0 | [0] [0] [0]
    1 | [0] [0] [1]
    2 | [0] [0] [2]
    usw...

    [/autoit]


    dann könnte ich das ja genauso gut mit folgender Formel tun: a*(16^2) + b*16 + c = d
    Meine Frage ist nun, wie ich a, b, c errechnen kann, wenn ich d weiß ?(. Das einzige was mir dazu einfällt ist "lineares Gleichungssystem" aber da komm ich auch irgendwie nicht drauf :wacko:

    hoffe ihr könnt mir hier auf die Sprünge helfen :D
    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

    Einmal editiert, zuletzt von Developer30 (11. Juli 2011 um 17:19)

  • Sowas?:

    3 Stellen mit beliebiger Basis
    [autoit]

    Global Const $N = 16

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

    ; Gehe alle $d´s durch und ermittle die Koordinaten in einem entsprechenden Array der Form $a_Array[$N][$N][$N]
    For $d = 0 To $N ^ 3 - 1
    $a_Temp = GetCoordinates($d, $N)
    ConsoleWrite($d & @TAB & @TAB & $a_Temp[0] & @TAB & $a_Temp[1] & @TAB & $a_Temp[2] & @CRLF)
    Next

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

    ; Funktion welche aus d die Koordinaten berechnet
    Func GetCoordinates(Const $d, Const $N)
    Local $a_Ret[3] = [Int($d / ($N ^ 2)), _
    Int(Mod($d, $N ^ 2) / $N)]
    $a_Ret[2] = $d - ($a_Ret[0] * ($N * $N) + $N * $a_Ret[1])
    Return $a_Ret
    EndFunc ;==>GetCoordinates

    [/autoit]

    Prinzipiell schaut man nur wie wie oft (N ^ 2) in d passt und schon hat man $x.
    Übrig bleiben y und z. Also schaut man wie oft N in den Rest passt und man hat y. Der Rest ist dann z.

    Verallgemeinert kann man dieses Problem auch als Umrechnung verschiedener Zahlensysteme ansehen wobei $N (bei dir 16) die Basis des Zielsystems ist und 10 die Basis des Quellsystems (dein d).
    Daher kann man alternativ für deine Basis 16 auch die Umrechnung folgendermaßen realisieren:

    3 Stellen mit 16 als Basis
    [autoit]

    For $d = 0 To 16 ^ 3 - 1
    $a_T = GetCoordinates($d)
    ConsoleWrite($d & @TAB & @TAB & $a_T[0] & @TAB & $a_T[1] & @TAB & $a_T[2] & @CRLF)
    Next

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

    Func GetCoordinates(Const $d)
    Local $a_Ret = StringSplit(Hex($d, 3), "", 2)
    For $i = 0 To 2
    $a_Ret[$i] = Dec($a_Ret[$i])
    Next
    Return $a_Ret
    EndFunc ;==>GetCoordinates

    [/autoit]


    Btw: Wozu braucht man das?

    3 Mal editiert, zuletzt von AspirinJunkie (11. Juli 2011 um 17:26)

  • das ist die Lösung, danke! :thumbup:

    Btw: Wozu braucht man das?

    Also ich brauch das um mit einer errechneten Zahl auf den jeweiligen Arraywert zu "zeigen" (fast bisschen wie Pointer und Array in c++).

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."