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

Input-Argmumente als String übergeben

 

psigh
Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 12:09     Titel: Input-Argmumente als String übergeben
  Antworten mit Zitat      
Hallo,

ich habe eine Funktion, die des öfteren in meinem Programm aufgerufen wird. Die Input-Argumente würde ich gerne nicht überall neu angeben müssen sondern nur einmal am Anfang als String angeben.
Statt diesem:

Code:

%Handle
modul=@(a,b,c) fun(a,b,c);
 


würde ich gern so etwas machen:


Code:

var={'a','b','c'};
%--------------------------------------------------------------------------
%Handle
modul=@(var) fun(var);
 



Dann sagt er aber immer: Too many Input Arguments.

Für einen Tip wäre ich sehr dankbar.


Dominik
Private Nachricht senden Benutzer-Profile anzeigen


dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 13:03     Titel:
  Antworten mit Zitat      
Code:
modul=@() fun('a','b','c');


In der Klammer direkt nach dem @ stehen die verbleibenden Parameter, da du alle Konstant setzt gibt es keine.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 14:43     Titel:
  Antworten mit Zitat      
Das funktioniert bei mir nicht, was auch daher kommen kann, weil ich mich nicht vernünftig ausgedrückt habe. generell meine ich:

Eine Funktion braucht bsp. die Eingabeparameter A und B. Diese werden vom Benutzer angegeben, im Programmkopf, sagen wir mal. An der Stelle, o besagt Funktion aufgerufen wird, irgendwo im Programm, möchte ich aber nicht [Ergebniss]=fun(A,B) schreiben.

Sondern der Benutzer soll im Programmkopf die Parameter einmal als String angeben: var=('A','B'). Dann kann ich im Programm einfach [Ergebniss]=fun(var) schreiben. Das möchte ich deswegen machen, weil der Benutzer seine Inputvariablen ja auch C und D nennen könnte.

Vielen Dank


Dominik
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.11.2012, 14:46     Titel:
  Antworten mit Zitat      
Hallo da musst erstmals den Kopf als String erstellen und dann über STR2FUNC nutzen um Funktionshandle zu erzeugen.

Code:

vars={'a,b,c'};
varsstr = sprintf('%s,',vars{:});
varsstr = varsstr(1:end-1);
modul= str2func(sprintf('@(%s) fun(%s)',varsstr ,varsstr));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 15:31     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort. Was Handles angeht, bin ich noch totaler Neuling. Es sieht jetzt alles ziemlich gut aus. Ich weiß nur nicht, wie ich die Outputs jetzt wieder aus der Funktion heraus bekomme.

Mit [Ergbnis]=modul(vars) geht es auf jeden Fall nicht. Da sagt er : Too many Output Arguments.

Dominik
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.11.2012, 16:35     Titel:
  Antworten mit Zitat      
Hallo

Dazu muss die Funktion aber definiert sein. Also
z.B wenn ich z.B hier eine ADDIERE Funktionskopf schreibe
Code:

vars={'a,b,c'};
varsstr = sprintf('%s,',vars{:});
varsstr = varsstr(1:end-1);
modul= str2func(sprintf('@(%s)addiere(%s)',varsstr ,varsstr));
 


dann muss diese Funktion auch als solche in File, wo das Handle erzeugt wird oder als getrennte Datei definiert sein.
z.B speichere diese Funktion als File addiere.m
Code:

function erg = addiere(a,b,c)
erg = a+b+c;
end
 


dann kann man auch aufrufen
Code:

res= modul(1,2,3)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 16:47     Titel:
  Antworten mit Zitat      
Das wundert mich ja. Vielleicht habe ich da ein Brett vor dem Kopf. Ich schreibe mal auf, was ich habe.

Die "addiere Funktion" lautet in meinem Fall:

Code:

[A,H,omega]=arma_univ_ssf(ar_lag,ma_lag,phi)
 


Für diese Funktion wollte ich ein Handle und ich möchte die Inputs als String einfügen. Meine erste Version sah so aus:

Code:

%Handle für eigenes Modul
modul=@(ar_lag,ma_lag,phi)arma_univ_ssf(ar_lag,ma_lag,phi);
 


Das kann so aufgerufen werden:

Code:

[A,H,omega]=modul(ar_lag,ma_lag,phi)
 


Klappt also, und A,H,omega werden ausgegeben. Das bringt mir ja aber nichts, weil ich ja die Inputs als String haben wollte.

Bei Deiner Version schreibe ich:

Code:

vars={'ar_lag,ma_lag,phi'};
varsstr = sprintf('%s,',vars{:});
varsstr = varsstr(1:end-1);
modul= str2func(sprintf('@(%s) arma_univ_ssf(%s)',varsstr ,varsstr));

[A,H,omega]=modul(vars)
 


Und das klappt eben nicht, was ich nicht richtig verstehe. Denn wenn ich debugge und mit dem Cursor auf das Wort "modul" gehe erscheint:

@(ar_lag,ma_lag,phi)arma_univ_ssf(ar_lag,ma_lag,phi)

Genau wie bei meiner ersten Version. Also genau, was ich brauche. Dann müsste doch auch

Code:

[A,H,omega]=modul(vars)
 


klappen.


Dominik
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.11.2012, 18:56     Titel:
  Antworten mit Zitat      
Hallo

da haben wir aneinander vorbei geredet. Bei diesem Konstrukt musst schon die Werte übergeben, keine Namen der Varaiblen:
so:
Code:
ar_lag=1
ma_lag=2
phi=90
modul(ar_lag,ma_lag,phi)



Also suchst du wohl eine Art EVAL -Konstrukts
Funktion als String definieren dann mit EVAL auswerten.

Code:

vars={'a,b,c'};
a=1;
b=2;
c=3;
varsstr = sprintf('%s,',vars{:});
varsstr = varsstr(1:end-1);
modul  = sprintf('addiere(%s)',varsstr );
res       = eval(modul)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 21:04     Titel:
  Antworten mit Zitat      
Super, klappt alles. Vielen Dank für die ganze Mühe!

Dominik
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.