Verfasst am: 04.02.2015, 21:43
Titel: Aus allgemeiner Matrix mit einer for-Schleife zur spez. Matr
Moin! ich hab leider grade total Schiffbruch mit meinem Code für eine Hausübung meiner Uni erlitten. Da sollte mein Code absolut allgemeingültig geschrieben sein; ich (arbeite erst seit 3 Wochen mit Matlab) hab eine manuelle Adressierung von Matrizen gemacht. Also alles für die Tonne. Mir rennt etwas die Zeit davon; daher hoffe ich auf eure Tipps!
Problem:
Ich soll je nach Anzahl von Elementen (Tragwerksbalken) aus einer allgemein Elementsteifigkeitsmatrix eine bzw. mehrere spez. Matrizen für diese Elemente machen. Meine allgemeine 6x6 Matrix hat also Terme als Einträge und für i= 1 bis n (Anzahl der Elemente/Balken) sollen sollen diese entsprechend der Werte(Länge, Stabilität, Querschnittfläche,...) ausgefüllt und die Matrizen ausgegeben werden. Vorgabe ist, dass dies mit einer for-Schleife geschehen soll. Prinzipiell ist mir das Vorgehen absolut klar; die Umsetzung bzw. die richtige Indizierung ist ein absolutes rätselraten ohne Ergebnis. Kann mir jemand mit einem kleinen Beispiel weiterhelfen?
Ich soll je nach Anzahl von Elementen (Tragwerksbalken) aus einer allgemein Elementsteifigkeitsmatrix eine bzw. mehrere spez. Matrizen für diese Elemente machen.
was das darstellt ist für das problem unerheblich.
Zitat:
i= 1 bis n (Anzahl der Elemente/Balken)
wie kommen die in der matrix vor bzw wie sollen die neu angeordnet werden?
du sihst das sind sehr viele fragen offen. deine beschreibung ist alles andere als ausführlich und es lässt sich so nur schwer helfen. ich kann dir da nur den thread aus meiner signatur empfehlen. du erspaarst dir und uns sehr viel zeit wenn du den inhalt des threads beachtest
grüße
_________________
Ohje. Dann war wohl doch etwas bandsalat in meinem Kopf.
Ok; ganz allgemein habe ich eine Matrix (in meinem Fall 6X6), die mit diversen Variablen und Termen bestückt ist. Nun komme ich mit Werten daher und möchte, dass mir MATLAB die eben beschriebene allgemeine Matrix ausgibt, jedoch mit den Werten eingesetzt. Je nach Menge der Werte/Wertepaare sollen entsprechend viele Matrizen ausgegeben werden, die ich im nachfolgenden Schritt weiter benutzen kann; sie also einer Variablen (z.B. M1, M2, ..., Mi) zugeordnet wird. Und da liegt mein Problem.
Anders gesagt: Wie kann ich mit einer for-Schleife sagen, dass aus den Werten a1, b1,...,n1 die Matrix M1; aus den Werten a2,b2,...n2 die Matrix M2 usw. gebildet wird, wenn ich eine Matrix Mi für die allgemeinen Variablen ai, bi,...,ni habe?
das würde mit eval gehen. allerdings ist das sehr schlecht. du versteckst dabei einen index im variablen namen. das ist umständlich zu generieren und noch umständlicher weiterzuverarbeiten. ein index sollte als index benutzt werden. anstatt a2 also a(2) oder auch a{2} falls es sich bei a2 um eine matrix handelt. das kann man dann auch bequem mit schleifen abarbeiten.
wie gesagt der thread richtig fragen ist sehr gut und sollte von jedem neuling gelesen werden. ein codebeispiel mit dem was du bis jetzt versucht hast ist weitaus einfacher als die ausschließliche umschreibung mit worten. du magst wissen was du erreichen willst und was du für daten hast. wir aber nicht.
_________________
Danke, hab ich gelesen. Du hast recht; mit der richtigen Indizierung habe ich meine Probleme. Bei Matrizen haben Klammern (Beispiel: A(n)=...) auch eine andere Bedeutung, weswegen mir die Ausgabe verweigert wird.
Aktuell habe ich jeden Fall einzeln beschrieben. Würde ich jedoch mehr Eingabedaten haben, könnte mein Code damit nichts ausgeben. Das soll nun mit einer Schleife automatisiert werden.
Ein kleines Beispiel zur Verwendung von eval oder ähnlichen Befehlen würde mir sehr helfen!
Mein aktueller Stand mit manueller Adressierung:
Code:
% Eingabedaten
%Eingabe der Koordinaten fuer jeden Knoten
v1=[6.75;3];
v2=[9.5;4];
v3=[3.5;7];
v4=[3.5;1];
Eine Sache klappt dann noch nicht: Wie schaut das mit Matrizen aus? Wenn ich alles so (Copy-paste) fortführe werden mir Matrizen als Zeilen (mit Leerzeichen, anstatt eine neue Zeile auszuführen) ausgegeben. zugeben, die Funktion von cell und numel habe ich zwar nachgelesen, aber nicht wirklich verstanden.
Hier mein aktueller Stand beim Umcodieren:
Code:
% Eingabedaten % Eingabe der Koordinaten fuer jeden Knoten
Wenn ich alles so (Copy-paste) fortführe werden mir Matrizen als Zeilen (mit Leerzeichen, anstatt eine neue Zeile auszuführen) ausgegeben.
versteh ich nicht. welche matrix meinst du?
und warum initialisiert du k_bb mit 3x3 elementen wenn du nur 3 elemente davon benutzt?
Zitat:
e Funktion von cell und numel habe ich zwar nachgelesen, aber nicht wirklich verstanden.
was hast du nicht verstanden?`das warum oder was das macht ?
das warum: zur präallokation des speichers. hier nicht wirklich notwendig aber sollte man sich angewöhnen wenn man mit schleifen arbeitet.
_________________
"sin" und "cos" sind Funktionen in Matlab. Sie als Namen von Variablen zu verwenden, ist mindestens verwirrend.
Die Nutzung von Cells erscheint hier unnötig. Numerische Arrays wären hier effizienter und viel übersichtlicher.
CELL erstellt ein Cell-Array ohne die Inhalte zu belegen. Ein CELL kann im Gegensatz zu einem numerischen Array nicht nur Skalare als Elemente haben, sondern beliebige andere Arrays, z.B. numerische Arrays verschiedener Größe oder auch verschiedenen Typs.
NUMEL gibt die Gesamt-Anzahl der Elemente in einem Array zurück.
Dein Code sind heftig unlesbar aus. Ich wäre nicht in der Lage darin einen Bug zu finden.
Nun K_AA, K_AB, K_BA und K_BB sind 3x3 Matrizen; bzw. Untermatrizen, die nachher zusammengefügt werden sollen. Daher sollten sie auch so ausgegeben werden; allerdings mit den zuvor berechneten Werten besetzt. Mir wird hier aber nur ein Vektor ausgegeben, der jedoch die richtigen Werte hat. Macht es sinn, die o.g. Matrizen aus der for-schleife rauszuziehen?
Bzgl. sin und cos gebe ich dir recht; das war wirklich nicht klug gewählt (auch wenn es letztlich sin und cos Werte sind).
Zum allgemeinen Verständnis fehlt mir die Vorstellung, was ein Array ist. Kann ich mir das wie einen Platzhalter vorstellen? Ist in meinem Fall das array mit den Werten v1 bis v4 belegt?
Ich bin euch sehr dankbar für eure Hilfe und entschuldigt bitte meine möglicherweise dämlichen Fragen!
Diese Forum ist für Fragen da! Und alle Fragen, die Matlab betreffen, sind hier sehr willkommen.
Ein Array ist ein allgemeiner Name für eine Variable beliebigen Types und beliebiger Dimensionen. Ein Skalar ist also ein [1 x 1] Array, ein Vektior ein [M x 1] oder [1 x N] Array und eine Matrix ein [M x N] Array. Höherdimensionale Arrays können dann auch die Dimensionen [M x N x O x P ...] haben. Der Typ kann ein DOUBLE sein, oder ein anderer numerischer Typ. In Matlab können Arrays des Typs "cell" andere Arrays als Elemente enthalten. Cells werden mit den geschweiften Klammern indiziert, andere Arrays mit runden Klammern.
Das Durchlesen der "Getting Started"-Kapitel der Dokumentation klärt solche Fragen. Es ist nur wärmstens zu empfehlen :-)
Hallo Jan, vielen Dank dass ihr mir so unter die Arme greift! Es hilft mir wirklich sehr!
Ich bin leider noch nicht mit einem Matrizen/Vektoren Problem weiter! Ich hab nun die sin und cos Variablen ersetzt.
Ich müsste doch, wenn ich cell als 3x3 definiere, einer 3x3 Matrix erhalten, oder? Trotzdem werden bei mir noch die Elemente der ersten Spalte belegt. Ich bin da total ratlos. was würdest du mir empfehlen, ob den Code zum laufen zu bekommen? Wie gesagt, ich möchte, dass die allgemein gehaltenen Terme je nach zuvor definierten Werten besetzt und berechnet werden.
Ich komme doch langsam voran. Mir werden nun die gesuchten Matrizen als Untermatrizen ausgegeben. Wie kann ich sie mir ganz ausgeben lassen? Wenn ich z.B. K{1} schreibe, wird mir eine Matrix mit vielen Nullen ausgegeben. die oberen linken werte der Untermatrizen stimmen. Im Workspace ist aber die Richtige Matrix als Untermatrix mit Klick auf K zu finden und wenn ich direkt Werte auswähle mit K{1}(a,b) funktioniert das auch. Nur die Ausgabe als gesamte Matrix klappt noch nicht bzw. die richtige Adressierung.
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.