WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Element von anonymous function array auslesen

 

Phil254
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 16:29     Titel: Element von anonymous function array auslesen
  Antworten mit Zitat      
Hallo an alle!

(hoffentlich) kleines Problem, aber ich finde leider keine Lösung :/

Ich habe einen anonymous function array (falls man das so nennen kann) in Form von
Code:
a = @(x) [1 2 3.*x 4.*x]

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 Smile
Also beispielsweise
Code:

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 Smile Falls doch, dann vielen Dank für jeden Lösungsansatz!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 18:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort!

Es geht um die Optimierung der Rechenzeit bei der du mir schoneinmal geschrieben hattest:

http://www.gomatlab.de/leistungsint.....en-rechenzeit-t27644.html

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:

Code:

E_1 = 169; E_2 = 9; E_3 = 9; G_12 = 6.5; G_13 = 6.5; G_23 = 3.1; v_12 = 0.31; v_13 = 0.31; v_23 = 0.45; AL = 119/2790;

S11 =  1 / E_1;
S12 = -v_12 / E_1;
S13 = -v_13 / E_1;
S22 =  1 / E_2;
S23 = -v_23 / E_2;
S33 =  1 / E_3;
S44 =  1 / G_23;
S55 =  1 / G_13;
S66 =  1 / G_12;

S = [S11 S12 S13 0   0   0
     S12 S22 S23 0   0   0
     S13 S23 S33 0   0   0
     0   0   0   S44 0   0
     0   0   0   0   S55 0
     0   0   0   0   0   S66];

h = 1;
A = AL;
L = 1;
x_2 = L;
x_1 = 0;

PHI = @(x,z) atan(2*pi*A/L*(1-abs(z)/h)*cos(2*pi*x/L));
m =   @(x,z) cos(PHI(x,z));
n =   @(x,z) sin(PHI(x,z));

T =   @(x,z) [m(x,z).^2         0       n(x,z).^2       0           2.*m(x,z).*n(x,z)       0
              0                 1       0               0           0                       0
              n(x,z).^2         0       m(x,z).^2       0          -2.*m(x,z).*n(x,z)       0
              0                 0       0               m(x,z)      0                      -n(x,z)
             -m(x,z).*n(x,z)    0       m(x,z).*n(x,z)  0           m(x,z).^2-n(x,z).^2     0
              0                 0       0               n(x,z)      0                       m(x,z)];

 R = [1  0  0  0  0  0
      0  1  0  0  0  0
      0  0  1  0  0  0
      0  0  0  2  0  0
      0  0  0  0  2  0
      0  0  0  0  0  2];

S_trans = @(x,z) R/T(x,z)/R*S*T(x,z);

S_eff = zeros(6);

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


Und in der Schleife für das Doppelintegral vom Array habe ich jetzt das erwähnte Problem, dass ich auf die einzelnen Elemente zugreifen können müsste.

Wie genau meinst du das mit zwei aufeinanderfolgenden Befehlen?

Vielen Dank für deine Hilfe nochmal!
Gruß,
Phil.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 19:05     Titel:
  Antworten mit Zitat      
Hallo,

es geht doch letztlich um die Auswertung.

Wenn du also a(4) an der Stelle 3 haben möchtest, kannst du das so machen:
Code:
a = @(x) [1 2 3.*x 4.*x]
a3 = a(3)
a3(4)


Ich fände es allerdings deutlich einfacher, wenn du die Berechnung von PHI, T, und S_trans in Funktionen auslagerst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 19:16     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

Code:
a = @(x,z) [x x.^2 x.*z];


ein Doppelintegral berechnen?

Danke malwieder für deine Hilfe Harald!
Gruß,
Phil.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 19:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
allerdings läuft es ja dann auch darauf hinaus, dass ich eine anonymous function S_trans(x,z) in Form einer 6x6 Matrix bekomme
.

Nein, nicht zwangsläufig. Da du ohnehin immer nur ein Element der Matrix brauchst, könntest du die Funktion auch als
Code:
function wert = S_trans(x,z, x_idx, y_idx)

definieren, wobei die letzten beiden Argumente das zu berechnende Element der Matrix angeben. Als Function Handle kannst du dann
Code:
@(x, z) S_trans(x, z, i, j)

angeben, wobei i und j die Indizes deiner Schleife sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 19:44     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Geduld und Mühe, ich befürchte ich bin etwas zu unbedarft Embarassed

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

Code:
S_trans = @(x,z) R/T(x,z)/R*S*T(x,z);


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 19:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ich soll in der ausgelagerten Funktion dann immer jeweils nur ein Element der Matrix berechnen, ohne die gesamte Matrix zu bestimmen?


Das wäre optimal. Vermutlich wird es aber darauf hinauslaufen, dass du die gesamte Matrix bestimmst und dann das Element herausholst, das du brauchst.

Eine Alternative wäre, sich eine Art Wertetabelle zu bauen und dann mit geschachtelten Aufrufen von trapz zu arbeiten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 20:10     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 Sad

Sofern du mir weiter beistehen möchtest, die Funktion sieht jetzt folgendermaßen aus

Code:
function [S_trans_ij]...
= function_hsiao_daniel_S_trans( E_1, E_2, E_3, G_12, G_13, G_23, v_12, v_13, v_23, AL, x, z, i, j)

%default input:     169, 9, 9, 6.5, 6.5, 3.1, 0.31, 0.31, 0.45, 1.19/27.9

%compliances

S11 =  1 / E_1;
S12 = -v_12 / E_1;
S13 = -v_13 / E_1;
S22 =  1 / E_2;
S23 = -v_23 / E_2;
S33 =  1 / E_3;
S44 =  1 / G_23;
S55 =  1 / G_13;
S66 =  1 / G_12;
 
 
%compliance matrix

S = [S11 S12 S13 0   0   0
     S12 S22 S23 0   0   0
     S13 S23 S33 0   0   0
     0   0   0   S44 0   0
     0   0   0   0   S55 0
     0   0   0   0   0   S66];


%transformed compliance matrix

h = 1;
L = 1;
A = AL;
x_2 = L;
x_1 = 0;

PHI = atan(2*pi*A/L*(1-abs(z)/h)*cos(2*pi.*x/L));
m =   cos(PHI);
n =   sin(PHI);

T = [m.^2   0   n.^2   0   2.*m.*n     0
     0     1   0     0   0         0
     n.^2   0   m.^2   0  -2.*m.*n     0
     0     0   0     m   0        -n
    -m.*n   0   m.*n   0   m.^2-n.^2   0
     0     0   0     n   0         m];

 R = [1  0  0  0  0  0
      0  1  0  0  0  0
      0  0  1  0  0  0
      0  0  0  2  0  0
      0  0  0  0  2  0
      0  0  0  0  0  2];

S_trans = R/T/R*S*T;

S_trans_ij = S_trans(i,j);

end


und mit
Code:
test = @(x,z) function_hsiao_daniel_S_trans(169, 9, 9, 6.5, 6.5, 3.1, 0.31, 0.31, 0.45, 1.19/27.9, x, z, 1, 1)

komme ich jetzt letztendlich an ein Element der Matrix ran.
Aber wenn ich nun versuche das Integral
Code:
integral2(test,0,1,0,1)

zu bestimmen, bekomme ich die Fehlermeldung
Code:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.

Error in function_hsiao_daniel_S_trans (line 44)
T = [m.^2   0   n.^2   0   2.*m.*n     0

Error in
@(x,z)function_hsiao_daniel_S_trans(169,9,9,6.5,6.5,3.1,0.31,0.31,0.45,1.19/27.9,x,z,1,1)


Error in integral2Calc>integral2t/tensor (line 229)
        Z = FUN(X,Y);  NFE = NFE + 1;

Error in integral2Calc>integral2t (line 56)
[Qsub,esub] = tensor(thetaL,thetaR,phiB,phiT);

Error in integral2Calc (line 10)
    [q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct);

Error in integral2 (line 107)
    Q = integral2Calc(fun,xmin,xmax,yminfun,ymaxfun,opstruct);


irgendeine Idee was da nun schiefläuft?

Riesen Dankeschön nochmal!!
Grüße,
Phil.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 20:58     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 10.03.2013, 21:39     Titel:
  Antworten mit Zitat      
Hallo Harald!

also so langsam blick ich garnichtmehr durch Sad

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!

Grüße,
Philipp.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.03.2013, 22:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.
Code:
S_trans_ij = zeros(size(x));

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil254
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 31.01.13
Wohnort: München
Version: 2012b
     Beitrag Verfasst am: 11.03.2013, 13:49     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 Smile

Grüße,
Philipp.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.