und würde jetzt gerne auf ein Element davon zugreifen. Allerdings funktioniert das mit der klassischen Indizierung nichtmehr. Statt die Elemente mit dem entsprechenden Index rauszusuchen setzt Matlab den Index als Variable und gibt mir einen Wert aus
Also beispielsweise
liefert mir dann halt [1 2 12 16]
und ich hätte gerne 4.*x als Ausgabe.
Vielen Dank für jede Hilfe!
Grüße,
Phil.
edit:
vielleicht noch wichtig zu wissen, das war jetzt nur ein kleines Beispiel, ich habe eine Matrix, mit zwei Variablen x und z und muss mit der Matrix auch rumrechnen können, also es ist keine Lösung für mich das ganze über einen Cell Array zu machen. Denke ich Falls doch, dann vielen Dank für jeden Lösungsansatz!
du kannst das ja in zwei aufeinanderfolgenden Befehlen machen.
Bei komplexeren Funktionen ist es vielleicht übersichtlicher, statt eines anonymous Function Handles eine eigene Funktion zu verwenden.
Um mehr sagen zu können, müsste man wissen, was genau du mit a im weiteren vorhast.
Du meintest ich sollte die Rechnung nicht symbolisch sondern numerisch machen, ich bin mir nicht sicher ob ich das jetzt so mache wie du gemeint hast, aber es sieht jetzt folgendermaßen aus:
i=1;
while i<=6
j=1;
while j<=6 if S_trans(i,j)~=0 try
S_eff(i,j) = ((2*h)^-1*(x_2-x_1)^-1)*integral2(S_trans(i,j),x_1,x_2,-h,h);
catch err
S_eff(i,j) = S_trans(i,j);
end end
j=j+1;
end
i=i+1;
end
danke für deine Antwort.
Ja, ich bin gerade dabei die Berechnung von S_trans auszulagern, allerdings läuft es ja dann auch darauf hinaus, dass ich eine anonymous function S_trans(x,z) in Form einer 6x6 Matrix bekomme.
Und bzgl. der Auswertung, ich kann noch keinen Wert für x oder z setzten, weil ich ja noch ein Integral über x und z berechnen will.
Das Problem ist ja, dass ich von dem gesamten array noch ein Doppelintegral bilden muss. Und da dies (meines wissens) nicht direkt möglich ist, mache ich das über den Umweg mit den zwei while-Schleifen und integriere jedes Element einzeln.
Dazu muss ich jedoch irgendwie ein Element des arrays als anonymous function raushohlen können.
Also, die zentrale Frage ist, wie kann ich von einer anonymous function in Matrixform, wie z.B.
danke für deine Geduld und Mühe, ich befürchte ich bin etwas zu unbedarft
Also ich verstehe immernoch nicht wie genau ich das machen kann.
Ich bekomme S_trans ja erst durch eine etwas aufwändigere Matrixrechnung, also auch wenn ich das in eine andere Funktion auslagere, sieht es bei mir im Prinzip genauso aus wie in dem obigen Code und am Ende der Funktion steht
Ich weiss nicht ob ich dich richtig verstanden habe, meinst du ich soll in der ausgelagerten Funktion dann immer jeweils nur ein Element der Matrix berechnen, ohne die gesamte Matrix zu bestimmen? Weil da muss ich ganz ehrlich sagen, weiss ich nicht wie :/
Also wie gesagt, ich bin mir nicht so sicher ob ich verstanden habe wie du das meinst, kannst du das eventuell an einem simplen Beispiel demonstrieren?
Wie immer ein riesen Dankeschön für deine Hilfe Harald!
Grüße,
Phil.
ich glaube, ich habe jetzt den zweck vom Auslagern verstanden.
Wenn ich eine eigene Funktion schreibe, muss ich innerhalb der Funktion garnicht mehr mit anonymous functions arbeiten richtig?
Also es scheint in der Hinsicht zumindest zu funktionieren, dass ich jetzt an ein einzelnes Element der Matrix rankomme, allerdings mag er das Doppelintegral noch nicht berechnen
Sofern du mir weiter beistehen möchtest, die Funktion sieht jetzt folgendermaßen aus
wenn du einen Haltepunkt in die problematische Stelle setzt, siehst du, dass MATLAB versucht, deine Funktion für Matrizen x und z auszuwerten. Du musst also entweder deine Funktion darauf auslegen (Vektorisierung) oder das intern mit einer for-Schleife behandeln.
Also ich hab einfach mal die haudraufvariante probiert und alle skalare, die kein x oder z enthalten mit ones(size(x)) multipliziert, damit einfach dann alles die gleiche dimension hat, aber das hat nurnoch mehr Fehler gegeben.
Mal eine doofe Frage, ursprünglich hatte ich das ganze ja mit syms Variablen gerechnet und vor der Integration mit MatlabFunction umgewandelt. Das aktuelle Vorhaben ist ja immernoch die Rechenzeit zu beschleunigen, funktioniert hatte es ja schon.
Ich habe spasseshalber ein bisschen rumprobiert und wenn ich einfach die Funktion mit x und z als syms Variablen durchlaufe und anschließend wieder eine Matlabfunction draus mache funktioniert die Integration ja wieder.
Aaaber bezüglich der Rechenzeit ist da vermutlich kein Unterschied wie wenn ich gleich komplett symbolisch rechne oder?.
Puh. Naja. Ich habe mir jetzt auch mal überlegt wie ich das mit einer Schleife machen könnte, aber muss sagen ich steige nicht ganz durch. Also, da x und z ja Matrizen sind, ist meine Matrix S_trans am Ende ja auch garkeine 6x6 Matrix mehr nehme ich an oder? Dann muss ich die Ausgabe ja auch entsprechend anpassen, weil mit S_trans_ij = S_trans(i,j) gebe ich ja nur das allererste Element aus, müsste aber eigentlich eine Matrix ausgeben. Nehme ich an.
Wenn ich das jetzt mit einer Schleife mache wird das doch irgendwie kompliziert, ich müsste im vornherein eine große Nullmatrix definieren und die dann elementweise auffüllen, sehe ich das richtig?
ääh. irgendwelche supereinfachen Lösungsvorschläge? ansonsten geb ich glaube ich auf für heute ^^
Auf jednefall nochmal ein riesen Dankeschön an dich Harald für deine viele Geduld und Mühe!
Also ich hab einfach mal die haudraufvariante probiert und alle skalare, die kein x oder z enthalten mit ones(size(x)) multipliziert, damit einfach dann alles die gleiche dimension hat, aber das hat nurnoch mehr Fehler gegeben.
In der Regel gibt es einen Fehler. Unübersichtlich wird es höchstens dadurch, dass der komplette Stack Trace (wie es zu dem Fehler kam) mit angezeigt wird. Allerdings sollten sich die Probleme durch das Setzen von Haltepunkten lösen lassen.
Wenn du einfach alles als Matrizen setzt, ist es nicht verwunderlich, dass es spätestens bei T Probleme gibt.
Zitat:
Mal eine doofe Frage, ursprünglich hatte ich das ganze ja mit syms Variablen gerechnet und vor der Integration mit MatlabFunction umgewandelt. Das aktuelle Vorhaben ist ja immernoch die Rechenzeit zu beschleunigen, funktioniert hatte es ja schon.
Ich habe spasseshalber ein bisschen rumprobiert und wenn ich einfach die Funktion mit x und z als syms Variablen durchlaufe und anschließend wieder eine Matlabfunction draus mache funktioniert die Integration ja wieder.
Dem kann ich leider nicht ganz folgen.
Zitat:
Aaaber bezüglich der Rechenzeit ist da vermutlich kein Unterschied wie wenn ich gleich komplett symbolisch rechne oder?
Wenn du es schaffst, die symbolischen Berechnungen nur einmal am Anfang durchzuführen, sollte das kaum Auswirkungen haben. Problematisch wird vermutlich in erster Linie das symbolische Integrieren. Aber das alles kannst du ja mit dem Profiler analysieren.
Zitat:
Wenn ich das jetzt mit einer Schleife mache wird das doch irgendwie kompliziert, ich müsste im vornherein eine große Nullmatrix definieren und die dann elementweise auffüllen, sehe ich das richtig?
Wenn es nicht vektorisiert zu berechnen geht, dann ja.
also Danke nochmal für deine große Hilfe! Das ganze liegt jetzt erstmal still weil ich wieder für Prüfungen lernen muss, aber ich denke ich weiss schon wie ich dann weitermache. Hast mir auf jedenfall super weitergeholfen! Und das an einem Sonntag
Grüße,
Philipp.
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.