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

Table-Lookup in M-File macht Schwierigkeiten

 

hurjoke
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2010, 10:10     Titel: Table-Lookup in M-File macht Schwierigkeiten
  Antworten mit Zitat      
Hallo,

bin neu hier im Forum.

Ich sitze zur Zeit an einer Studienarbeit, in der ich ein bestimmtes Matlab/Simulink Modell erstellen muss. Dort wird aus einer gegebenen, zeitl. variablen Größe ein Vektor errechnet der insgesamt vier Werte enthält. Das Berechnen dieser Werte ist sehr rechenaufwändig, so dass ich gerne eine Lookup-Tabelle erstellen möchte, in der bereits berechnete Werte gespeichert und abgerufen werden können.

Die Berechnung der Werte findet in einem Level-2-M-file Block statt. Hier möchte ich auch die Lookup-Tabelle implementieren.
Ich hab dies so realisiert, dass vor dem eigentlichen Berechnen zunächst in einer Matrix per try/catch der Vektor zum zugehörigen Eingangswert aufgerufen wird. Ist dieser in der Matrix nicht vorhanden, so gibt es eine exception und im catch-Block wird dann der Wert berechnet und anschließend an dieser Stelle in die Matrix geschrieben.
Alles schön und gut, funktioniert im Prinzip auch.
Das Problem ist nur, dass Simulink diesen Level-2-M-file Block ja immer wieder neu aufruft und mit jedem Aufruf die bereits gespeicherten Werte verworfen werden.

Meine Frage also: Wie kriege ich das hin, dass die Lookup-Matrix mit ihren gespeicherten Werten über die gesamte Simulationszeit erhalten bleibt?

Wäre super wenn mir da jemand helfen könnte, ich komme deswegen nämlich zur Zeit einfach nicht voran mit meiner Studienarbeit Sad
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 07.07.2010, 12:27     Titel:
  Antworten mit Zitat      
Ich würde zunächst gerne die Vorgehensweise verstehen. Üblicherweise werden Lookup-Tables mit den enstprechende Lookup-Table Blöcken implementiert. Falls eine MATLAB Variable vorher berechnet werden muss, kann man einen durchaus komplexen Code programmieren und als Simulin Modell Callback mit dem öffnen (vor dem simulieren) ausführen.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
hurjoke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2010, 13:01     Titel:
  Antworten mit Zitat      
Erstmal danke für deine Antwort!
Ich möchte ungern genau ins Detail gehen was das Modell betrifft, da könnte ich eventuell Ärger mit der Uni bekommen.
Vereinfacht gesagt habe ich ein Simulink-Modell mit einem Eingang X in Form einer Rampe oder auch einem Sinus. Dieses Signal geht dann in den Level-2-M-File Block und wird dort eingespeist.
Im Ausgangsfall wurde für jeden X-Wert mit der Funktion fgoalattain ein Vektor berechnet und dessen vier Werte auf Scopes ausgegeben. Da dies sehr rechenaufwändig ist, dachte ich nun jeden bereits berechneten Wert in eine Matrix zu schreiben, die bei jedem Aufruf des m-Files abgefragt wird, ob für den aktuellen X-Wert bereits der entsprechende Vektor berechnet wurde.

Ich schreibe mal exemplarisch den Code auf:

Code:

X=block.InputPort(1).Data(1);

%Berechnung eines Index für die Lookup-Matrix aus dem gegebenen %Wert X:

index = 1+round(10*X);

%Erstellen der Lookup-Matrix mit dem Anfangswert für X= 0

table(1, 1:4)= [ 0 0 0 0];

%Direkte Ausgabe des zugehörigen Vektors zu X aus der Lookup-Matrix.
%Wenn nicht vorhanden -> Exception -> weiter mit catch-Block:

try
    block.OutputPort(1).Data(1:4)= table(index,1:4);

catch

%<Berechnung des Vektors mit fgoalattain>

    table(index, 1:4) = berechneter_vektor;
    block.OutputPort(1).Data(1:4)= table(index,1:4);

end
 


Nach meinem Verständnis sollte beim nächsten Aufruf mit einem bereits "verarbeiteten" X ein entsprechender Vektor in der Matrix gefunden werden, wird er aber nicht, weil mit jedem neuen Aufruf des m-Files die Matrix wieder leer ist.

Mit den Lookup-Table Blöcken habe ich es auch schon versucht aber da steigt ich überhaupt nicht durch wie das funktioniert. Es muss doch eigentlich auch "von Hand" in einem m-File gehen oder nicht?
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.