Ich muss eine multidimensionale Matrix von zufällig verteilten Zahlen mit einer Gauss-Verteilung erstellen und versuche, das Programm so optimiert wie möglich zu halten. Momentan verwende ich Boost-Matrizen, aber ich kann scheinbar nichts finden, was dies ohne manuelles Looping erreicht. Im Idealfall möchte ich etwas ähnlich der Python-Funktion numpy.random.randn(), aber das muss in C++ geschehen. Gibt es eine andere Möglichkeit, dies schneller als manuell zu erreichen?Erstellen Sie Matrix von Zufallszahlen in C++ ohne Schleife
Antwort
Sie müssen sowieso eine Schleife, aber Sie können die Array-Lookup innerhalb Ihrer Schleife zu beseitigen. Die echte N-dimensionale Array-Indizierung wird teuer sein, daher ist die beste Option jede Bibliothek (oder Sie selbst), die Ihnen auch einen zugrunde liegenden linearen Datenspeicher zur Verfügung stellt.
Sie können dann das gesamte n-dimensionale Array so durchlaufen, als ob es linear wäre, und viele Multiplikationen der Indizes mit den Dimensionen vermeiden. Eine weitere Optimierung besteht darin, den Index ganz zu beseitigen, einen Zeiger auf das erste Element zu setzen und dann den Zeiger selbst zu iterieren, dies beseitigt eine ganze Variable in der CPU, die dem Compiler mehr Platz für andere Dinge geben kann . z.B. Wenn du 1000 Elemente in einem Vektor hast:
vector<int> data;
data.resize(1000);
int *intPtr = &data[0];
int *endPtr = &data[0] + 1000;
while(intPtr != endPtr)
{
(*intPtr) == rand_function();
++intPtr;
}
Hier sind zwei Tricks passiert. Berechnen Sie die Endbedingung außerhalb der Schleife selbst (dies vermeidet das Nachschlagen einer Funktion wie vector :: size() 1000-mal) und arbeitet mit Zeigern zu den Daten im Speicher und nicht mit Indizes. Ein Index wird bei jedem Zugriff auf das Array intern in einen Zeiger umgewandelt. Durch Speichern des "aktuellen Zeigers" und jedesmal Hinzufügen von 1 werden die Kosten für die 1000-fache Berechnung der Zeiger aus den Indizes eliminiert.
Diese kann schneller sein, aber es hängt von der Implementierung ab. Compiler können einige der Handoptimierungen durchführen, aber nicht alle. Die rand_function sollte auch inline sein, um den Funktionsaufruf-Overhead zu vermeiden. Eine Warnung: Wenn Sie std :: vector mit dem Zeigertrick verwenden, dann ist es nicht Thread-sicher, wenn ein anderer Thread die Länge des Vektors während der Schleife änderte, dann kann der Vektor an einer anderen Stelle im Speicher neu zugeordnet werden. Führen Sie keine Pointertricks aus, es sei denn, Sie würden Ihre eigenen Vektor-, Array- und Tabellenklassen eigene nach Bedarf schreiben.
Danke für die Erklärung! – nlhenderson17
- 1. So erstellen Sie eine Matrix ohne Schleife
- 2. Erstellen Sie eine Bit-Matrix ohne Schleife R
- 3. C# Schleife durch die Liste von Zufallszahlen
- 4. Erstellen Sie multidimensionale Zufallszahlen in MATLAB
- 5. Generieren von mehreren Zufallszahlen in einer Schleife in C
- 6. Matlab Matrix-Betrieb ohne Schleife
- 7. Erzeugung von Zufallszahlen in C
- 8. C Array von Zufallszahlen Speicher
- 9. initialisieren Sie eine float32-Matrix mit Zufallszahlen in numpy/scipy
- 10. Sequenz von Zufallszahlen ohne Wiederholungen
- 11. Generieren von Zufallszahlen ohne Wiederholung
- 12. Erstellen von Zufallszahlen in C# mit einer eindeutigen ID
- 13. file.get() Rückgabe von Zufallszahlen nach einer Schleife C++
- 14. Die einfachste Möglichkeit zum Erstellen von 2D-Matrix in Schleife
- 15. Zufallszahlen in C
- 16. Generieren von Zufallszahlen in For-Schleife von externer Klasse
- 17. C: Erstellen von Zufallszahlen aus einem Bereich, der alle unterschiedlichen
- 18. So erstellen Sie eine Lazy-Sequenz von Zufallszahlen in Clojure
- 19. 3 Zufallszahlen von 2 Zufallszahlen Aufgabe
- 20. Lange Zufallszahlen in C
- 21. Erstellen Sie eine Matrix
- 22. Erstellen Sparse Matrix innerhalb einer Schleife
- 23. Probleme mit Zufallszahlen in C#
- 24. Open-Source-Zufallszahlen-Generierung Algorithmus in C++?
- 25. Verbesserung bei einer for-Schleife: Erstellen Sie eine Reihe von Teilmengen ohne Schleife
- 26. Octave - Mischen von Matrix durch Spalten ohne Schleife
- 27. PHP - Erzeuge Zufallszahlen ohne Duplikate
- 28. C# Matrix von BildBox
- 29. Erstellen Matrix in Schleife eine Funktion in R
- 30. Erstellen Matrix von Vectors Roll Fenster
[Das klingt wie ein Job für 'std :: generate'!] (Http://en.cppreference.com/w/cpp/algorithm/generate) Aber ich bin mir nicht sicher, dass Sie viel Verbesserung sehen werden. – user4581301
Warum ist die manuelle Schleife langsam? – Jarod42
Ich würde vorschlagen, keine Sorgen über die Kosten des Schleifens und setzen Sie die Werte jedes Elements der Matrix einzeln. Ich vermute, dass Engpässe in Ihrem Programm woanders liegen. –