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

Teilstrukturen mit load(?) nachladen

 

christian_2
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2012, 15:03     Titel: Teilstrukturen mit load(?) nachladen
  Antworten mit Zitat      
Hallo zusammen,

ich arbeite hier mit einem Simulationsprogramm bei dem die Module mittels Strukturen bedatet werden.

Das Berechnen einer Teilstruktur ist z. T. sehr kompliziert, so dass dies mittels einzelner m-Dateien gemacht wird.

Beispiel:

Meine erste m-Datei erzeugt eine Struktur mit dem Namen:
Programm.Motor.xxx

und speichert nur diese Struktur in einer Datei 'Motordaten.mat' ab.


Meine zweite m-Datei erzeugt eine Struktur mit dem Namen:
Programm.Getriebe.xxx

und speichert nur diese Struktur in einer Datei 'Getriebe.mat' ab.


Auf diese Art bekomme ich z.B. 20 mat-Dateien. Jede Datei enthält einen Teil der Strukturvariablen 'Programm'.

Ich ging eigentlich davon aus, dass ich die 20 Dateien einfach nacheinander in den Workspace mittels des Befehls 'load' laden könnte, musste aber zu meinem Bedauern feststellen, dass Matlab bei Strukturvariablen anscheinend nur die oberste Hierarchie der Variablen bzgl des Names vergleicht. So denkt Matlab wohl, dass es den Variablennamen schon gibt und überschreibt diesen komplett.

Weiß jemand, wie ich meine mat-Dateien 'mergen' kann?

Vielen Dank schon mal für jede Antwort im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.04.2012, 17:19     Titel:
  Antworten mit Zitat      
Hallo
mache doch einen Umweg,
lade nicht direkt die Variablen sondern indirekt:

Code:

% z.B du hattest zuvor schon Motordaten geladen
% dann muss Getriebedaten so laden:
% Motordaten sichern
tmp.Programm = Programm;
% Getriebe in Variable speichern
X=load('Getriebe.mat')
% verknüpfen
tmp = [tmp,X];
Programm = tmp;
 


Das kannst du dann dir eine Funktion daraus machen

Code:

function structvar = nachladen(filename,structvar)
tmp.structvar= structvar;
X=load(filename)
tmp = [tmp,X];
structvar = tmp;
 


PS: sinnvoller wäre vielleicht nicht das Programm rauszuschreiben sondern, Variablen Motor und Getriebe usw.
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2012, 17:42     Titel:
  Antworten mit Zitat      
Hallo und vielen Dank für Deine Antwort!

Leider war das nicht das, was ich benötige. Nochmal ein konkreteres Beispiel:

% In 1. Datei 'Motor.mat' ist gespeichert:
Programm.Motor.Leistung_max = 100;
Programm.Motor.Hubraum = 2000;

% In 2. Datei 'Getriebe.mat' ist gespeichert:
Programm.Getriebe.Gaenge_Anzahl = 5;
Programm.Getriebe.Masse = 100;


Erhalten möchte ich folgende Strukturvariable:
Code:

clear all;
Programm.Motor.Leistung_max = 100;
Programm.Motor.Hubraum      = 2000;
Programm.Getriebe.Gaenge_Anzahl = 5;
Programm.Getriebe.Masse         = 100;
 





Wenn ich Dein m-File ausführe, erhalte ich eine zweidimensionale Struktur.
Code:

clear all

load ('Motor.mat')


% z.B du hattest zuvor schon Motordaten geladen
% dann muss Getriebedaten so laden:
% Motordaten sichern
tmp.Programm = Programm;
% Getriebe in Variable speichern
X = load ('Getriebe.mat')
% verknüpfen
tmp = [tmp,X];
Programm = tmp;
 



Deine Idee mit dem Zwischenspeichern ist auf jeden Fall ein guter Anfang. Aber wie bekomme ich die zwei Variablen in einer Struktur 'vereint'?
Kannst Du mir noch einmal helfen?

Viele Grüße
Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.04.2012, 18:23     Titel:
  Antworten mit Zitat      
Okay dann ist wohl nicht so einfach als ich mir zuerst dachte

so:
Code:

clear all
load ('Motor.mat')
% Getriebe in Variable speichern
X = load ('Getriebe.mat')
fnames = fieldnames(X.Programm)
for k=1:length(fnames)
  Programm.(fnames{k})=X.Programm.(fnames{k});
end
 


Besser wenn du daraus eine Funktion machst
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.04.2012, 18:52     Titel:
  Antworten mit Zitat      
Hallo noch mal

durch so eine Funktion kannst du deine Aufrufe vereinfachen, speichere diese unter "nachladen.m"
Aufruf wäre:
Code:

nachladen('Motor.mat')
nachladen('Getriebe.mat')
 


Funktion:
Code:

function nachladen(Datei)
vars      = whos('-file',Datei);
externvar = [];
for k=1:length(vars)
   varsexist   = evalin('caller',sprintf('exist(''%s'',''var'')',vars(k).name));
   if varsexist
      externvar = evalin('caller',sprintf('%s',vars(k).name));
   end
   X = load(Datei);
   fnames = fieldnames(X.(vars(k).name));
   for f=1:length(fnames)
      externvar.(fnames{f})=X.(vars(k).name).(fnames{f});
   end
   assignin('caller',sprintf('%s',vars(k).name),externvar)
end
clear X externvar vars;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2012, 06:47     Titel:
  Antworten mit Zitat      
Einen wunderschönen guten Morgen!

Ich freue mich wie ein Schnitzel!! Very Happy
Die Sache funktioniert genau so, wie ich das benötige. Herzlichen Dank für Deine Hilfe, ich hätte wahrscheinlich ewig gebraucht, bis ich das hinbekommen hätte, weil ich einige Befehle noch nicht wirklich kannte! Ich werde mir gleich mal die Hilfe durchlesen, so dass ich genau verstehen, wie die m-Datei funktioniert.

Also vielen Dank noch einmal und viele Grüße aus München!

Christian
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.