2017-05-09 3 views
0

Guten Tag,MATLAB: Zugriff auf Daten in verschachtelte Struktur For-Schleife mit

Ich habe eine verschachtelte Struktur in diesem Format.

Data: [1x1 struct] 
    a: [1x1 struct] 
     a1: [10x1 double] 
     a2: [10x1 double] 
     a3: [10x1 double] 
    b: [1x1 struct] 
     b1: [10x1 double] 
     b2: [10x1 double] 
    c: [1x1 struct] 
     c1: [10x1 double] 
     c2: [10x1 double] 
     c3: [10x1 double] 
     c4: [10x1 double] 

Jede Unterfelder a, b & c sind Dauer Prozentsatz eines Ereignisses in Eimern. Die Anzahl der Elemente in jedem Bucket ist die Anzahl der Datensätze. Ich möchte die Bucket-Werte jedes Datensatzes summieren und den gesamten Datensatz verwerfen, wenn sie nicht 100% ergeben. Wie kann ich auf jedes Element der Buckets für a, b & c Felder von Data mit for-Schleife in einem einfachen Format zugreifen.

EDIT: Ich habe herausgefunden, wie man die Unterfelder nennen & es Elemente gibt, & nun die Prozentsätze summieren, wenn die Daten-Sets nicht bis zu 100 Hinzufügen müssen vollständig von jedem Unterfeld entfernt.

field = fieldnames(Data); 
for group = 1:length(field) 
    for subfield = fieldnames(Data.(field{group})) 

     fieldSize = structfun(@(field) length(field),Data.(field{group})); 
     nb_datasets = fieldSize(1,1); 

     for jj = 1:nb_datasets 
      for ii = 1:length(subfield) 
       a_dataset_pcts(jj,ii) = Data.(field{group}).(subfield{ii})(jj,1); 
      end 
      a_pct_total(jj,:) = sum(a_dataset_pcts(jj,:)); 
     end 

    end 
end 
+0

Haben Sie selbst etwas probiert? –

+0

Wie Ersetzen von '@ (Feld) Länge (Feld)' mit '@ (Feld) Mittelwert (Feld)'. –

+0

@Mad Physicist Re-itering meine Frage oben: a1, a2, a3 sind die prozentualen Buckets für die Gruppe a. Ich würde gerne wissen, wie man auf jedes dieser Bucket-Elemente zugreift, um später mehrere Aufgaben durchführen zu können (der Mittelwert war nur ein Beispiel). Die Anzahl der Elemente in den Buckets entspricht der Anzahl der Datensätze. Die Bucket-Elemente repräsentieren Prozentsätze eines Ereignisses und die Summe von a1 (1,1), a2 (1,1), a3 (1,1) sollte sich zu 100% addieren. Eine andere Aufgabe, die weiter verfolgt wird, sollte das Entfernen des gesamten Datensatzes sein, wenn sie nicht 100% ergeben. – Bensa

Antwort

0

Matlab wie Matrizen Bensa .... Sie Ihr Konzept fallen sollte jetzt.

Feste Größe Datensätze

Wenn alle a, b, c Arrays sind 10x1 Größe, Sie zu einer Zelle von Arrays schalten sofort sollte der Index die Dauer zu sein, und die Felder Spalten die Datensätze für Jede Dauer:

a: [1x1 cell] 
    a{1}: [10xna double] 
    a{2}: [10xnb double] 
    a{3}: [10xnc double] 

Alle Statistiken gehen leicht. Sie haben zwei for Schleifen, eine für die Dauer, andere für den Datensatz. Matlab vektorisiert die Funktionen innerhalb jedes Datensatzes (meistens). In hier, ich gehe davon aus max(.) ist Ihre Aggregation Array-Funktion für die Statistik zu erhalten:

n=length(a); 
for i=1:n 
    ni=size(a{i},2); 
    for j=1:ni 
     max(a{i}) 
     mean(a{i}')' 
     if j==j0 && i==i0 
      a{i}(:,j)=[]; % Cleanup j0th event in i0th dataset 
     end 
    end 
end 

Haben Sie a.a1 & b.b1 & c.c1 vergleichen müssen? Wenn das wahr ist, dann sollten Sie gezwungenermaßen erstellen die auxiliar Array x, und dann Ihre Statistiken erhalten:

for i=1:n 
    x(:,i)=a{i}; 
end 
max(x')' 

Variable Größe Datensätze

Wenn die a, b, c Arrays unterschiedlich sind jedes Mal, dann aktualisieren Sie die letzten Daten und wechseln Sie zu einer Zelle von Zellen:

a{1}: [1xna cell] 
    a{1,1}: [la(1)x1 double] 
    ... 
    a{1,na}: [la(na)x1 double] 
a{2}: [1xnb cell] 
    ... 
a{3}: [1xnc cell] 
    ... 

Hier ist der Ansatz max(.')' nutzlos, da jeder Datensatz unterschiedlich lang sein kann. Wenn dies der Fall ist, können Sie die Daten immer noch wie üblich über Spalten referenzieren:

Machen Sie das sinnvoll ?. Fühlen Sie sich frei, unten zu kommentieren ...

Verwandte Themen