Mit einer for-Schleife generiere ich pro Durchlauf einen Vektor (Länge 2000). Das es sich um ein kombinatorisches Problem handelt, generiere ich ca. 37,000,000 solcher Vektoren. In einer Matrix lässt sich das (zumindest mit meinem Computer) nicht mehr speichern da ich dazu 296 GB bräuchte (selbst mit 'logical' sind das noch 74 GB). Die Sparse-Funktion bringt mir an dieser Stelle leider auch nichts.
Im weiteren Verlauf brauche ich von der 2,000x37,000,000-Matrix jeweils nur die Summe der Zeilen (Ergebnis also wieder ein 2,000-Vektor).
Gibt es evtl. die Möglichkeit jeden der 37,000,000 Vektoren einzeln zu speichern (damit nicht mehr im Workspace und keine Probleme wegen Arbeitsspeicher auftreten) und später jeweils die n-te Zeilen von jedem einzelnen Vektor zu laden und zu summieren?
Oder fällt irgendjemand noch etwas besseres ein?
es gibt sicher einen sinnvollen Weg, der zwischen den beiden extremen Wegen (1. alles im Workspace zu haben und 2. alles auf der HD zu speichern) liegt. Beispielsweise immer eine Million Vektoren speichern, oder bereits vorher Summen bilden... Je nach dem, wie dein Programm grundsätzlich aussieht, kann man entsprechend Vorschläge machen. Ohne Code ist das alles sehr allgemein und es gibt nur wenig, das man sagen kann.
Preallozierst du die Matrix?
Was steht in den Vektoren? Doubles? Ints? Kann man das mit uint8 regeln (Vorsicht bei Summen).
Viele Grüße,
Nras.
P.S.: Wie kommst du auf 296GB? Meiner Meinug nach sind das 2000*37000000*8 byte = 2000*37000000*8/1024/1024/1024 GB = 551 GB. Vielleicht irre ich mich auch.
danke für die schnelle Antwort.
Die 296 GB mit 'single' also *4 statt *8 allerdings habe ich auch /10^9 statt jeweils durch 1024 gerechnet ... war auch lediglich zu Abschätzung des Ganzen.
Den Code kann ich kurz darstellen
Ich habe eine Matrix a in welcher ich für mich relevante Kombinationen bilde. A besteht aus 2 Spalten und den bereits genannten 37,000,000 Zeilen. z.B.
1 2
1 3
1 4 ... usw
Aus meiner Datenmatrix M (2000xn) extrahiere ich dann jeweils die Spalten welche in der Matix A nummeriert sind (z.B. zuerst Spalte 1 und Spalte 2, im nächsten Durchlauf Spalte 1 und Spalte 3 usw...).
So klappt das ganz gut für kleinerer Matrizen, sobald ich jedoch mehr Kombinationen anwenden möchte (wie im Bsp 37,000,000) bekommen ich logischerweise Probleme damit. Im Prinzip reicht mit zum Schluss die Summe der 37,000,000 Spalten was dann eben einen 2,000-Vektor ergibt.
Also wäre eine gute Lösung:
-Mit for-Schleife Matrix(:,i) so weit generieren wie es der Arbeitsspeicher erlaubt
- Jeweils die Zeilen-Summe bilden und den Vektor speichern
- clear und for-schleife weiterführen ...
- Zum Schluss die Zeilensumme der einzelnen generierten Vektoren bilden?
Vielen Dank für den Lösungsvorschlag. Ich denke das Problem sollte damit gelöst sein.
Warum macht der length()-Befehl evtl. nicht das was ich möchte? Was wäre die alternative?
Danke für die Anmerkung. Ich hatte bisher immer Matrizen bei denen die Zeilenzahl deutlich höher als die Spaltenzahl war. Somit hat das bisher keine Probleme gemacht.
verwenden um unabhängig von den Dimensionen keine Probleme zu bekommen.
Viele Grüße
Tobias
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.