Nachdem ich einige Tage hier im Forum studiert und mir etliche Treads bezüglich Indizierung und Vektorisierung durchgelesen habe, wende ich mich heute das erste Mal direkt an Euch, da ich für meine Problemstellung keine Lösung gefunden habe.
Es geht darum, dass ich zwei quadratische Matrizen (n x n) habe. Diese Matrizen stellen in meinem Fall Oberflächentopographien eines Kreisquerschnittes dar. Beide Oberflächen sollten so gegeneinander verdreht werden, dass der Abstand zwischen ihnen minimal wird, sie also bestmöglich zusammenpassen. Es handelt sich hierbei um einen Ermüdungsversuch, bei dem ein Bewehrungsstab gebrochen ist und nun die Bruchflächen in Matlab zusammengefügt werden sollen, um den Luftspalt (Volumen, Distanzen) zwischen beiden Oberflächen zu bestimmen.
Beide Matrizen wurden bislang so aufbereitet, dass sie dieselbe Spalten- wie auch Zeilenanzahl aufweisen. In diesem konkreten Fall also jeweils 1536 x 1536 Elemente pro Matrix.
Eine der beiden Matrizen halte ich statisch und drehe die andere Matrix in 1°-Schritten und bestimme mir dann jeweils den Abstand jedes Punktes der statischen Matrix mit jedem Punkt der gedreht Matrix. Die Zielmatrix wollte ich mir gern als Cell-Array aufbauen
Surface1 = [1-2; 20.5]; % Höhenwerte der ersten Oberflächen
Surface2 = rot90(Surface1,1) + 1; % Rotation der ersten Fläche um 90° {Test}
[theta2,rho2,Z2] = cart2pol(X2,Y2,Mat2); % Umrechnung von Kartesischen- in Polarkoordinaten
rotW2 = W2 - 1; % Verdrehung um 1°
theta20 = (rotW2 .*pi()) ./ 180; % Umrechnung von Kartesischen- in Polarkoordinaten [Xa,Ya,Za] = pol2cart(theta20,rho2,Z2); % gedrehte Matrix
for A = 1 : SXa(1)% Zeilen der statischen Matrix for B = 1 : SYa(1)% Spalten der statischen Matrix for C = 1 : SX1(1)% Zeilen der gedrehten Matrix for D = 1 : SY1(1)% Spalten der gedrehten Matrix
Distance{A,B}(C,D) = sqrt((Xa(A,B) - X1(C,D))^2 + (Ya(A,B) - Y1(C,D))^2 + (Za(A,B) - Z1(C,D))^2);
end end end end
Besteht die Möglichkeit, diese Vierfach-Schleife komplett zu vektorisieren?
Eine lineare Vektorisierung habe ich versucht umzusetzen, was jedoch daran scheiterte, dass mein System mit 64bit und 128 GB RAM die vier Vektoren für A, B, C und D nicht erstellen konnte.
Eine Allokierung der Ergebnis-Matrix ist in diesem Fall nicht möglich gewesen, da eben die Problematik mit dem Fehler "Out of Memory" besteht. Ich bin mir der Tatsache bewusst, dass ich zunächst die "Out of Memory"-Problematik lösen muss, bevor ich überhaupt die Vektorisierung angehen kann.
also ich bin mir nicht ganz sicher ob ich dein Problem richtig verstanden habe, aber gerade die verschachtelten for-Schleifen kannst du meines Erachtens sparen wenn du stattdessen schreibst:
Code:
Distance = sqrt((Xa - X1).^2 + (Ya - Y1).^2 + (Za - Z1).^2);
ich möchte eben nicht elementweise berechnen, sondern das erste Element der statischen Matrix mit allen der gedrehten Matrix, dann das zweite Element der statischen mit allen der gedrehten Matrix.
Ich werde versuchen eine Tabelle online zu stellen, die verdeutlich, wie die Indizes aussehen sollten.
Dennoch schon mal vielen Dank an Dich.
Gruss
Thomas
PS: Tabelle findet ihr im Anhang.
Indizierungstabelle.txt
Beschreibung:
Tabelle für die Indizierung, wie ich sie für die Berechnung brauche am Beispiel zweier Matrizen mit 2 x 2 Elementen.
benötigt 44.5 TB RAM. Da wirst Du mit 128 GB nicht viel ausrichten können.
Wenn Du das als {1538x1536} Cell mit jeweils einer [1536x1536] Matrix darstellst, wirst Du noch etwas mehr Speicher benötigen, aber wenigstens nicht mehr am Stück.
Sowiet ich es in Deinem Code sehe, benutzt Du allerdings keine "Pre-allocation" der Arrays. Das setigert den Speicherbedarf exponentiell, da die Arrays in jeder Iteration anwachsen. Zu diesem Stichwort findet man viele Beiträge im Forum.
Bist Du sicher, dass Du solche gigantischen Datenmengen gleichzeitig verfügbar haben möchtest?
danke für den Hinweis.
Die Umrechnung einer n x n Matrix in den dafür benötigten Speicherplatz habe ich mir vorher gar nicht angeschaut. Daher bin ich entsprechend erstaunt, wieviel Platz die Matrix letztendlich benötigt.
Gestern habe ich einen Weg eingeschlagen, bei dem ich mir diese Matrix versuche zu ersparen, in dem ich mir die minimale Distanz zwischen den beiden Matrizen direkt berechne und diese dann in ein Cell-Array rausschreibe.
Ob das gelingt, werde ich sehen.
Danke nochmals.
Gruss
Thomas
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.