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

M-Dateien ohne Funktionen

 

senmeis
Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.09.2012, 11:32     Titel: M-Dateien ohne Funktionen
  Antworten mit Zitat      
Hi,

M-Dateien unterscheiden sich zwischen mit Funktionen drin oder ohne Funktionen drin. Nun will man eine M-Datei ohne Funktionen drinnen schreiben, die aber einen Parameter annimmt. Ist das möglich?

Gruss
Senmeis
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 02.09.2012, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

also die Übergabe kann man dann duch INPUT-Befehl realisieren
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: 02.09.2012, 12:30     Titel: Re: M-Dateien ohne Funktionen
  Antworten mit Zitat      
Hallo senmeis,

Ein M-File, welches nicht mit "function" beginnt, heißt "Script". Möchtest Du ein Script schreiben, welches Argumente annimmt? Das wäre nicht möglich, denn genau dafür wurden ja die Funktionen eingeführt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
senmeis
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.09.2012, 13:40     Titel:
  Antworten mit Zitat      
Senmeis

Klar kann man eine Funktion schreiben. Das Problem ist nur, man möchte diesen Parameter als Variable im Workspace erhalten bleiben sogar nach dem Ausführen der Funktion und das klappt nicht. Man hat auch versucht, das Attribut "global" einzusetzen, geht ebenfalls nicht.

Gruss
Senmeis
Private Nachricht senden Benutzer-Profile anzeigen
 
Caravaggio
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 20.04.12
Wohnort: Braunschweig
Version: R2012a
     Beitrag Verfasst am: 02.09.2012, 14:19     Titel:
  Antworten mit Zitat      
Im Grundprinzip möchtest du

Code:
Variable = myfunction(Variable)


machen oder nicht??? Du hast eine Variable, sie wird an die Funktion übergeben und am Ende wieder als Variable gespeichert.

Alternativ kannst du ja deine Variable speichern und dann einfach durch

Code:


dein Skript durchlaufen lassen. Dort müssen allerdings die Variablennamen übereinstimmen, was bei einer Funktion ja nicht der Fall sein muss!
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: 03.09.2012, 10:46     Titel:
  Antworten mit Zitat      
Hallo senmeis,
Zitat:
... das klappt nicht. Man hat auch versucht, das Attribut "global" einzusetzen, geht ebenfalls nicht.

"Klappt nicht" und "geht nicht" sind nich geeignet, um in einem Forum den auftretenden Fehler zu erklären. Bitte poste zunächst den entsprechenden Code - am besten nur einen relevanten aber lauffähigen Ausschnitt. Dann poste die vollständige Fehlermeldung, falls eine auftritt, oder eine genau Beschreibung des Unterschiedes zwischen den Ergebnissen und den Erwartungen.

Je präziser die Frage, desto leichter ist die Antwort. Sobald man raten muss, was überhaupt das Problem ist, sind sinnvolle und effiziente Antworten unmöglich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
senmeis
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2012, 16:37     Titel:
  Antworten mit Zitat      
Hier poste ich den Code.
Code:

%=test.m
function my_func = test(number)
global x
x = number
 

Eigentlich will ich eine Variable x im Workspace haben, damit diese weiter verarbeitet werden kann, aber mit obigen Code ist das nicht der Fall. Ideen?

Gruss
Senmeis
Private Nachricht senden Benutzer-Profile anzeigen
 
Caravaggio
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 20.04.12
Wohnort: Braunschweig
Version: R2012a
     Beitrag Verfasst am: 05.09.2012, 16:45     Titel:
  Antworten mit Zitat      
Code:
%=test.m
function [my_func x]= test(number)
x= number


Aufruf mit

Code:
[my_func x] = test(number)


*edit* Ich hoffe in deiner Testfunktion wird my_func sinnvoll gefüllt Smile
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: 06.09.2012, 10:27     Titel:
  Antworten mit Zitat      
Hallo senmeis,

Globale Variablen müssen überall, wo sie benutzt werden, als GLOBAL definiert werden, also auch um Base-Workspace (also im Command Window).
Da globale Variablen ein Programm bis zur Undebugbarkeit unübersichtlich machen, wird von der Benutzung abgeraten. Man kann ab einer bestimmten Programm-Komplexität einfach nicht mehr zuverlässig feststellen, wo die Werte zu letzt geändert wurden.

Deshalb ist "function x = FuncName(x)" deutlich besser, und der zusätzliche Aufwand, im CommandWindow "x = FuncName(x)" schreiben zu müssen, statt "FuncName(x)", ist weit harmloser, als stunden- oder tagelange Versuche einen Code zu debuggen, der von GLOBALs durchsetzt ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
senmeis
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2012, 17:12     Titel:
  Antworten mit Zitat      
Leider funktioniert Dein Code bei mir nicht.
Code:

[my_func x] = test(16)
 

Fehlermeldung:
Zitat:
Output argument "my_func" (and maybe others) not assigned during call to “test”.


Senmeis
Private Nachricht senden Benutzer-Profile anzeigen
 
Caravaggio
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 20.04.12
Wohnort: Braunschweig
Version: R2012a
     Beitrag Verfasst am: 07.09.2012, 17:57     Titel:
  Antworten mit Zitat      
senmeis hat Folgendes geschrieben:
Leider funktioniert Dein Code bei mir nicht


Naja, ich ging davon aus, dass es sich um Pseudocode handelt...es ging nur um eine beispielhafte Darstellung...sonst macht deine test-Funktion kaum Sinn Wink bei deinem Beispiel müsstest du ja nur die Zeile

Code:


löschen und am Ende

Code:
my_func = number;


setzen...aber eigentlich sollte da MATLAB schon meckern, weil du ja den Rückgabewert nicht setzt. Hier mal ein lauffähiges Beispiel, dass den Wert verdoppelt und auch den Eingabewert zurückgibt (kann ja auch jede beliebiger Wert aus deiner Funktion sein).

Funktion (TwoTimes.m):

Code:
function [Output Input] = TwoTimes(Input)
Output = 2*Input;


Funktionsaufruf:
Code:
>> x = 2;
>> [x2 x] = TwoTimes(x)

x2 =

     4

x =

     2
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2012, 20:20     Titel:
  Antworten mit Zitat      
senmeis hat Folgendes geschrieben:

Eigentlich will ich eine Variable x im Workspace haben, damit diese weiter verarbeitet werden kann, aber mit obigen Code ist das nicht der Fall. Ideen?


Dokumentation bitte lesen http://www.mathworks.de/help/techdoc/ref/assignin.html
Private Nachricht senden Benutzer-Profile anzeigen
 
senmeis
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 14:59     Titel:
  Antworten mit Zitat      
Das m-File sieht nun so aus:
Code:

function [my_func x] = test(number)
my_func = number;
 

Mit dem Aufrufen
Code:

test(16)
 

bekommt man eine Variable
Code:

im Workspace, nicht
Code:

wie erwartet. Wie kann man den Variablenamen eindeutig bestimmen?

Gruss
Senmeis
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.09.2012, 21:41     Titel:
  Antworten mit Zitat      
Hallo senmeis,

Code:
function [x] = test(number)
x = number;

Dies ruft man dann so auf, um x einen Wert zuzuweisen:
Code:
x = test(16);

Das direkte Erzeugen einer Variablen in einem anderen WorkSpace, hier im WorkSpace der aufrufenden Funktion, ist ein schlechter Programmierstil. Sowie man dies mit 100 Variablen in 10 unterschiedlichen Funktionen macht, kann man beim besten Willen keinen Überblick mehr erlangen.
Deswegen sollte man solche magischen undurchsichtigen Fernwirkungen am besten von Anfang an vermeiden, obwohl es bei Programmen mit 2 oder 10 Zeilen noch praktisch erscheint.

Gruß, Jan

Zuletzt bearbeitet von Jan S am 19.09.2012, 09:50, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 19.09.2012, 00:39     Titel:
  Antworten mit Zitat      
Hallo senmeis,

du hast deine Funktion auch nicht korrekt aufgerufen. Wenn eine Funktion mehrere Werte zurückgibt, dann musst du diese auch "abgreifen". Ansonsten gehen diese verloren.

Beispiel ähnlich deiner Funktion:

Code:
function [ myFunc x ] = test( x )
    myFunc = 2 * x;
end

 


Rufe ich das ganze so auf:

Code:


erhalte ich als Ausgabe

Code:


Wie du schon gesagt hast: Was zu erwarten war! Aber wir wissen ja, dass die Funktion "test(...)" zwei Rückgabewerte liefern kann. Also versuchs mal mit dem Aufruf:

Code:
[a x] = test(16)


und voilà erhälst du folgende Ausgabe:

Code:
a =

    32


x =

    16

_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.