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

Addieren von Strukturen

 

Florian
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 21.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2010, 11:41     Titel: Addieren von Strukturen
  Antworten mit Zitat      
Hallo,
ich hab ein Problem mit der "Addition" von Strukturen.

Ich habe mehrere Struktuen (im Beispiel X1, X2) vom gleichen Typ.
Diese Strukturen enthalten Vektoren (X1_G1, X1_G2 bzw. X2_G1, X2_G2) mit verschiedenen Elementen.

Nun möchte ich die Summe der beiden Strukturen bilden.
Also im Prinzip die Vektoren X1_G1 und X2_G1 bzw. X1_G2 und X2_G2 addieren.

Mein Problem vereinfacht dargestellt ergibt sich zu:
Code:

X1_G1 = [1;2;3]
X1_G2 = [1;1;1]

X2_G1 = [1;2;3]
X2_G2 = [3;2;1]

X1 = struct('G1',X1_G1,'G2',X1_G2);
X2 = struct('G1',X2_G1,'G2',X2_G2);

X1+X2
 


Das einfache Addieren der Strukturen (X1+X2) funktioniert nicht.
Ist das überhaupt so allgemein möglich ohne auf die einzelnen Elemente der Sturkturen zuzugreifen?
Code:

X1.G1 + X2.G1

X1.G2 + X2.G2
 

Da mein echtes Problem eine Vielzahl von Strukturen beinhaltet wäre dies extem schreib aufwändig.

Danke für eure Hilfe
Florian
Private Nachricht senden Benutzer-Profile anzeigen


josekamara
Forum-Meister

Forum-Meister


Beiträge: 529
Anmeldedatum: 26.04.08
Wohnort: München
Version: ---
     Beitrag Verfasst am: 08.04.2010, 12:05     Titel:
  Antworten mit Zitat      
Servus,

Strukturen kann man was i weiss jedenfalls nicht summieren.
Was Du vielleicht machen kannst, den Inhalt der Strukturen z.B mit :
Code:

inhalt=fieldnames(struktur);

struktur.(inhalt(1))
 


feststellen und dadurch ein kleines Programm schreibst, das die Vektoren
der verschiedenen Strukturen automatisch summiert.

Gruß

Jose
_________________

Simulation
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 07.10.2010, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

nachdem diese Diskussion hier lange Zeit nicht vorgeführt wurde, möchte ich sie wieder aufnehmen, da dieser Beitrag am exaktesten zu meiner Fragestellung passt.

Auch ich möchte in einem struct ein Unterelement um Elemente erweitern. Für eine Struktur (struct) deren Form bekannt ist, werden Lösungsansätze in folgendem Beitrag geannt:
"Erweitern eines structs:"
http://www.gomatlab.de/vorhandene-s.....486,highlight,struct.html

Allerdings möchte ich das ganze deutlich variabler (dynamischer) gestalten, d.h. meine Struktur hat keine feste Form. Die Form möchte ich vielmehr in Listen (Cells) übergeben. Daher die Diskussion und darin genannte Lösungsansätze unter:
http://www.gomatlab.de/korrekter-gebrauch-von-fprintf-t2825.html

Nach diesem Abriss nun der Versuch, meine Wünsche kurz zu umreißen:

Ich habe ein struct, dessen Struktur komplex aber bekannt ist. Mit kompley meine ich:
> eine Tiefe größer als 2 - z.B.: A.B.C
> mehrdimensional - z.B.:A(1:10)


Code:

A(1).B.(5).C.Wert = 10
 


Nun bearbeite ich ein unterstruct, indem ich z.B. weitere Elemente (substructs) hinzufüge. Dies mache ich der Komplexität wegen gerne gesondert in einem Skript. Gedanklich hänge ich den Unterknoten aus, bearbeite ihn und möchte ihn dann wieder komfortabel zurückhängen.

Manuell geschah dies biesher durch z.B. folgenden Beispielcode:
Code:

% schon im WS oder in einem Skript gesetzt:
A(1).B.(5).C.Wert = 10
% in einem weiteren Skript gesetzt:
temp=A(1).B.(5).C;
temp.Wert1 = 20;
A(1).B.(5).C = temp;
 


In der täglichen Arbeit habe ich allerdings festgestellt, dass diese Hin- und Rückübergabe sehr langwierig werden kann und fehleranfällig ist. Daher habe ich mir, wie schon so manch anderer hier im Forum gedacht, dass ich eine Funktion schreiben kann, die ein substruct um Elemente erweitert.

In einem ersten Schritt bastle ich mir einen Struct-Pointer zusammen:

Code:

function str = fkt_str_fuer_struct(name,instanz)
%% Eingabe überprüfen:
% Damit Eingabe des Arguments "instanz" als Vektor oder CELL möglich ist:
if ~isnumeric(instanz)
   if iscell(instanz)
      if isnumeric(instanz{1})
         ninstanz = cell2mat(instanz);
      else
         for ctr = 1:length(instanz)
            ninstanz(ctr) = cell2mat(instanz(ctr));
         end
      end
         instanz = ninstanz;
   else
      errordlg(['Die Instanzierung des Structs entspricht ',...
                'nicht dem gewünschten Datentypen']);
   end
end

%% VERARBEITUNG:
for k=2:length(name)
 str_parts{k} = sprintf('.%s(%d)',name{k},instanz(k));
end

%% AUSGABE:
str = [name{1},'(',num2str(instanz(1)),')',str_parts{:}];
end
 


Darauf aufbauend kann ich mir dann die unterstructs auslesen. Anmerkung: auch mein temp soll variabel sein dürfen, sprich temp -> A_neu(1). ..., daher die Bezeichnung Ersatz.

Code:

% * Erstellen einer dynamischen Bezeichnung als "Pointer":
striOriginal = fkt_str_fuer_struct(cellOriginal,vecOriginal);
striErsatz = fkt_str_fuer_struct(cellErsatz,vecErsatz);

% * Zuweisen (Füllen) der lokalen Variablen mittels Pointer:
struTempOriginalKurz = evalin('base',striOriginal)
struTempErsatzKurz = evalin('base',striErsatz)
 


Den Listenvergleich habe ich auch hinbekommen (s.u.), nur die Rückgabe an mein Originalstruct im 'base' funktioniert nicht. Daher meine Nachfragen unter

http://www.gomatlab.de/viewtopic,p,53454.html#53454


Konkret scheitere ich an dem gleichen Problem wie unter folgendem Beitrag beschrieben:

http://www.gomatlab.de/struct-im-ba.....257,highlight,struct.html

Zitat:
... das Problem ist, dass man structs glaub ich nicht so einfach an Funktionen übergeben kann, auch der assignin Befehl funktioniert bei structs nicht.


Anbei noch der etwas ausschweifend geschriebene Quellcode mit dem ich die Elemente vergleiche:

Code:

% * Namen der Unterstructs in Liste auslesen, wenn Unterstructs vorhanden:
try
   ElementeBezeichnung.original.Name = fieldnames(struTempOriginalKurz);
   ElementeBezeichnung.ersatz.Name = fieldnames(struTempErsatzKurz);
catch
   errordlg('Es sind keine oder nur leere Unterstrukturen vorhanden')
   return
end

%% VERARBEITUNG: Struktur durchforsten:

% * Vergleich der Elemente:

   Zaehler.ErsatzInOriginal = 1; % listelEIO
   Zaehler.ErsatzNichtInOriginal = 1; %listelENIO
       
for listPosErs = 1: length(ElementeBezeichnung.ersatz.Name)
   for listPosOrg = 1: length(ElementeBezeichnung.original.Name)
      % => Original in Ersatz (A in B)
      if strcmp(...
            ElementeBezeichnung.original.Name(listPosOrg),...
            ElementeBezeichnung.ersatz.Name(listPosErs))        
         liste.original.OrgInErs.Position(...
            Zaehler.ErsatzInOriginal) = listPosOrg;
         liste.ersatz.OrgInErs.Position(...
            Zaehler.ErsatzInOriginal) = listPosErs;
         Zaehler.ErsatzInOriginal = ...
            Zaehler.ErsatzInOriginal + 1;
      end
         liste.ersatz.ErsInErs.Position(listPosErs) = listPosErs;
   end
end

      % => Ersatz nicht in Original (Inverse Menge)
       
         liste.ersatz.OrgNInErs.Position = ...
            liste.ersatz.ErsInErs.Position(...
               find(1-(...
                  liste.ersatz.ErsInErs.Position==...
                  liste.ersatz.OrgInErs.Position)));
                       
% * Neue Elemente in Original setzen:

for ctr = 1: length(liste.ersatz.OrgNInErs.Position)
    struTempOriginalKurz.(char(ElementeBezeichnung.ersatz.Name(...
       liste.ersatz.OrgNInErs.Position(ctr)))) = ...
          struTempErsatzKurz.(char(ElementeBezeichnung.ersatz.Name(...
             liste.ersatz.OrgNInErs.Position(ctr))));
end
 


Es würde genügen "struTempOriginalKurz" wieder an die richtige Stelle zu übergeben, ohne dabei alle weiteren Zweige (z.B. A(1).B(3)) zu überschreiben - aber das habe ich bisher noch nicht hinbekomen.

Meine Denkweise hat unter anderem auch noch den Haken, dass sie Symmetrie in structs nicht genügend beachtet.



Mit obigen Ausführungen habe ich wohl alle Klarheiten beseitigt Wink
Vielleicht kann mir trotzdem jemand weiterhelfen.

MFG, Germanus
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 08.10.2010, 15:10     Titel:
  Antworten mit Zitat      
So,

inzwischen ist meine Funktion fast vollständig, wenn auch vielleicht nicht sauber programmiert.

Allerdings scheitert es momentaqn beim Überschreiben noch an folgendem Error:


??? Subscripted assignment between dissimilar structures.


Das Minimalbeispiel zum Problem lautet:

Code:

% Initialisierung:
A(1).B(1).C = struct()
% Vorbereitung für Überschreiben:
temp.C = struct()

% Überschreiben Variante 1:
A(1).B(1) = temp % <- Hier erscheint der Error
% Überschreiben Variante 2:
A(1).B(2) = struct() %  <- Hier erscheint der Error
 


Hat jemand ne Idee wie ich dieses Problem der Unsymmetrie lösen kann? Damit ist nicht die unten angegebene Lösung gemeint, bei der man noch eine Ebene weiter in den struct geht, denn damit kann man keine ganzen Unterzweige überschreiben/umhängen?

Code:

% Unschöne Lösung:
temp.C = 10
A(1).B(1).C=temp.C
 


Mit freundlichem Gruß
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: 09.10.2010, 00:33     Titel:
  Antworten mit Zitat      
Hallo Germanus,

Zitat:
Code:

A(1).B(1).C = struct()
temp.C = struct()
A(1).B(1) = temp % <- Hier erscheint der Error
 

Bei mir erscheint da kein error.

Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Germanus
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 15.12.09
Wohnort: ---
Version: 7.8.0 (R2009b), Linux
     Beitrag Verfasst am: 11.10.2010, 13:48     Titel:
  Antworten mit Zitat      
Sorry,

da ist mir ein kleiner Fehler unterlaufen, denn ich habe da etwas vergessen:

Code:

A(1).B(1).C=struct()

temp.C=10
temp.D=20

A(1).B(1) = temp % => ??? Subscripted assignment between dissimilar structures.
 
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.