Array im Array?

  • Allgemein

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Array im Array?

    Hallo zusammen,



    und zwar habe ich eine Frage zu einer Funktion die ich schreiben soll:



    Erstmal geht es darum, dass ich ein in Excel manuell angelegtes Beispiel als Funktion scheiben soll, damit man das für jedes beliebige Beispiel ausführen kann.



    Die Angaben und für was die Werte stehen und worum es genau geht ist denke ich irrelevant.



    Hiermit bekomme ich Werte, mit denen die Größe eines Fehler berechnet werden soll. Und zwar brauche ich wie man sieht die Werte bei jedem Grad bis 360 Grad.

    aValsADC1(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + dSin) * PI / 18) ' Die Werte für ADC1 und ADC" nach Steckung/Stauchung



    Wie ihr schon seht steht in der Sinusfunktion ein dSin. Dies wird in Excel durch Klick auf einen Button erhöht oder eben erniedrigt.



    Erstmal die Berechnung des Fehlers:

    Err1 = ((fMeanADC1(0) - aValsADC1(0)) ^ 2) + ((fMeanADC1(1) - aValsADC1(18)) ^ 2) + ((fMeanADC1(2) - aValsADC1(36)) ^ 2) + ((fMeanADC1(3) - aValsADC1(54)) ^ 2) + ((fMeanADC1(4) - aValsADC1(72)) ^ 2) + ((fMeanADC1(5) - aValsADC1(90)) ^ 2) + ((fMeanADC1(6) - aValsADC1(108)) ^ 2) + ((fMeanADC1(7) - aValsADC1(126)) ^ 2) + ((fMeanADC1(8) - aValsADC1(144)) ^ 2) + ((fMeanADC1(9) - aValsADC1(162)) ^ 2) + ((fMeanADC1(10) - aValsADC1(180)) ^ 2) + ((fMeanADC1(11) - aValsADC1(198)) ^ 2) + ((fMeanADC1(12) - aValsADC1(216)) ^ 2) + ((fMeanADC1(13) - aValsADC1(234)) ^ 2) + ((fMeanADC1(14) - aValsADC1(252)) ^ 2) + ((fMeanADC1(15) - aValsADC1(270)) ^ 2) + ((fMeanADC1(16) - aValsADC1(288)) ^ 2) + ((fMeanADC1(17) - aValsADC1(306)) ^ 2) + ((fMeanADC1(18) - aValsADC1(324)) ^ 2) + ((fMeanADC1(19) - aValsADC1(342)) ^ 2) + ((fMeanADC1(20) - aValsADC1(360)) ^ 2)



    Ist kompliziert geschrieben, aber lassen wir das erstmal dahingestellt, darum geht es ja nicht.

    Ihr seht also dass der aValsADC1-Wert in jedem Winkel wichtig ist.



    Ich habe oben den aValsADC1-Wert ja als Array mit 360 Werten gespeichert. Aber bei jedem dieser Werte 0-360 soll nun das dSin noch von sagen wir mal 0-50 in 0.01 Schritten verändert werden. Am Ende soll also Err1 möglichst klein sein und dafür muss ich eben dSin variabel einstellen können, um zu schauen bei welchem Wert der Fehler1 am kleinsten wird.



    Wie kann ich das jetzt machen? Gibt es sowas wie ein Array im Array? Dass ich z.B. mit meinem Array von oben die Werte von 0-360 speichere und dann für jedes einzelne Grad mit einem Array noch die verschiedenen Werte bei veränderung von dSin speichere? Oder wie könnte man sowas machen?



    Sorry wenn ihr das nicht ganz versteht, aber ich kann die Frage nicht besser stellen, weil ich euch dazu alles erklären müsste was die verschiedenen Werte sind und wo sie herkommen und was das Ganze für einen Sinn gibt, aber das ist über Tastatur etwas schwierig. Aber vielleicht klappt es ja und mit kann jemand helfen..

    Gruß
    Willkommen im Forum. :thumbup:

    Tobias195 schrieb:

    VB.NET-Quellcode

    1. aValsADC1(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + dSin) * PI / 18)
    Das soll doch sicher Pi / 180 heißen?
    Soll das so was wie eine Schüttelmethode zur Berechnung eines Optimums werden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    #### VOLLZITAT ####

    Wat ? Bitte was willst du ? :oo
    Des weiteren spare dir
    die
    ganzen
    breaks
    und nutze den VB-Code Tag.


    Wenn du VB.Net nutzt, hab ich jetzt nicht erfahren können, dann gibt es System.Collections.Generic.List(Of T)
    Diese lassen sich beliebig weit verschachteln, praktisch eine List von Listen (aka 2D Tabelle) = List(Of List(Of T))


    EDIT: Willkommen im Forum :) :thumbsup:
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @ RodFromGermany:



    Nein, das soll nicht PI / 180 sein. Das hat seinen Sinn so wie es da steht und darum geht es auch nicht, das funktioniert da schon genau so wie ich das will.



    Und Sorry für die ganzen Breaks und dass ich keinen VB-Quellcode verwendet habe, das habe ich vorher noch nicht gewusst!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tobias195“ ()

    @Tobias195:: Mach Dir eine separate Klasse, in der Du die Daten hältst.
    Da kannst Du mehrere Arrays anlegen für 1°- und 0,1°-Schritte usw.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich bin schon einen Schritt weiter und bräuchte hier mal Hilfe, das sollte jetzt verständlicher sein:

    Also Ihr seht 37 Arrays die jeweils 360 Werte speichern Wie kann ich das kürzer schreiben, sodass ich den Wert in der Klammer nicht einzeln hochzählen muss? Mir fällt da eigentlich nur eine Schleife ein, aber eine Schleife in der Schleife funktioniert doch nicht oder? Sonst würde ja er erst den einen Wert bis Miximalwert hochzählen und dann erst in die andere Schleife wechseln, das würde mir ja auch nichts bringen.

    VB.NET-Quellcode

    1. For iWinkel0To360 = 0 To 360
    2. aValsADC11(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -18) * PI / 18)
    3. aValsADC12(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -17) * PI / 18)
    4. aValsADC13(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -16) * PI / 18)
    5. aValsADC14(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -15) * PI / 18)
    6. aValsADC15(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -14) * PI / 18)
    7. aValsADC16(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -13) * PI / 18)
    8. aValsADC17(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -12) * PI / 18)
    9. aValsADC18(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -11) * PI / 18)
    10. aValsADC19(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -10) * PI / 18)
    11. aValsADC110(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -9) * PI / 18)
    12. aValsADC111(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -8) * PI / 18)
    13. aValsADC112(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -7) * PI / 18)
    14. aValsADC113(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -6) * PI / 18)
    15. aValsADC114(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -5) * PI / 18)
    16. aValsADC115(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -4) * PI / 18)
    17. aValsADC116(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -3) * PI / 18)
    18. aValsADC117(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + -2) * PI / 18)
    19. aValsADC119(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 0) * PI / 18)
    20. aValsADC120(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 1) * PI / 18)
    21. aValsADC121(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 2) * PI / 18)
    22. aValsADC122(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 3) * PI / 18)
    23. aValsADC123(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 4) * PI / 18)
    24. aValsADC124(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 5) * PI / 18)
    25. aValsADC125(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 6) * PI / 18)
    26. aValsADC126(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 7) * PI / 18)
    27. aValsADC128(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 9) * PI / 18)
    28. aValsADC129(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 10) * PI / 18)
    29. aValsADC130(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 11) * PI / 18)
    30. aValsADC131(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 12) * PI / 18)
    31. aValsADC132(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 13) * PI / 18)
    32. aValsADC133(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 14) * PI / 18)
    33. aValsADC134(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 15) * PI / 18)
    34. aValsADC135(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 16) * PI / 18)
    35. aValsADC136(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 17) * PI / 18)
    36. aValsADC137(iWinkel0To360) = 607.03 * Sin((iWinkel0To360 + 18) * PI / 18)
    37. Next

    Gruß
    OT: Ich weiß nicht, wie du dich bei so einer Architektur mit so vielen Namen noch auskennst. Ich würde den Überblick verlieren. Zudem iWinkel solltest du nicht als Bezeichner nehmen. "I" zeigt normalerweise auf Schnittstellen, wenn es auch groß geschrieben wird, aber das kann leicht verwirren. Gibt es denn keine Möglichkeit alles auf einmal anzusprechen, denn du initialisiert alles mit dem selben Wert, nur dass du dann in einer For-Schleife die eine Zahl hochlaufen könntest mit Step 1.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Tobias195:: Probier es mal so:

    VB.NET-Quellcode

    1. Private myArray(37, 360) As Double
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. For i = 0 To 360
    4. Dim offset = -18
    5. For j = 0 To 36
    6. myArray(j, i) = 607.03 * Math.Sin((i + offset) * Math.PI / 18)
    7. offset += 1
    8. Next
    9. Next
    10. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok danke da werde ich mich gleich mal ranwagen..

    mal eine andere Frage: Ich habe Variablen mit verschiedenen Werten und will den kleinsten Wert wissen. Das habe ich soweit schon gelöst:

    VB.NET-Quellcode

    1. dMin = WorksheetFunction.Min(V1, V2, V3,...,Vn)
    Das funktioniert auch so wie ich es will, ich bekomme am Ende auch den kleinsten Wert angezeigt. Ist es möglich, dass ich mir neben dem kleinsten Wert (wird in der Exceltabelle dann ausgegeben) noch ausgeben lasse, wie die Variable heißt, die diesen kleinsten Wert trägt?

    Gruß Tobias

    Tobias195 schrieb:

    wie die Variable heißt
    Da musst Du 2 Arrays parallel sortieren:

    VB.NET-Quellcode

    1. Dim names() = {"aa", "bb", "cc", "dd", "ee"}
    2. Dim values() = {2, 3, 5, 1, 4}
    3. Array.Sort(values, names)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Tobias195 schrieb:

    noch ausgeben lasse, wie die Variable heißt, die diesen kleinsten Wert trägt?
    ist ja Quatsch.
    Wenn deine Daten in einem Array sind, und das Array heißt myArray, dann heißt die Variable myArray, und da sind alle Daten drin - weitere Namen gibt es nicht.

    Und wenn du mit deinen ca. 30 Variablen weitermachen willst, dann ist eiglich eh Nachtschicht.

    Wenn man zur Laufzeit den Namen von Variablen wissen will, verwechselt man üblicherweise die Ebenen.
    Nämlich zur Laufzeit gibt es keine VariablenNamen.
    Die Namen gibt es nur im Code, damit der Programmierer programmieren kann, was mit der oder der Variable geschieht.
    Zur Laufzeit geschieht es dann - Variablen-Namen existieren da nicht mehr.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()