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

FOR SCHLEIFE Daten in Workspace speichern

 

student944
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2014, 20:26     Titel: FOR SCHLEIFE Daten in Workspace speichern
  Antworten mit Zitat      
Hallo zusammen,

ich möchte mein Programmcode mit einer For-Schleife kürzen.
Mit U wird ein Berechnungsparameter im Simulinkmodell verändert.
sim(Modell) startet mein Modell, welches mit simout eine Matrix in meinem Workspace speichert. Ich nenne diese eine Spalte die ich im Workspace gespeichert haben will zb Spalte1. Somit wird diese beim nächsten Programm durchlauf nicht überschrieben.

Bisher:

Code:
U=1;
sim('Modell')
Spalte1=simout.Data;

U=2;
sim('Modell')
Spalte2=simout.Data;

U=3;
sim('Modell')
Spalte3=simout.Data;


Nun schreibe ich eine For-Schleife.
Code:

x=[1 2 3];
for i=1:length(x)
     U=i;
     sim('Modell');

     ?????????????
end


Weiss jemand wie ich die unterschiedlichen Spalten im Workspace abspeichern kann ohne dass die beim erneuten Simulationsdurchlauf überschrieben werden? Ist mein Ansatz für die For-Schleife richtig?
Danke schonmal im voraus!

[EDITED, Jan, Bitte Code-Umgebung benutzen - Danke!]
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: 23.08.2014, 22:15     Titel: Re: FOR SCHLEIFE Daten in Workspace speichern
  Antworten mit Zitat      
Hallo student944,

Code:

x=[1 2 3];
Result = zeros(1, length(x));   % Pre-allocation
for k = 1:length(x)
     U = k;
     sim('Modell');
     Result(:, k) = simout.Data;
end

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2014, 23:35     Titel:
  Antworten mit Zitat      
Hallo Jan, danke für deine Antwort.
verstehe ich das richtig?
ich erstelle zuerst mit dem Result eine Zeile mit 3 Nullern --> [0 0 0]
nach dem ersten Durchlauf füllt er die erste Spalte mit den Werten aus dem simout. Nach dem zweiten Durchlauf die zweite Spalte usw...

simout ist bei mir eine 1x1 double timeseries. In der erste Spalte steht die Zeit. In der Zweiten die relevanten Werte.
Mit simout.Data nehme ich mir nur die relevanten Werte.

Dann sollte am Ende eine Matrix dabei rauskommen mit 3 Spalten und dementsprechend vielen Zeilen (je nach dem wieviele Werte bei im simout.Data stehen)?

funktioniert bei mir irgendwie nicht.
also dies ist mein eigentlicher code:
Code:

U=[25 50 75 100 150 200];
X = zeros(1, length(U));
Y = zeros(1, length(U));
for i=1:length(U)
    T=60/i;
    freq=1/T;
    sim('VDA_Kennung1');
    Y(:,i)=Daempferkraft1.Data;
    X(:,i)=input1.Data;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
student944
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2014, 23:38     Titel:
  Antworten mit Zitat      
Error in VDA_Kennung_loop (line 26)
Y(:,i)=Daempferkraft1.Data;
Private Nachricht senden Benutzer-Profile anzeigen
 
felix
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 16.01.14
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 24.08.2014, 12:01     Titel:
  Antworten mit Zitat      
Hallo Student,
Hier eine Möglichkeit:

Code:

x = [ 1 2 3];
for i = x
    U = i
    sim('Modell')
    eval(['Spalte' num2str(i) '=simout.Data;']);
end
 


Schöne Grüße,
Felix
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.08.2014, 12:20     Titel:
  Antworten mit Zitat      
Hallo,

eval ist sehr fehleranfällig und schwierig zu debuggen (siehe diverse andere Threads dazu), ich würde es also nicht verwenden. Stattdessen beispielsweise als Cell Array:

Code:
x = [ 1 2 3];
for i = x
    U = i
    sim('Modell')
    Spalte{i} =simout.Data;
end


Zum Kommentar von gestern, 23:38: der entscheidende Teil, nämlich die Fehlermeldung an sich, fehlt leider.

Grüße,
Harald
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: 24.08.2014, 13:32     Titel:
  Antworten mit Zitat      
Hallo student944,

Wie Harald schon sagte: Die eigentliche Fehelrmeldung wäre wichtig um herauszufinden, wo das Problem ist.

Zitat:
ich erstelle zuerst mit dem Result eine Zeile mit 3 Nullern --> [0 0 0]
nach dem ersten Durchlauf füllt er die erste Spalte mit den Werten aus dem simout. Nach dem zweiten Durchlauf die zweite Spalte usw...

Stimmt. Noch einen Tick besser wäre es, statt ZEROS(1,n) gleich die Ausgabe mit der richtigen Anzahl von Zeilen zu definieren. Da die aber eventuell noch nicht bekannt ist, ist die richtige Anzahl von Spalten schon mal ein fairer Ansatz für die "pre-allocation".

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 28.07.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2014, 16:43     Titel:
  Antworten mit Zitat      
Hallo also das mit "eval..." hat bei mir super funktioniert. vielen dank dafür.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.08.2014, 16:49     Titel:
  Antworten mit Zitat      
Hallo,

wenn der eval-Ansatz funktioniert, dann sollte auch der Ansatz mit Cell Arrays funktionieren.

Ich würde eval, evalin und assignin vermeiden, wenn es irgendwie geht; siehe diverse Beiträge dazu und u.a.
http://blogs.mathworks.com/loren/2005/12/28/evading-eval/

Grüße,
Harald
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.