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

Mehrmaliger Funktionsaufruf

 

soad
Forum-Century

Forum-Century


Beiträge: 150
Anmeldedatum: 10.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2011, 11:32     Titel: Mehrmaliger Funktionsaufruf
  Antworten mit Zitat      
Hi,

ich habe einen Vektor und möchte nun pro Eintrag eine Funktion auswerten. Kann man dies in Matlab ohne for-Schleife realisieren? Gibt es da eventuell eine Funktion bzw. könnte man das mit function_handles umsetzen?

Also:
Code:
for i=1:length(bar)
    x = foo(bar(i));
end

ohne for?

mfg,
soad
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 18.10.2011, 11:54     Titel:
  Antworten mit Zitat      
Die Frage ist vielmehr, wieso du das ohne for-Schleife realisieren möchtest?! Mit arrayfun() lässt sich das beispielsweise vektorisieren, bei extrem vielen Funktionsaufrufen hilft es i.d.R. auch, die Funktion entsprechend darauf anzupassen. Mit dem Profiler erkennst du Schwachstellen im Code, die vermutlich garnicht auf die Schleife zurückzuführen sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.10.2011, 11:55     Titel:
  Antworten mit Zitat      
Hallo,

das hängt sehr stark von der aufgerufenen Funktion ab.
Wenn die Funktion das unterstützt, kannst du
Code:

schreiben, wobei ich bar als Variablenname vermeiden würde, da bar auch eine Funktion ist (zum Plotten von Balkendiagrammen).

Entscheidend ist wie gesagt, dass foo.m Vektoren als Eingabeargumente akzeptiert. Bei viele MATLAB-Funktionen ist das der Fall, z.B. sin, abs, sqrt.

Wenn das nicht der Fall ist, könnte man auch mit ARRAYFUN arbeiten; der Performance-Gewinn dürfte allerdings nicht so hoch sein, wie wenn man mit "echter" Vektorisierung arbeitet.

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

Forum-Century

Forum-Century


Beiträge: 150
Anmeldedatum: 10.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2011, 12:33     Titel:
  Antworten mit Zitat      
Ok, danke euch beiden!

Wie ich gelesen habe, sollte man doch eher for-Schleifen in Matlab vermeiden, oder? Als Vektor kann ich den Parameter nicht übergeben.

Ja, ARRAYFUN hatte ich gesucht, hierzu noch eine Frage:
Ist es hier möglich eine fixen und eine variablen Parameter zu übergeben. Also:

Code:

Parameter fix bleibt bei allen Aufrufen gleich, Parameter var ändert sich bei jedem Aufruf.

mfg,
soad
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.10.2011, 16:23     Titel:
  Antworten mit Zitat      
Hallo soad,

Die Information, dass FOR-Schleifen in Matlab vermieden werden sollten, stimmt -- für Matlab <= 6.1. Wenn Du eine modernere Version verwendest, sind FOR-Schleifen oft am effizientesten, wenn sie weniger temporären Speicher benötigen als die vektorisierten Methoden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.10.2011, 18:17     Titel:
  Antworten mit Zitat      
Hallo nochmal,

es wird sehr von der Art der Funktion abhängen.
In vielen Fällen wird es auch mit neueren MATLAB-Versionen so sein, dass Vektorisierung einen Performance-Gewinn von Faktor 10 oder mehr bringt. Insbesondere verschachtelte for-Schleifen sind oft ineffizient.
In anderen Fällen bringt Vektorisierung wenig bis gar keinen Performance-Gewinn und dafür dann sogar noch Speicherprobleme.
Pauschale Aussagen sind hier schlicht nicht möglich. Wenn ein Code-Teil sich als Bottleneck erweist, würde ich jedenfalls versuchen, ob Vektorisierung einen Performance-Gewinn ermöglicht.

Was die letzte Frage angeht:
Code:
fest = ... % feste Parameter werden definiert
arrayfun(@(vari) foo(vari, fest), variabel)


fest: fixe Parameter (fix ist eine Funktion und sollte nicht als Variablenname verwendet werden)
variabel: variable Parameter (var ist eine Funktion und sollte nicht als Variablenname verwendet werden)
vari: eine Dummy-Variable für die variablen Parameter
foo.m: eine Funktion, die zwei Eingabeargumente annimmt.

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

Forum-Century

Forum-Century


Beiträge: 150
Anmeldedatum: 10.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2011, 11:52     Titel:
  Antworten mit Zitat      
Super, herzlichen Dank euch beiden!
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.