Verfasst am: 18.11.2015, 12:11
Titel: komplexe Vektoren in Matrizen fügen und neu sortieren
Hallo zusammen,
ich bin noch ein Matlab-Neuling und ich habe ein Problem, das ich nicht gelöst bekomme.
Also ich habe 2 Tabellen in Matlab die eine heißt "Versuchsplan" die andere "Ergebnisse". Die Tabelle Versuchsplan besteht aus 7 Spalten mit je 112.914 Zeilen. Da in der Tabelle nur reelle Werte stehen, macht die keine Probleme. Dazu muss ich sagen, dass jede Spalte in eine Variable gewandelt wird.
ABER in der Tabelle "Ergebnisse" stehen 11 Spalten mit ebenfalls 112.914 Zeilen. Aber in den Zellen dieser Tabelle stehen 4x3, 3x3 und 3x1 Matrizen.
Dabei schreibt Matlab die Matrizen in einer Spalte alle untereinander, sodass Variablen mit 451.656 Zeilen entstehen.
Ich muss aber die Variablen später durchsuchen können und dazu dann den passenden Eintrag in den anderen Variablen finden. Das geht ja nur, wenn die Zeilennummern gleich bleiben.
Deswegen habe ich mir überlegt, dass ich alle Werte der Matrizen in eine Zeile schreiben will. Dann haben wieder alle Variablen 112.914 Zeilen und ich kann es herrlich filtern und sortieren.
Dazu habe ich folgenden Code geschrieben, der auch funktionier aber EWIG brauch. Ich spreche hier von ~5Minuten pro Variabel und ich habe 8 davon... ´Vor allem bin ich mir gar nicht sicher ob Matlab rechnet oder sich aufgehangen hat.... ich hab extra ein "disp('fertig') ans Ende geschrieben, damit ich sehe wenn die Berechnung fertig ist. Das dauert alles zu lange.
Code:
for x=1:112914;
A=cell2mat(Tabellenname.Spaltenname(x,:);
A(1,2)=A(2,1); A(1,3)=A(3,1); A(3,:)=[]; A(2,:)=[];
if x==1;
Var1=A;
elseif x>1;
Var1=vertcat(Var1,A);
end end
oder auch "cell" lässt sich das Problem nicht lösen. Die Warnung bleibt bestehen.
Jetzt habe ich gesehen, dass es die "reshape" Funktion gibt. Aber in allen Beispielen dazu werden die Werte in einer Spalte nach einer festgelegten Anzahl von Werten getrennt. Das geht ei mir nicht.
Ich brauche die Anweisung "lasse die Werte der ersten Zeile, wo sie sind, füge alle Werte der zweiten Zeile in eine neue Spalten am Ende der ersten Zeile ein und lösch die zweite Zeile, mache das gleiche mit der dritten Zeile; lasse dann die ursprünglich 4.Zeile (die durch das Löschen der 2. und 3. Zeile jetzt die 2. Zeile ist) unangetastet und verfahre mit den ursprünglichen Zeilen 5 und 6 wie mit den Zeilen 2 und 3. und so weiter bis man bei 112914 ankommt und das nach Möglichkeit in einer angemessenen Zeit.
Ach ja zu allem Überfluss sind die Werte in den Matrizen auch noch komplex.
Versteht mich jemand und kann mir auch noch helfen?
Verfasst am: 23.11.2015, 09:58
Titel: komplexe Vektoren in Matrizen fügen und neu sortieren
Das Beispiel war für die 3x1 Matrix. Deswegen ist da nur die erste Spalte berücksichtigt. In den anderen Matrizen beachte ich schon alle Spalten.
Ich habe das so wie ich es hatte mit "vertcat" durchlaufen lassen. Hat fast 2 Stunden gedauert. Aber ich habe mir einen Weg überlegt wie ich das nur ein Mal machen musste und dann habe ich das eben rechnen lassen und solange was anderes gemacht. Sicherlich nicht der klügste Weg, aber der für mich akzeptabelste.
Verfasst am: 23.11.2015, 12:50
Titel: Re: komplexe Vektoren in Matrizen fügen und neu sortieren
Hallo SaraNadine,
Die Methode vergeudet Resourcen, und damit Energie und infolgedessen wird die Welt mit mehr CO2 verseucht als nötig. Think global, act local. :-)
Mit
vertcat
tritt das Problem auf, dass das Array in jeder Iteration vergrößert wird. Dafür wird ein neues Array im Speicher alloziert und die Werte des alten kopiert. Wenn man das für z.B. 1000 doubles macht, hat man zum Schluss nicht 1000*8B = 8kB alloziert, sondern sum(1:1000)*8b = 2MB . Bei 112.914 Zeilen geht es schon um Größenordnungen von 3.187 TerraByte mal die Anzahl der Bytes pro Zeile. Dass das Stunden dauert, ist nicht verwunderlich.
Es gibt aber eine triviale Abhilfe: Pre-Allocation. Man reserviert die benötigte Anzahl von Elemente vor der Schleife und kopiert die Variablen nur hinein, anstatt sie anzuhängen. Und schon läuft das eher in Sekundenbruchteilenm denn die Größenordnung 100'000 ist kein nennenswertes Problem für moderne Rechner.
das erspart die komplette if-Schleife aus meinem ersten Text und geht super schnell.
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.