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

Variablen erneuern

 

AnnePanne

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2008, 17:28     Titel: Variablen erneuern
  Antworten mit Zitat      
Hallo,
meine Frage ist möglicherweise ganz simpel zu beantworten, aber google kanns nicht...
Also: Ich möchte eine Monte-Carlo-Simulation eines Simulink Modells machen. Implementiert habe ich das durch immer erneutes Starten des Modells mit dem Befehl sim (for-Schleife). Die Daten, die über den to-workspace-block zurückgegeben werden, liegen in einem struct, und werden während der Laufzeit gleich weiterverarbeitet - ich muss also permanent drauf zugreifen.
Mein skript soll nun aber nur ganz oben explizit Usereingaben verlangen, d.h. im Programmtext selbst soll nichts variables mehr stehen.
Ich weise also (innerhalb des user-inputs) einer Variablen "vektor" den Datenvektor zu, der im struct steht, auf den ich zugreifen will (in meinem Fall also: vektor=weite.signals.values falls das wichtig ist).
Wenn ich jetzt aber innerhalb meiner simulations-for-schleife auf vektor(i) zugreife erhalte ich (natürlich) immer den Wert, den er ganz am Anfang hatte. Denn selbst wenn die Simulation den Vektor "weite.signals.values" neu gefüllt hat, gilt das ja für den Vektor "vektor" noch nicht.

Meine Frage also: Gibt es irgendeinen Befehl in Matlab, der das erneuern der Variable "vektor" ermöglicht (ohne das diese Gespeichert im Workspace liegt, sie ist temporär...)? Ich will dabei nicht auf den Namen im Struct zugreifen müssen.

Danke schonmal,
Matlab-Newbee AnnePanne


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 15.10.2008, 19:13     Titel:
  Antworten mit Zitat      
Hallo AnnePanne,

wahrscheinlich habe ich Deinen Funktionsablauf noch nicht richtig verstanden. Ich skizziere mal den Ablauf, wie ich ihn verstanden habe:

Code:
% User-Eingaben
...
vektor=weite.signals.values;

for k = 1:n
    sim ...        % hier wird weite aktualisiert
    ...
    % hier wird der aktuelle vektor gebraucht
end


Mein (wohl zu simpler) Vorschlag wäre, die Zeile

Code:
vektor = weite.signals.values;


nach der Simulation zu wiederholen.

Beschreib doch mal genauer, welche Variabeln du wann und wo hast und brauchst. Und was genau ist der "Name" im struct, auf den du nicht zugreifen willst (Beispiel)?

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
AnnePanne

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2008, 09:50     Titel: AW: Variablen erneuern - vielleicht mit Pointern?
  Antworten mit Zitat      
Hallo Bijick,
klar würde
Code:
vektor=weite.signals.values

die Variable Vektor erneuern. Aber dann kann ich auch gleich statt "vektor" eben weite.signals.values schreiben. Das will ich vermeiden, weil der name des to-workspace-blocks sich von mc-simulation zu mc-simulation verändern wird, und ich am code nichts mehr drehen will - eigentlich.
Alles was ich ändern will, bei neuen Blöcken ist der obere Teil des von dir gut interpretierten Codes:
Code:

% User-Eingaben
...
vektor=weite.signals.values;
 

oder eben zum Beispiel
Code:

% User-Eingaben
...
vektor=was_anderes.signals.values;
 

Fix bleiben soll dann der untere Teil
Code:

for k = 1:n
    sim ...        % hier wird weite aktualisiert
    ...
    % verarbeite Inhalt von "vektor"
end
 


Alles in allem ist es nicht überlebenswichtig. Die Simulation läuft mit genau deiner zusätzlichen Programmzeile - aber es ist einfach nicht schön. Irgendwie unsauber halt, weil nicht wiederverwertbar (oder nur sehr schlecht).
Alles was ich oben abfrage könnte ich zum Beispiel auch über einen Userdiaglog als Eingabe fordern - der Anwender soll es für seinen Zweck dann nutzen können, ohne den Programmtext angucken zu müssen.

Letztlich suche ich also was wie
Code:

was so aber nicht funktioniert. ;)
Hab grad ne Idee:
Grundsätzlich könnte man das mit Pointern lösen (wenn "vektor" nen Pointer wäre, wäre ja jede Aktualisierung der Inhalte transparent). Gibts das in Matlab? Wenn ja, wie baue ich einen und wie greife ich auf Inhalte zu? Wie in c?

Grüße
Anne

edit by steve: Ich hab die Formatierung mal verbessert ;)
 
AnnePanne

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2008, 09:52     Titel: schlecht formatiert
  Antworten mit Zitat      
Hi,
ich nochmal,
sorry für die schlechte Formatierung des Beitrags oben - ich arbeite dran... Smile
AnnePanne
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 16.10.2008, 10:53     Titel:
  Antworten mit Zitat      
Hallo AnnePanne,

vielleicht sind dann dynamische Feldnamen etwas für Dich. Die Struktur der Variablen müsste aber dafür etwas erweitert werden. Wenn ich Dich richtig verstehe, soll der Bestandteil 'weite' des Namens variabel sein, eventuell auch 'signals' und 'values'. Ganz ohne Veränderung des Codes geht es nicht, aber dafür wäre er dann allgemeingültig.

Dafür müsste man (in der Simulation) die struct-Variable 'weite' zu einem Feld eines neuen structs machen:

Code:
mein_struct.weite = weite;


Dann sieht der Ablauf so aus:

Code:
% User-Eingaben
...
sim_name = 'weite';

for k = 1:n
    sim ...        % Achtung: hier wird mein_struct.weite aktualisiert
    ...
    mein_struct.(sim_name).signals.values;
end


Wäre das machbar? Pointer sind glaub ich nicht vorgesehen. Eine Notlösung wäre immer noch eval. Damit kann man auch im Vorspann den Namen der Variable auswählen und dann unten ansprechen. Die dynamischen Feldnamen sind aber in jedem Fall sicherer.

Herzliche Grüße
Bijck
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
AnnePanne

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2008, 11:45     Titel: Variablen erneuern
  Antworten mit Zitat      
Hallo Bijick,
entweder hab ich dich nicht richtig verstanden, oder auch das löst mein Problem nicht. Verstehe ledier auch nicht richtig, was daran besser ist, als einfach "vektor" zu erneuern nach jeder Simulation (weil beides Eingreifen in den Programmtext bedeuted).
Eval tuts aber jetzt ganz gut. Ist sicher nicht elegant, aber zweckmäßig (und mein Betreuer sagt, ich soll meine Energie jetzt mal wieder in die Simulation selbst stecken ;)!
Vielen Dank also für deine Hilfe!
LG
AnnePanne
 
AnnePanne

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2008, 11:50     Titel: Systemzeit
  Antworten mit Zitat      
Achso: Wo wir uns grad so nett unterhalten:
Komme ich in Matlab und oder Simulink an die Systemzeit um den random number generator zu initialisieren?
Momentan löse ich das Problem, indem ich die Zählvariable der for-schleife übergebe - aber auch das produziert bei zwei skriptausführungen ja zweimal den gleichen output...
Danke!
AnnePanne
 
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 - 2024 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.