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

function handle einer Summe

 

Fredo
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2014, 17:34     Titel: function handle einer Summe
  Antworten mit Zitat      
Hallo Leute,
ich bin mit function handle noch nicht wirklich vertraut und habe diesbezüglich noch immense Schwierigkeiten.

Ich möchte der Funktion einen n-dimensionalen Vektor X übergeben können. Dieser soll in 3-dimensionale Vektoren zerlegt und anschließend die Summe der Abstände zwischen benachbarten Vektoren berechnet werden.

Also:
f=@(X) norm(X(1:3)-X(4:6)) + norm(X(4:6)-X(7:9)) + ... + norm(X(end-5:end-3)-X(end-2:end))

Wie kann ich die obige Funktion einfach MATLAB übergeben ohne die Summe explizit auszuschreiben (schließlich kann n in meinen Betrachtungen sehr groß werden)?
Eine for schleife innerhalb der Funktion wäre toll, geht aber bekanntlich ja nicht :/

Danke!
Fredo
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: 30.03.2014, 19:19     Titel:
  Antworten mit Zitat      
Hallo,

zunächst mal: wenn die Funktion zu kompliziert wird, dann würde ich weg vom anonymen Function Handle zur separaten Funktion gehen.

Wenn sichergestellt, dass die Länge des Vektors immer durch 3 teilbar ist, dann sollte hier etwas folgender ARt gehen:

Code:
f = @(X) sum(sum( ( diff(reshape(X, [], 3), [], 2) ).^2 ))


Für die Lesbarkeit ist es aber wohl einfacher, das auf mehrere Zeilen aufzuteilen :)

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2014, 19:49     Titel:
  Antworten mit Zitat      
Danke Harald,
ich habe es mittlerweile ein wenig anders gelöst (aber vom Prinzip her gleich):

Code:
f = @(X) sum(sqrt(sum((diff(reshape(X,3,[])').^2),2)))


Also für mich als Laien scheint dieser Weg doch arg kompliziert zu sein. Vor allem, wenn ich bedenke, dass meine eigentliche Funktion noch viel komplizierter aussieht.

Kannst du - oder jemand anders hier im Forum - sagen wie ich das mit "separaten" Funktionen in den Griff kriegen kann?

Ich will mal meine Funktion rein mathematisch formulieren:
 \begin{equation*}
<br />
f(x_0,\dots,x_k)=\sum_{i=0}^{k-1} \left[ || x_i - x_{i+1} || - R \cdot  \tan \left( \frac{1}{2} \arccos \left( - \frac{(x_i - x_{i-1}) \cdot (x_i-x_{i+1})}{|| x_i - x_{i-1} || \; ||x_i-x_{i+1} ||} \right) \right) \right]
<br />
\end{equation*}
<br />

Dieses Biest hat in meinen Untersuchungen so viele Summanden, dass ich das nicht einfach mal stur runtertippen kann und die Indizes anpasse.

Ich bin für jeden Tipp dankbar!!!

Fredo
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: 30.03.2014, 20:11     Titel:
  Antworten mit Zitat      
Hallo,

sind die x_i dabei Skalare oder auch Vektoren mit 3 Elementen?
Falls letzteres: in welcher Form soll das an die Funktion übergeben werden? Als Vektor mit 3*n Elementen?

Im Zweifelsfall lässt sich so etwas mit Hilfe einer for-Schleife erledigen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2014, 20:23     Titel:
  Antworten mit Zitat      
Japp, genau letzteres ist der Fall. Übergeben werden soll der Vektor X mit 3k Elementen:

x_i \in \mathbb{R}^3, \quad i \in \{0,\dots, k\}, \quad X \in \mathbb{R}^{3k}

Ja, mit for schlefe wäre es mir am liebsten. Allerdings verweigert MATLAB mir den Dienst wenn ich darin function handles benutzen möchte.

Wie würdest du das mit der for-Schleife anpacken?
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: 30.03.2014, 21:23     Titel:
  Antworten mit Zitat      
Hallo,

die Idee wäre ja auch nicht, innerhalb der Schleife Function Handles zu verwenden, sondern eine Funktion
Code:

zu erstellen, in der (mit einer for-Schleife und ohne Function Handles) f berechnet wird, und dann mit
Code:
f = @myfun

auf diese Funktion zu verweisen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2014, 09:10     Titel:
  Antworten mit Zitat      
au weia Very Happy

Ja jetzt ist es mir klar! Vielen Dank! Funktioniert.

Grüße
Fredo
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.