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

Matrizen-Einzelfelder in Struktur zu dem Vektor zusammfassen

 

FeLe
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 17.07.2013, 17:19     Titel: Matrizen-Einzelfelder in Struktur zu dem Vektor zusammfassen
  Antworten mit Zitat      
Hallo allerseits!
Ich habe viele Daten in einer Struktur. Diese muss ich für hist-plot zu einem Vektor zusammenfassen.
Mit der for-loop dauert es zu lange. Kann man ohne for-loop bestimmte Stellen diese Matrizen zu einem Vektor zusammenfassen?

Irgend wie so:
Code:

fNames = fieldnames(strucName);
vectorName1 = strucName.(fNames {:}).F1(1,1);
vectorName2 = strucName.(fNames {:}).F1(1,2);
 


Mfg
FeLe
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.07.2013, 17:47     Titel:
  Antworten mit Zitat      
Hallo
Zitat:
Kann man ohne for-loop bestimmte Stellen diese Matrizen zu einem Vektor zusammenfassen?

Leider versteh ich nicht, was du darunter meinst. Bitte deine Struktur genauerer beschreiben.

Da du aber Daten aus mehreren Feldern extrahieren möchtest, benötigst du eine Schleife. Man kann nicht gleichzeitig aus allen Felder extrahieren
Code:

% geben sei folgende Struktur
S = struct('Feld1', num2cell(rand(1,10)), 'Feld2', num2cell(rand(2,10),1), 'Feld3', num2cell(rand(3,10),1))

%Angenommen ich möchte die Daten aus Felder 1 und 3 extrahieren
% Möglichkeit 1: Dann kann man das direkt über Feldnamen machen
Feld1 = [S.Feld1]
Feld3 = [S.Feld3]

% Möglichkeit2 über STRUCT2CELL
C = struct2cell(S)

Feld1= [C{1,:}]
Feld3= [C{3,:}]


% Möglichkeit 3
fnames = fieldnames(S);
fnames = setdiff(fnames, {'Feld2'})

Data = cell(1,length(fnames))
for k=1:length(fnames)
   Data{k} = [S.(fnames{k})]
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 17.07.2013, 18:44     Titel:
  Antworten mit Zitat      
Ich dachte es gibt die Möglichkeit die Aufgabe über structfun zu lösen.
Damit es verständlicher wird:
Code:

% structur erzeugen
for f=1:10
    for m = 1:3
        fieldName = ['f' num2str(f)];
        matrixName = ['m' num2str(m)];
        struc.(fieldName).(matrixName) = rand(3);
    end
end
 

Jetzt will ich bestimmte Stelle aus allen Feldern Matrize m1(1,1) zu einem Vektor zusammenfassen.
Code:

fNames = fieldnames(struc);

for k=1:length(fNames)
    if ~exist('vector','var')
        vector = struc.(fNames{k}).m1(1,1);
    else
        vector = [vector struc.(fNames{k}).m1(1,1)];
    end
end

hist(vector)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.07.2013, 19:01     Titel:
  Antworten mit Zitat      
Hallo

Das ist keine schöne Struktur

aber ich denke man könnte das so lösen:
Code:


for f=1:10
    for m = 1:3
        fieldName = ['f' num2str(f)];
        matrixName = ['m' num2str(m)];
        struc.(fieldName).(matrixName) = rand(3);
    end
end
 



S = struct2cell(struc)
S = [S{:}];

m1 = cat(3, S.m1)
vector = squeeze(m1(1,1,:))'

 
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 17.07.2013, 19:16     Titel:
  Antworten mit Zitat      
Das funktioniert! vielen Dank!
Verstehe nicht ganz was bei cat and squeeze gemacht wird. Ich kenne die Funktionen leider noch nicht. Aber das werde ich nachholen.

Aber ganz allgemein wäre die Möglichkeit über structfun das lösen? Und was genau an dem Struktur unschön?
Danke!
Mfg
FeLe
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: 18.07.2013, 00:01     Titel:
  Antworten mit Zitat      
Hallo FeLe,

An der Datenstruktur ist unschön, dass man zusammengehörige Werte mit komplizierten Funktionen zusammen suchen muss. Wie Du schon selbst herausgefunden hast, ist der Zugriff über eine FOR-Schleife bereits langsam.

STRUCTFUN läuft nicht besonders viel schneller, deshalb würde ich eher bei Dennys Vorschlag bleiben.

Die Wahl einer effizienten Daten-Representation ist generell schwierig. Was für die eine Aufgabe gut ist, bremst eine andere Aufgabe enorm aus. In einem Telefonbuch ist es sehr einfach herauszufinden, wieviele Namen mit A beginnen, aber ein Horror nach Namen zu suchen, die mit A aufhören. Bei komplizierten Daten ist ein Struct sehr hilfreich, da es Stunden an Debugzeit sparen kann den einzelnen Unter-Strukturen Namen zu geben, nämlich die Fieldnames. Aber rechentechnisch ist es natürlich effizienter aus allen Werten ein einziges riesiges Array zu erstellen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 18.07.2013, 10:38     Titel:
  Antworten mit Zitat      
Vielen Dank noch mal für ihre Hilfe!
Wie der Jan richtig gesagt hat, wenn ich alle Daten in einen Array rein tue, finde ich gar nichts mehr. Die Struktur präsentiert einen bestimmten Parameter, die Felder sind Einzel-DUTs, die Unter-Felder sind mehrere Ausgänge und die Matrix-Zellen präsentieren bestimmte Umgebungsbedingungen (Temperatur usw.).
Für mich erscheint die Sache mit Strukturen nicht ganz rund. Die Eingabe;

Code:
structureName.(fieldName{:})(1,1)


ist für mich eindeutig. Und ich frage mich warum es so nicht umgesetzt war. Diese Frage ist zu den Mathwork-Mitarbeitern.
Mfg
FeLe
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 18.07.2013, 11:00     Titel:
  Antworten mit Zitat      
Ich wollte noch mal meine Wille strucfun zu nutzen kommentieren. Eine der wichtigsten Aufgaben ist die Pflege von dem Program und Anpassung. Wenn es einmalige Sache wäre, wäre es auch egal wie man zu der Lösug gekommen ist. Die Programmierung ist für mich Nebenbeschäftigung. Das heißt wenn ich nach paar Monaten wieder an das Programm ran muss, erschein für mich;
Code:

m1 = cat(3, S.m1)
vector = squeeze(m1(1,1,:))'
 

als Hieroglyphen 
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: 18.07.2013, 11:19     Titel:
  Antworten mit Zitat      
Hallo FeLe,

CAT und SQUEEZE sind aber grundlegend.
CAT fügt Arrays zusammen, und Du kennst CAT(1, X, Y) z.B. in der Form [X; Y] und CAT(2, X, Y) als [X, Y]. Hier werden automatisch die internen Funktionen VERTCAT und HORZCAT aufgerufen und die Schreibweise mit den eckigen Klammern dient nur der besseren Lesbarkeit.

SQUEEZE quetscht einfach nur diejenigen Dimensionen raus, deren Länge 1 ist. Es wird also aus einem [3 x 1 x 4 x 1 x 5] Array eines der Größe [3 x 4 x 5]. Das ist praktisch, wenn man z.B. von einem 3D-Array einen Mittelwert über die zweirte Dimension berechnet: mean([M x N x P], 2) ergibt ein [M x 1 x P] Array. Wenn man aber eine Matrix bekommen möchte, hilft SQUEEZE oder das equivalente: RESHAPE(Y, M, P).

Sehr hilfreich und deshalb essentiell für das Verständnis des Codes sind Kommentare. Am besten wird der Zweck jedes Abschnitts oder sogar jeder Zeile erklärt. Denn nur dann kann man hinterher beim Debuggen entscheiden, ob der Code das macht, was er soll. Wenn man aber nur den Code sieht, kann man nur noch raten, was er eigentlich machen soll und einen Fehler kann man dann nicht mehr erkennen.

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.