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

Benötige Hilfe bei Funktionen und ihre Aufrufe

 

pooz
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2011, 11:41     Titel: Benötige Hilfe bei Funktionen und ihre Aufrufe
  Antworten mit Zitat      
Hallo,

ich benötige Hilfe beim Strukturieren von Funktion / Skripten.

Ich habe eine Funktion geschrieben, die am Anfang eine Initialisierung macht (einige Variablen setzt und alloziieren) und danach einen Algorithmus abarbeitet.
Nun möchte ich um den Algorithmus eine Schleife machen, aber die Initialisierung einmal ausführen.
Jedoch soll nun von außen diese Initialisierung aufgerufen werden und ebenso soll die Schleife des Algorithmus von außen ablaufen.

Wie kann ich das machen?

Über jede Hilfe wäre ich sehr dankbar.
Gruß

Pseudo-Code:
Code:

% myFunc.m
% =======
y = myFunc (x)

% init
a = 100;
v = zeros(a,1);

% algo
% do something with x and v

y = mean(v);
 


Code:

% myFramework.m
% ===========

myVec = rand(100,1);
xblock = reshape(myVec, [20 5]);
y = zeros(5,1);

myFunc.init % Einmaliger Initialisierungsaufruf

for i=1:5
  y(i) =  myFunc.algo(xblock);
end

 
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 05.12.2011, 12:13     Titel:
  Antworten mit Zitat      
Moin,

spontan hast du zwei Möglichkeiten:

  1. Du machst zwei Funktionen draus und rufst beide separat auf:
    Code:
    % myFuncInit.m
    % =======
    [init] = myFuncInit

    % init
    init.a = 100;
    init.v = zeros(a,1);

    Code:

    % myFuncAlgo.m
    % =======
    y = myFuncAlgo(x,init)

    % algo
    % do something with x and v

    y = mean(init.v);

    Code:
    % myFramework.m
    % ===========

    myVec = rand(100,1);
    xblock = reshape(myVec, [20 5]);
    y = zeros(5,1);

    init = myFuncInit; % Einmaliger Initialisierungsaufruf

    for i=1:5
      y(i) =  myFuncAlgo(xblock,init);
    end

    oder
  2. du packst den Algorithmus gleich in eine Schleife und übergibst mit dem Funktionsaufruf noch die Anzahl der Durchläufe (allerdings werden dann evtl. immer die Ergebnisse des letzten Laufes für den nächsten verwendet - je nachdem was du haben willst...):
    Code:
    % myFunc.m
    % =======
    y = myFunc (x,y)

    % init
    a = 100;
    v = zeros(a,1);

    % algo
    % do something with x and v

    for k=1:length(y)
        y(i) = mean(v);
    end

    Code:
    % myFramework.m
    % ===========

    myVec = rand(100,1);
    xblock = reshape(myVec, [20 5]);
    y = zeros(5,1);

    y = myFunc(xblock,y);

    Diese Lösung finde ich persönlich aber weniger elegant - kommt halt darauf an, was genau dein Ziel ist...


Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2011, 12:27     Titel:
  Antworten mit Zitat      
Moin Alex,

vielen Dank.

zu 1)
Verstehe ich das richtig, dass 'Init' dann alle meine initialisierten Variablen enthält und die Algorithmusfunktion diese nur deshalb sehen kann, weil diese übergeben werden?
Falls ja: Ist 'Init' dann eine Struktur? Ich wollte ungern den Algo-Code aufblähen, indem ich immer den Strukturnamen mit anschließendem Dereferenzierungspunkt vor jede Varible schreib Sad Das wird deutlich unleserlicher.

zu 2)
Ich wollte der Algo-Funktion die Daten immer nur Portionsweise übergeben, da der Ursprungsvektor äußerst riesig sein kann --> RAM-Probleme Smile
(Zur Info: Der Ursprungsvektor wird außerhalb von MATLAB in Blöcke unterteil und anschließend an MATLAB übergeben. Ich steuer das aus MS Visual Studio in C++ an.)
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.029
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2024a
     Beitrag Verfasst am: 05.12.2011, 12:33     Titel:
  Antworten mit Zitat      
Moin,

zu 1.)
Ja, das ist richtig.
Wenn du den Code nicht aufblähen willst dann kannst du zu Beginn der Funktion, die einzelnen Variablen auch wieder zurückschreiben:
Code:
% myFuncAlgo.m
% =======
y = myFuncAlgo(x,init)
a = init.a;
v = init.v;
% algo
% do something with x and v

y = mean(v);


zu 2.)
Ich verstehe. Dann solltest du evtl. zur ersten Methode greifen - ich denke, die ist dann am sinnvollsten - auch was die "Pflege" angeht.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2011, 12:40     Titel:
  Antworten mit Zitat      
Gibt es nicht noch eine Möglichkeit, das wie eine Klasse zu behandeln? Ich habe mal MATLABs OO-Programmierung angeschaut, das wäre das was gut passen würde. Allerdings: Auf die initialisierten Variablen in der Init-Funktion (mit dem schönen Namen 'Properties') müsste ich dann auch über den Dereferenzierungsopertor zugreifen. ==> Bläh.
Aber genau dieser Punkt wundert mich, denn: Das wären doch sozusagen "Membervariablen", welche die Klasse von Natur aus sehen kann? (Jedenfalls in C++ ist das so)
EDIT Hatte hier mal vorsichtig nachgefragt Smile http://www.gomatlab.de/viewtopic,p,81329.html#81329


Oder Alternativ: Gibt es da was mit Nested- oder Subfunctions? Irgendwelche Scope-Tricks?

Besten Dank für deine Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2011, 13:54     Titel:
  Antworten mit Zitat      
Gibt es weitere Gedanken, die helfen könnten?

Danke und Gruß
po²z
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.