zweidimensionales Array



  • danke michael e. und cooky451,

    ich sollte aber auch die position dieser spins wissen, damit ich die energie der nächsten nachbarn ausrechnen kann.

    also von site[i][j] sollte ich das i und j zufällig wählen. und ein sweep sollte alle 100x100 spins abdecken. mit i_right(i,j) berechne ich z.B in einer funktion die Energie der nachbarn auf der rechten seite des spins.

    langsam verlier ich den überblick. wahrscheinlich kann man das alles einfacher machen.

    aber vielleicht hat noch jemand einen tipp

    danke vorerst mal



  • nijntje schrieb:

    langsam verlier ich den überblick. wahrscheinlich kann man das alles einfacher machen.

    Ich zumindest habe ihn verloren. Erkläre einfach mal ausführlich und von vorne, was genau das Programm können soll. Vergiss dabei völlig irgendwelche Einschränkungen was C++ angeht, erkläre einfach nur das zu lösende Problem.

    Denn solange du keine direkte Frage zu C++ hast, ist das die einzige Möglichkeit dir zu helfen. Ich persönlich habe z.B. noch nicht verstanden, was genau du eigentlich erreichen möchtest.



  • Geh doch über ein Hilfsarray, das die Indizes der Spins speichert. Wenn du also 100 Spins hast füllst du das Array mit den Werten 0-99 und mischt es dann mit std::random_shuffle . Damit hast du also die Indizes gemischt und kannst anhand des aktuellen Index den linken und rechten Nachbarn betrachten.



  • Also ich habe ein zweidimensionales array (site[i][j]) mit spins = 1 oder -1.
    bei jedem schritt muss ich einen zufällig ausgewählten spin drehen und mit den nächsten nachbarn vergleichen.

    wenn ich alle spins gewechselt und verglichen habe (= ein sweep), mache ich das ganze noch ein paar 1000mal.

    wenn ich nur i und j zufällig wähle, kann es sein, dass ich in einem sweep nicht alle spins berücksichtige. um mit den nachbarn zu vergleichen, wäre es aber sehr praktisch mit i und j weiterarbeiten zu können.

    danke nochmal



  • Edit: Dann eben nicht...@cooky451: Mir ist halt langweilig und keine Zeit für großes. 🙄



  • nijntje schrieb:

    Also ich habe ein zweidimensionales array (site[i][j]) mit spins = 1 oder -1.

    Wie war das mit Sprache nicht beachten? Na egal. 🤡

    nijntje schrieb:

    mit den nächsten nachbarn vergleichen.

    Welcher ist der nächste Nachbar? (Angenommen Element [i;j] ist gewählt. Nachbar ist dann [?;?])
    (Was ist bei [0;0] bzw. [field_size;field_size]?)

    @Hacker
    Was bitte hat der Code mit dem Problem zu tun? oO



  • sorry... 😃

    der nächste nachbar ist [i, j+1], [i, j-1], [i+1, j], [i-1, j]

    bei [0, 0] z.B wäre [0, N-1], [N-1, 0]...

    eigentlich habe ich für jeden nachbar eine funktion, die die randbedingungen miteinbeziehen.

    die funktion schaut etwa so aus:

    int Spin::i_right(int i, int j)					
    {
    	row = i;
    	column = j;
    
    	if (column == L-1) 
    	{
    		spin_dir = site[row][0];
    	}
    	else 
    	{
    		spin_dir = site[row][column+1];
    	}
    
    	return spin_dir;
    


  • nijntje schrieb:

    also von site[i][j] sollte ich das i und j zufällig wählen. und ein sweep sollte alle 100x100 spins abdecken. mit i_right(i,j) berechne ich z.B in einer funktion die Energie der nachbarn auf der rechten seite des spins.

    Die Lösung steht zwar schon mehr oder weniger hier, könnte aber gut im Rauschen (Seitenblick auf Hacker) untergehen.

    Angenommen du hast eine LxL-Matrix. Nun willst du alle (i,j){0,,L1}2(i,j) \in \{0,\ldots,L-1\}^2 in zufälliger Reihenfolge durchgehen. Dazu benutzt du die Bijektion f:{0,,L1}2{0,,L21},f(i,j)=iL+jf:\{0,\ldots,L-1\}^2 \rightarrow \{0,\ldots,L^2-1\},\, f(i,j) = i \cdot L + j. Das hat den Vorteil, dass wir uns jetzt im Eindimensionalen bewegen, sodass wir random_shuffle auf 0, ..., L^2 - 1 benutzen können.

    vector<int> indices;
    for(int i = 0; i < L * L; ++i)
        indices.push_back(i);
    
    random_shuffle(indices.begin(), indices.end());
    for(int k = 0; k < indices.size(); ++i)
    {
        int i = indices[k] / L;
        int j = indices[k] % L;
        // Nun haben wir i und j wieder bestimmt, sodass wir auf den entsprechenden Eintrag und seine Nachbarn zugreifen können:
        spins[i][j] *= -1;    // Spin gekippt
        // etc.
    }
    


  • vielen dank

    das ist genau, was ich gesucht habe!! 🙂

    kenne vector und co. noch nicht wirklich, aber man lernt dazu.

    grüsse
    nijntje



  • Ich zerstöre hier gar keine Threads. Wenn mich jemand blöd anmacht, dann lass ich mir das nicht gefallen.



  • 314159265358979 schrieb:

    Ich zerstöre hier gar keine Threads. Wenn mich jemand blöd anmacht, dann lass ich mir das nicht gefallen.

    Werd erwachsen und ignorier es dann einfach.



  • Hacker schrieb:

    Werd erwachsen und ignorier es dann einfach.

    oder klärt das per PM untereinander.

    oder macht euch in der Spielwiese einen eigenes "PI vs. Hacker"-Thread auf.



  • daddy_felix schrieb:

    oder macht euch in der Spielwiese einen eigenes "PI vs. Hacker"-Thread auf.

    Kannst du auch etwas sinnvolles sagen? Das versteh ich nicht, denn es gibt keine Spielwiese (oder ein Forum das so heißt), lediglich einen Thread im C++-Forum der in OT.: Spielwiese für Hacker und PI umbenannt wurde.



  • Hacker schrieb:

    Werd erwachsen und ignorier es dann einfach.

    Sagt der richtige. trololol



  • daddy_felix wollte dir/euch nur sagen, dass ihr euch einen privaten Schauplatz für euren Kindergartenkrieg suchen sollt. Indem du/ihr in jedem zweiten Thread aufeinandereinhackt lenkt ihr vom Thema ab. Abgesehen davon will hier auch vermutlich niemand wissen, was ihr beiden euch zu sagen habt, es sei denn, es ist fachlich. Gilt übrigens auch für TyrRoXx...


Anmelden zum Antworten