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

structure aus importierten cellarray erzeugen

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2014, 11:49     Titel: structure aus importierten cellarray erzeugen
  Antworten mit Zitat      
Hallo, ich importiere aus einem excelfile eine Tabelle die als structure gespeichert werden muss. Zusätzlich wird eine Abfrage auf ausgeführt ob alles importiert werden soll (ist hier aber nicht so wichtig). Das ganze funktioniert im Moment über den eval-Befehl, was entsprechend langsam ist. Leider ist mir keine Möglichkeit eingefallen das ganze sauberer zu lösen. An die Funktion wird folgendes übergeben:
- this.NodeList: doublearray
- raw: Rohdaten aus dem import
- txt: ein cellArray aus dem import bei dem viele felder leer sind (ähnlich einem strukturbaum
- Prop_txt: weitere Daten aus dem import bei dem u.a. die NodeList verglichen wird

Meine Schwierigkeit ist, die Strings aus der cellArray txt als fieldnames des zu erzeugenden structs struktur in einer sauberen Weise zu überführen. Ich habe eine Schleife die zuerst durch die Spalten und anschließend durch die Zeilen geht um entsprechend die fieldnames anzuordnen, aber bisher wird dies nur als string gespeichert. Eine Beispieltablle sieht so aus:
erste_Spalte
.................zweite_Spalte
.................noch_ein_Wert.....ein_Wert
...........................................zweiter_Wert

Das hieraus erzeugte struct wäre z.B. erste_Spalte.noch_ein_Wert.zweiter_Wert oder erste_Spalte.zweite_Spalte
Hoffe es ist einigermaßen verständlich.

meine Funktion sieht im Moment folgendermaßen aus:

Code:
       function struktur = create_Struktur(this, raw, txt, Prop_txt)

         % Anzahl der Zeilen
            num_row = size(txt,1);

            % sucht beide spalten nodenumbers
            for i=1:length(raw(1,:))
                if strncmpi(raw{1,i},'nodenumbers',11)
                    RSC=i; % RangeStartColumn
                    REC=i+1;% RangeEndColumn
                    break
                end
            end
            % nodes zu gruppen zusammenfassen
            Groups_Nodes_temp=cell(num_row,1);
            for j=2:num_row
                if ~isnan(raw{j,RSC})
                    if raw{j,RSC}<=raw{j,REC}
                       
                        lNodesIndex = raw{j,RSC}<= this.NodeList & this.NodeList <= raw{j,REC}; % welche nodes sind in den spalten die gleichzeitg in NodeList
                        Groups_Nodes_temp{j,1}=this.NodeList(lNodesIndex); % speichern der zuvor gefundenen nodenumber(s) als gruppe
                    end
                end
            end

         % Anzahl der Spalten
            num_Layer = size(txt,2);

            k = 1;
            quantity = length(num_Layer);
            % alle Spalten der struktur von hinten bis zur zweiten
            % durchgehen
            for first = num_Layer:-1:2
                for i = num_row:-1:2
                    if ~isempty(txt{i,first})
                        if ~isempty(Prop_txt{i,6})
                            for l=1:length(Groups_Nodes_temp{i,1})
                                nameofstruct{k} = [txt{i,first} '.Node_' num2str(Groups_Nodes_temp{i,1}(l)) '=[]'];
                                for j = first:-1:2
                                    i_temp = i;
                                    while (isempty(txt{i_temp-1,j-1}) && (i_temp ~= 0) && (j ~= 0) )
                                        i_temp = i_temp-1;
                                    end
                                    nameofstruct{k} = strcat(txt{i_temp-1,j-1},'.',nameofstruct{k});
                                end
                                k = k + 1;
                            end
                        else
                            nameofstruct{k} = txt{i,first};
                            for j = first:-1:2
                                while (isempty(txt{i-1,j-1}) && (i ~= 0) && (j ~= 0) )
                                    i = i-1;                                                                        
                                end
                                nameofstruct{k} = strcat(txt{i-1,j-1},'.',nameofstruct{k});
                            end
                            k = k + 1;
                        end
                    end
                end
            end

            nameofstruct = sort(nameofstruct);
            k = 1;
            quantity = size(nameofstruct,2);
            for i=1:quantity
                if strfind(nameofstruct{i},'=')
                    eval([nameofstruct{i} ';']);
                else
                    eval([nameofstruct{i} '=[];']);
                    k = k + 1;
                end
            end
            struktur = eval(txt{1,1}); % endgültige erzeugung der struktur
        end

 


die ersten 23 Zeilen sind wahrscheinlich nicht optimierbar, aber der eval-Befehl stört mich wegen der Laufzeit. Hoffentlich hat jemand eine Idee


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 02.06.2014, 16:33     Titel:
  Antworten mit Zitat      
Hallo

schaue dir als Alternative CELL2STRUCT an.

Dein Code sieht schon recht kompliziert aus, um den nachvollziehen zu können. Vielleicht kannst du deine Cells(Funktion-Eingangsparameter) als Mat-Datei hier anhängen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.06.2014, 17:24     Titel:
  Antworten mit Zitat      
habe die workspacevariablen angehängt (.rar einfach löschen, da .mat hier nicht erlaubt is hochzuladen). Ist ein sehr einfaches Beispiel. Letztlich soll es wie das ergebnis-struct sein. Rolling Eyes

matlab.mat.rar
 Beschreibung:

Download
 Dateiname:  matlab.mat.rar
 Dateigröße:  1.41 KB
 Heruntergeladen:  290 mal
 
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.