Verfasst am: 30.12.2011, 11:13
Titel: Mehrdimensionale Matrix in for-Schleife beschreiben
Hallo,
ich hänge gerade ein wenig, wie am besten eine mehrdimensionale Matrix zu beschreiben ist.
Ich habe einen Raum in n Volumenelemente aufgeteilt. Dabei ist jeden Volumenelment über x,y,z ansprechbar. x,y,z sind natürliche Zahlen und dazugehörig ist b(reite), h(öhe) und l(änge). b,h undl sind Zeilenvektoren mit jeweils B, H und L Elementen. Zu jeden Volumenelement gehören 5 Eigenschaften.
Damit ich die jeweiligen Eigenschaften gut ansprechen kann, wollte ich eine mehrdimensionale Matrix der Dimension BxHxLx5, so dass ich schlussendlich die Eigenschaften über bspw. eig(1,2,1,: ) auslesen kann.
Ich dachte mir, ich kann das ganze in einer for-schleifen Verkettung wie folgt packen:
Code:
%Version die nicht funktioniert
eig = zeros(size(b,2),size(h,2),size(l,2),5);
for x=1:size(b,2) for y=1:size(h,2) for z=1:size(l,2)
eig1 = b(x)*h(y);
eig2 = b(x)*l(z);
eig3 = b(x)*b(x);
eig4 = h(y)*h(y);
eig5 = 1/(l(z)*l(z)*b(z));
eig(x,y,z,:)=[eig1 eig2 eig3 eig4 eig5];
end end end
%Version die funktioniert
q=1; %Zählvariable
for x=1:size(b,2) for y=1:size(h,2) for z=1:size(l,2)
eig1 = b(x)*h(y);
eig2 = b(x)*l(z);
eig3 = b(x)*b(x);
eig4 = h(y)*h(y);
eig5 = 1/(l(z)*l(z)*b(z));
eig_vec(q,:)=[eig1 eig2 eig3 eig4 eig5];
q=q+1;
end end end eig = reshape(eig_vec,size(b,2),size(h,2),size(l,2),5);
Es ist sinnvoll statt "funktioniert nicht" zu beschreiben, was genau nicht funktioniert. Es wäre ineffizient, wenn ich jetzt anfange zu raten, was Dein Problem sein könnte.
Es gibt noch einiges Potential zur Beschleunigung. Es werden nämlich viele Berechnungen wiederholt ausgeführt, z.B. "eig3 = b(x)*b(x);". Das wird man also in die äußere Schleife ziehen.
"eig" ist ein Matlab-Befehl. Man sollte den Namen nicht überschreiben.
ich hab den Code für das Forum umgeschrieben. Die Namen lauten nicht "eig". Somit aber unpassend gewählt für meine Erklärung.
Ebenso unpassend das Problem nicht zu beschreiben. Zum Testlauf hatte ich symbolische Werte [x=sym('x_',[1 3])] für die Abmessungen gewählt und das passte nicht mit der Initialisierung via 'zeros' zusammen. Also ein ganz einfacher Fehler. Aber ich hab diejenigen in eine äußere Schleife gezogen, wenn sie in einer Schleife drunter nicht weiter angesprochen werden.
Das Problem ist somit gelöst. Einzig wegen der Performance könnte, wie du ja auch selbst schreibst, weiter überlegt werden. Ich werde nochmal mit meinem Betreuer reden inwieweit das bei ca. zehn Elemente nötig ist.
Desweiteren war die Ausgabe/Sortierung über reshape auch falsch.
Vielen Dank,
Tekrum
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.