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

Strukt aus Cell-Daten möglichst ohne Schleife

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2017, 07:18     Titel: Strukt aus Cell-Daten möglichst ohne Schleife
  Antworten mit Zitat      
Hallo,

Ich möchte gerne eine Struktur sagen wir mal unbekannten Formats erstellen. In meinem Fall wird die Struktur die folgende Form besitzen. Also eine Struktur mit verschachtelten (nested) Feldern.
Code:
p = struct('group1', struct('dataset1', struct('param1', 1, 'param2', 2, 'param3', struct('nestedparam', [])), 'dataset2', [], 'dataset3', []), ...
           'group2', struct('dataset4', [], 'dataset5', [], 'dataset6', []));

a = {'group1', 'group2'};
b = {'dataset1', 'dataset2', 'dataset3', 'dataset4', 'dataset5', 'dataset6'};
c = {'param1', 'param2', 'param3'};
d = {'nestedparam'};

Nun kann wie eingangs erwähnt die Anzahl der Felder variieren, hier bezeichnet mit Group, Dataset, Param, NestedParam.
Die Feldnamen der Einzelnen Felder sind im Moment in Cell-Arrays hinterlegt, quasi {group1, group2}, {dataset1, dataset2, dataset3}, usw.

Meine Frage ist nun wie kann ich aus den Cell-Array Daten ein Strukt wie am obigen Beispiel erwähnt erzeugen? Möglichst ohne großartig Schleifen verwenden zu müssen. Leider aktzeptiert der struct-Befehl keine Cell-Arrays als Eingabeargumente. Letztlich möchte ich es nur möglichst elegant lösen. Kann man hier vielleicht mit cell2struct was erreichen? Habe eine Weile herumgetüftelt aber noch keine zufriedenstellende oder brauchbare Lösung gefunden.

Bin für jeden konstruktiven Beitrag offen, danke.
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: 10.02.2017, 13:28     Titel: Re: Strukt aus Cell-Daten möglichst ohne Schleife
  Antworten mit Zitat      
Hallo Martinuk,

"Großartige" Schleifen sind in Allgemeinen eine sehr gute Lösung: Übersichtlich und schnell.
cell2struct sollte tatsächlich helfen. Poste doch malm, was du versucht hast und erkläre, welche Probleme aufgetreten sind. Dann ist es einfacher, Verbesserungsvorschläge zu machen.

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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2017, 17:58     Titel:
  Antworten mit Zitat      
Hallo Jan,

grundsätzlich habe ich nichts gegen Schleifen. Genau wie du sagst sie dienen der Übersichtlichkeit und ebenso schnell sein.

Bei meinem Beispiel denke ich, dass es aus einer Kombination von Schleifen und cell2struct möglich sein müsste. Irgendwie habe ich das Gefühl, dass ich eine Struktur solcher Architektur in nur wenigen Zeilen lösen lassen müsste ohne großartig viele Schleifen und if-Anweisungen.

Ich würde gerne meine Versuche posten, allerdings habe ich nicht wirklich was, klingt blöd ist aber so. Also wenn du Ideen zur Umsetzung hast, dann bitte mich wissen lassen.

Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2017, 20:42     Titel:
  Antworten mit Zitat      
Mit diesem Code-Strukt habe ich es nun grundsätzlich geschafft zu erreichen was ich möchte.

Code:
a = {'group1', 'group2'};
b = {'dataset1', 'dataset2', 'dataset3'; 'dataset4', 'dataset5', 'dataset6'}';
c = {{'param1'; 'param2'; 'param3'}; ''; ''; ''; ''; ''};
d = {''; ''; {'p1'; 'p2'; 'p3'}; ''; ''; ''};

for i = 1:length(a)
    s.(a{i}) = cell2struct(repmat({'[]'}, 1, numel(b(:,i))), b(:,i), 2);
                                             
    fields = fieldnames(s.(a{i}));
    for j = 1:length(fields)
        if ~isempty(c{j})
            s.(a{i}).(fields{j}) = cell2struct(repmat({'[]'}, numel(c{j}), 1), c{j}, 1);
       
            prop = fieldnames(s.(a{i}).(fields{j}));
            for k = 1:length(prop)
                if ~isempty(d{k})
                    s.(a{i}).(fields{j}).(prop{k}) = cell2struct(repmat({'[]'}, numel(d{k}), 1), d{k}, 1);
                end
            end
        end
    end
end  


Gibt es hier noch Verbesserungspotential?
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: 11.02.2017, 16:39     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

Bist Du sicher, dass der String '[]' in den Feldern stehen soll, wenn sie leer sind, oder sollen sie die leere Matrix sein?

Ich hätte nur kleine Idee, wie man den Code verbessern könnte:
Code:
for i = 1:length(a)
    s.(a{i}) = cell2struct(repmat({'[]'}, 1, numel(b(:,i))), b(:,i), 2);
                                             
    fields = b(:,i);  % Cheaper than: fieldnames(s.(a{i}));
    for j = 1:length(fields)
        if ~isempty(c{j})
            s.(a{i}).(fields{j}) = cell2struct(repmat({'[]'}, numel(c{j}), 1), c{j}, 1);
       
            prop = c{j};
            for k = 1:length(prop)
                if ~isempty(d{k})
                    s.(a{i}).(fields{j}).(prop{k}) = cell2struct(repmat({'[]'}, numel(d{k}), 1), d{k}, 1);
                end
            end
        end
    end
end  


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

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2017, 19:41     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Rückmeldung.

Zitat:
Bist Du sicher, dass der String '[]' in den Feldern stehen soll, wenn sie leer sind, oder sollen sie die leere Matrix sein?

Hast du sehr gut beobachtet. Idealerweise hat ein leeres Feld kein '[]' sondern ein einfaches [], wäre damit etwas übersichtlicher. Aber im cell2struct Befehl brauche ich immer eine Cell-Array als Eingabeargument..., Idee?

Code:
>> p.group1

ans =

    dataset1: [1x1 struct]
    dataset2: []
    dataset3: []

>> s.group1

ans =

    dataset1: [1x1 struct]
    dataset2: '[]'
    dataset3: '[]'


Mit deinen kleinen Änderungen hast du natürlich auch recht.

Danke.
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: 12.02.2017, 15:48     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

cell(1, n) erzeugt ein Cell-Array mit leeren Arrays. Also z.B.:
Code:
s.(a{i}).(fields{j}).(prop{k}) = cell2struct(cell(1, numel(d{k}), 1), d{k}, 1);

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2017, 05:50     Titel:
  Antworten mit Zitat      
Perfekt, danke.
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 - 2024 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.