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

Structs kombinieren

 

Jawag

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2011, 18:03     Titel: Structs kombinieren
  Antworten mit Zitat      
Guten Tag,
ich sitze nun schon seit längerem an folgendem Problem und finde keine Lösung.

Ich generiere mit einem Skript viele Structs mit Namen

EreignisR1T151 (zulesen ist dies nicht wie T151, sondern wie T15 1)
EreignisR1T152 (zulesen ist dies nicht wie T151, sondern wie T15 2)
EreignisR1T153 (zulesen ist dies nicht wie T151, sondern wie T15 3)
.
.
.

erstellt wurden diese Structs mit folgendem Kommando

Code:
assignin ('base',['Ergebnis',num2str(bar),'T',num2str(temp),num2str(i)], E);


wobei dem Dateiname jeweils das Struct E zugeteilt wird. Dies funktioniert wunderbar. Nur möchte ich das Ganze speichern, aber wenn ich das tu habe ich mehrere hundert Dateien. Nun möchte ich das ganze wieder in ein struct zusammen Packen und schaffe es nicht. Von Hand würde folgendes gehen:

Code:
Ergebnis = struct('Ergebnis1T151', Ergebnis1T151, 'Ergebnis1T12', Ergebnis1T152......);


Das klappt auch, ist aber nicht möglich bei so vielen Daten. gibt es dafür eine Lösung dass Matlab in dem letzten Befehl auch durchzählt?

Ich hoffe das war nicht zu kompliziert und jemand hat eine Lösung für mich.


Gruß Jawag


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.01.2011, 19:37     Titel: Re: Structs kombinieren
  Antworten mit Zitat      
Hallo Jawag,

Zitat:
Ich generiere mit einem Skript viele Structs mit Namen
EreignisR1T151 (zulesen ist dies nicht wie T151, sondern wie T15 1)
EreignisR1T152 (zulesen ist dies nicht wie T151, sondern wie T15 2)
EreignisR1T153 (zulesen ist dies nicht wie T151, sondern wie T15 3)
...
Code:
assignin ('base',['Ergebnis',num2str(bar),'T',num2str(temp),num2str(i)], E);


Hier liegt bereits das Problem. Du erzeugst komplizierte Variablen-Namen indem Du den Index in den Namen einfügst. Danach ist es wenig verwunderlich, dass es schwierig wird, auf diese Variablen-Namen wieder zuzugreifen.

Wenn Du die Daten strukturiert speichern würdest, würden erst gar keine Schwierigkeiten auftauchen, z.B. als Array, Cell Array oder Struct Array:
Code:
EreignisR1T153  -> Ereignis.R(1)T{15, 3}

Welcher Typ von Array nun für Dich am besten geeignet ist, hängt von den eigentlichen Daten ab.

Dass Du die Variablen per "assignin('base', ...)", auch Poofing genannt, in den Baseworkspace schreibst, ist ein anderes Problem. Das macht ein Programm schwer durchschaubar und zudem langsam - debuggen möchte man soetwas später kaum. Eine geordnete Übergabe von Inputs und Outputs wäre da übersichtlicher und sicherer zugleich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jawag

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.01.2011, 22:57     Titel:
  Antworten mit Zitat      
Hmm da war ich froh dass ich den Trick mit dem assignin gefunden habe und nun ist es wieder nichts. schade.

Ok dann mal von Anfang an, denn dieses Problem begleitet mich in anderer Form schon deslängeren.


Ich habe eine belibige for-Schleife und bei jedem durchgang möchte ich einige Variablen speichern. Das Ganze hat dann die Form:

Code:
for i=1:100
berechne a(i),b(i),c(i).....
save a(i),b(i),c(i).....
end;


wobei die a(i),b(i),c(i)... selber wieder arrays oder structs sind. Das Problem ist nun dass ich das Ganze letztendlich in einer einzigen Datei/struct... hätte, die, wenn ich sie aufmache ich wieder alles nachschauen kann.


Mein letzter Versuch (vor dem geposteten) ging etwa so:

Code:
for i=1:1:77 %Messungen durchlaufen
Ergebnisname=sprintf('ErgebnisT%u%u.mat',o,i); %Name erzeugen
E = struct('Current',(T),'Density',(j),'Steigung',(alpha),'Maxoutput',(P),'Fit1',(fit1),'Fit2',(fit2),'Strom',(x),'Power',(y),'Error1',(error1),'Error2',(error2),'Maxjth',(Tfehler),'Fehler',(Fehler),'Fehlerdichte',(Fehlerdichte)) %struct bauen mit allen zu speichernden Variablen
save (Ergebnisname, 'E') %speichern
end;


nun hab ich aber 77 gespeicherte structs und ich weiss einfach nicht wie ich das ganze elegant löse und am ende eine Datei habe Sad
Hast du vielleicht noch eine Idee?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.01.2011, 00:30     Titel:
  Antworten mit Zitat      
Hallo Jawag,

Wie wäre dies:
Code:
for i=1:77 %Messungen durchlaufen
E(i) = struct('Current', T, 'Density', j, 'Steigung', alpha, ...
         'Maxoutput',P,'Fit1',fit1,'Fit2',fit2,'Strom',x, ...
         'Power',y,'Error1',error1,'Error2',error2,'Maxjth',Tfehler,
         'Fehler',Fehler,'Fehlerdichte',Fehlerdichte);
end;
Ergebnisname = sprintf('ErgebnisT%u_all.mat',o);
save (Ergebnisname, 'E');
 

Jetzt sind alle 77 Structs in einem MAT File gelandet. Spricht etwas dagegen? Das hätte den Vorteil, dass man später recht einfach z.B. auf alle "Steigung"-Variablen zugreifen könnte:
Code:
AllSteigung = [E.Steigung]

Das wäre dann ein Vektor mit allen Steigungen (falls E(i).Steigung ein Skalar ist).

Etwas effizienter wäre es mit "i = 77:-1:1", da dann das Struct E gleicht richtig dimensioniert wäre. Aber bei 77 Iterationen ist das noch nicht so wichtig.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jawag

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2011, 10:28     Titel:
  Antworten mit Zitat      
Das funktioniert einwandfrei! ich wusste es muss nen einfachen Weg geben. Sehr schön, danke!

Gibt es zufällig noch einen weg wie ich die 77 Zellen in dem E(i) struct benenne? Also wieder nicht manuel. Halt R1T151,R1T152...
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2011, 01:21     Titel:
  Antworten mit Zitat      
Hallo Jawag,

Gibt es zufällig noch einen weg wie ich die 77 Zellen in dem E(i) struct benenne? Also wieder nicht manuel. Halt R1T151,R1T152...[/quote]

Code:
E(i).Name = 'R1T151';

Wenn Du dann später nach einem bestimmten Namen suchst:
Code:
Index = find(strcmp({E.Name}, 'R1T151'));

Dann hast Du individuelle Namen für alle Structs, und trotzdem alles schön ordentlich beieinander. Wenn Du das Programm dann mal auf 78 oder 78921 Daten erweitern möchtest, geht das ohne lange im Code herum stochern zu müssen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jawag

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2011, 14:50     Titel:
  Antworten mit Zitat      
Das ist eigentlich genau was ich gesucht habe, aber es funktioniert nicht.

mein Code

Code:
E(i) = struct('Thresholdcurrent',(I),'Thresholdcurrentdensity',(j),'Slope',(alpha),'Maxoutput',(P),'Fit1',(fit1),'Fit2',(fit2),'Current',(x),'Outputpower',(y),'Error_fit1',(error1),'Error_fit2',(error2),'Maximal_Thresholdcurrent_incl_Error',(Tfehler),'Error_Thresholdcurrent',(Fehler),'Error_Thresholdcurrentdensity',(Fehlerdichte));
E(i).Name = 'R1T151';


Meine Fehlermeldung

Code:
??? Subscripted assignment between dissimilar structures.

Error in ==> T0>plotbutton_Callback at 151
E(i) =
struct('Thresholdcurrent',(I),'Thresholdcurrentdensity',(j),'Slope',(alpha),'Maxoutput',(P),'Fit1',(fit1),'Fit2',(fit2),'Current',(x),'Outputpower',(y),'Error_fit1',(error1),'Error_fit2',(erro
Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> T0 at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)T0('plotbutton_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback



Eigentlich wollt ich daraus folgendes machen

Code:
E(i) = struct('Thresholdcurrent',(I),'Thresholdcurrentdensity',(j),'Slope',(alpha),'Maxoutput',(P),'Fit1',(fit1),'Fit2',(fit2),'Current',(x),'Outputpower',(y),'Error_fit1',(error1),'Error_fit2',(error2),'Maximal_Thresholdcurrent_incl_Error',(Tfehler),'Error_Thresholdcurrent',(Fehler),'Error_Thresholdcurrentdensity',(Fehlerdichte));
E(i).Name = sprintf('R%uT%u%u.mat',bar,temp,i);



Aber da schon ersteres nicht geht wird das wohl noch warten müssen.

Ich verstehe sein Problem nicht, die Syntax sieht doch gut aus. Sollte eigentlich klappen!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.01.2011, 23:56     Titel:
  Antworten mit Zitat      
Hallo Jawag,

Wenn Du ein Array aus Structs bearbeitest, müssen alle Elemente die gleichen Fleder haben, sogar in der gleichen Reihenfolge:
Code:
X(1) = struct('Name', 'A', 'Data', 8);
X(2) = struct('Name', 'B');   % *** ERROR ***

Das läßt sich lösen, indem man die Structs gleich vollständig definiert. In Deinem Fall also 'Name' gleich mit in das STRUCT Kommando einfügt:
Code:
E(i) = struct('Thresholdcurrent',(I),'Thresholdcurrentdensity',(j),'Slope',(alpha),'Maxoutput',(P),'Fit1',(fit1),'Fit2',(fit2),'Current',(x),'Outputpower',(y),'Error_fit1',(error1),'Error_fit2',(error2),'Maximal_Thresholdcurrent_incl_Error',(Tfehler),'Error_Thresholdcurrent',(Fehler),'Error_Thresholdcurrentdensity',(Fehlerdichte), ...
'Name', 'R1T151');

Wozu setzt Du die Daten übrigens in Klammern? Das ist kein Fehler, bringtaber auch nichts, oder?

Gruß, Jan
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.