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

Tabel in einer Schleife erweitern

 

Kopi
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 15.11.2020, 17:14     Titel: Tabel in einer Schleife erweitern
  Antworten mit Zitat      
Hallo,

ist es möglich Tabellen, die mit dem Befehl table erstellt wurden, in einer Schleife zu erweitern. Dabei soll der Variablenname in der Table-Tabelle der Name der hinzugefügten Variable sein. Oder, muss die table-Tabelle vorher angelegt werden. Letzteres erscheint mir etwas umständlich, da ich so später den Code an mehreren Stellen anpassen muss, wenn weitere Variablen hingefügt werden sollen.

Mit dem Code möchte ich auf verschiedene Datenbanken mit meinen Simulationsergebnisse zugreifen, zwischenspeichern und später visualisieren. Jede Datenbank soll dabei eine Variable erhalten. Der Code den ich versuche zu schreiben, ist aber im Moment noch darauf ausgelegt, als wenn nur eine Datenbank existiert. Die Zeit und Haltungen (Kanäle) werden als einzelne Variablen erstellt.

Code:
Time = {'Time'};
 H_396= {'H_396'}; %--> funktioniert! Warum?
 Haltungen = {'H_396','H_227','H_162','H_164_B',...
    'Verdolung_Teil_2_A_A_B','Auslass_RÜB_3_B',...
    'H_535','H_572'};
T=table(Time, H_396,{'H_227'},{'H_162'},{'H_164_B'},...
    {'Verdolung_Teil_2_A_A_B'},{'Auslass_RÜB_3_B'},...
    {'H_535'},{'H_572'});

data =[];
for ii = 17%:numel(folders(:,1))
    path1 = ['C:\2D_Modell\' char(folders(ii,1))  '\'];
    conn = sqlite([path1 dbfile], 'readonly');
    if(isempty(conn.IsReadOnly))
        disp('Cannot connect database')
        disp(conn.IsReadOnly)
        return;
    else
        disp('Database connected')
    end
    sqlquery = 'SELECT * FROM LAU_GL_EL'; %Greife in der Datenbank auf LAU_GL_EL zu
    results = fetch(conn, sqlquery);
   
%Suche nach den Haltungen in der Datenbank und in data zwischenspeichern
    for jj=1:numel(Haltungen)
       
% Kann für diese Schleife auch eine Logische Abfrage durchgeführt werden? --> noch nicht geschafft
        for oo=1:size(results,1)
            if  strcmp(results(oo,2),Haltungen(1,jj))
                if jj==1
                    data = [data; results(oo,1:3)]; %Time wird nur einmal ausgelesen und zwischengespeichert 1. Time, 2. Haltung, 3. Durchfluss
                                   
                else
               
                    data = [data; results(oo,2:3)];
                end
            end
        end
       
        if jj==1
            T.Time = table(data(:,1));  
            T.H_396 = data(:,3);
        else
            T.Haltungen(jj+1) = data(:,3); %--> funktioniert nicht
        end
        data = [];
    end
 


Hoffe ich habe mein Problem ausreichend beschrieben.

Klasse wäre es auch gewesen, wenn ich an data erst alle Ergebnisse einer Datenbank hätte angehängen können und diese im insgesamt in die table-Tabelle hätte verschieben können. Warum auch immer, habe ich es aber nicht geschafft.

Viele Grüße
Kopi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2020, 17:29     Titel:
  Antworten mit Zitat      
Hallo,

du kannst jederzeit mit [T1, T2] oder [T1; T2] bestehende Tables nebeneinander oder untereinander setzen. Es müssen jedoch immer komplette Zeilen oder Spalten hinzugefügt werden. Solltest du unvollständige Daten haben, kannst du mit NaN auffüllen.

Zitat:
wenn ich an data erst alle Ergebnisse einer Datenbank hätte angehängen können und diese im insgesamt in die table-Tabelle hätte verschieben können.

Mir ist nicht klar, was das heißt. Woran willst du das hängen und was genau willst du dann wie in den Table verschieben?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 15.11.2020, 18:15     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe es genauso gemeint wie du vorgeschlagen hast. Warum auch immer hat es mit [T1, T2] nicht geklappt. Ich weiß, dass ich so die daten an ein Array als Spalte anhängen kann und mit ";" weitere Zeilen hinzufüge.

Danach kam ich auf die Idee die Ergebnisse aus den Datenbanken gleich in eine table-Tabelle zu schreiben und nicht den Umweg über "data" zu wählen. Bin da aber am beschriebenen Problem mit table gescheitert.

Viele Grüße
Kopi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2020, 18:33     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Warum auch immer hat es mit [T1, T2] nicht geklappt.

Wenn T1 und T2 Tables mit verschiedenen Variablennamen und gleicher Zeilenanzahl sind, klappt es. Wenn etwas nicht klappt, dann bitte ein möglichst kompaktes und vor allem reproduzierbares Beispiel geben und vor allem: die Fehlermeldung angeben!

Zitat:
Bin da aber am beschriebenen Problem mit table gescheitert.

Ich kann nur leider bei rund 30 Zeilen nicht reproduzierbaren Codes nicht nachvollziehen, was das Problem eigentlich ist.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 15.11.2020, 19:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

mir würde es schon reichen, wenn ich ein kleines Beispiel habe, wie ich table-Tabellen über eine Schleife mit Variablen erweitern kann.

Der Code

Code:

.....
else
                 data = [data; results(oo,2:3)];
end


Funktioniert nicht. Hauptproblem ist wohl, dass ich in der Schleife eine Spalte an data(:,1:3) hinzufüge, die immer weiter mit Zahlen aufgefüllt wird. Ich muss hier wahrscheinlich einen Zwischenschritt einfügen und eine neue Variablen im Block an "data" anfügen. Oder ich füge eine Spalte mit lauter Nullen an, die ich dann überschreibe.

Meine ursprüngliche Frage zu den table und der Erweiterung in der Schleife bleibt. Funktioniert dies?

Code:

....
else
            T.Haltungen(jj+1) = data(:,3); %--> funktioniert nicht
end


Muss für heute leider Schluss machen.
Viele Grüß
Kopi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2020, 20:36     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Funktioniert nicht.

Nochmal: gib bitte die Fehlermeldung an!
Damit das funktionieren kann, muss results ein Table mit 2 Variablen sein, die mit den Variablen von data übereinstimmen.

Zitat:
Meine ursprüngliche Frage zu den table und der Erweiterung in der Schleife bleibt. Funktioniert dies?

Du hast ja festgestellt, dass es nicht funktioniert. Damit es funktioniert, muss die Anzahl der indizierten Elemente auf beiden Seiten gleich sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 16.11.2020, 08:04     Titel:
  Antworten mit Zitat      
Guten Morgen Harald,

ich konnte gestern Abend doch noch ein wenig Arbeiten. Der Code funktioniert jetzt bis auf die Sache mit den table-Tabellen (siehe unten). Anbei der Code für zwei Ergebnissdatenbanken (for ii = 17:18 ). Die erste wird in die table-Tabelle TT und die zweite noch nach DD geschrieben. Die Zeilen beider Tabellen sind gleichlang! Wie kann DD an TT angehängt werden?

Daneben würde ich gern wissen, ob der Code (for-Schleife) mit dem die einzelnen Haltungen in der Tabelle der Datenbank gesucht werden, noch anders geschrieben werden. Eine logische Abfrage (Ergebniss 0 oder 1) habe ich nicht hinbekommen. results(:,2) und Haltungen(1,: ) sind jeweils als cell hinterlegt. Ein Haltungsname ist beispielsweise 'H_396'.

Eine Datenbank hat ca. 600MB und die Tabelle "LAU_GL_EL" hat jeweis ca. 3.1 Millionen Zeilen. Zwar konnte mein Rechner gestern nicht mit voller Leistung arbeiten, weil im Hintergrund noch eine Simulation lief, aber das Laden einer Datenbank und das Durchsuchen einer Tabelle hat aufgrund der Größe gut 2-3 Minuten gedauert. Da ich derzeit 7 Ergebnisdatenbank insgesamt habe, benötigt der Rechner allein 14 Minuten für diesen Arbeitsschritt. Das kann nicht effizient sein.

Code:

for ii = 17:18 %:numel(folders(:,1))
    path1 = ['C:\2D_Modell\' char(folders(ii,1))  '\'];
    conn = sqlite([path1 dbfile], 'readonly');
    if(isempty(conn.IsReadOnly))
        disp('Cannot connect database')
        disp(conn.IsReadOnly)
        return;
    else
        disp('Database connected')
    end
    sqlquery = 'SELECT * FROM LAU_GL_EL'; %Greife auf LAU_GL_EL zu
    results = fetch(conn, sqlquery);
   
    for jj=1 : numel(Haltungen)
 
%  Gibt es eine bessere Möglichkeit als die for-Schleife und strcmp zum Heraussuchen der Haltungen?      
        for oo=1:size(results,1)
            if  strcmp(results(oo,2),Haltungen(1,jj))
                if jj==1
                    data = [data; results(oo,1:3)];
                else
                    if size(data,1) == size(data1,1)+1
                        data1 = [data1; results(oo,2:3)];
                        data = [data, data1];
                        data1 =[];
                    elseif size(data,1) ~= size(data1,1)
                        data1 = [data1; results(oo,2:3)];
                       
                    end
                end
            end
        end
       
% Wie kann DD an TT angehängt werden?
        if size(data,2)==17 && ii==17
            TT = table(datenum(data(:,1)), cell2mat(data(:,[3:2:17])));
            data =[];
        elseif size(data,2)==17 && ii>=18
            DD = table(datenum(data(:,1)), cell2mat(data(:,[3:2:17])));
            data =[];
        end
       
    end
    close(conn);
end
 



Bis heute Abend viele Grüße
Kopi
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.435
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.11.2020, 09:04     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Wie kann DD an TT angehängt werden?

Da habe ich keine bessere Antwort als die, die ich schon gegeben habe:
Zitat:
du kannst jederzeit mit [T1, T2] oder [T1; T2] bestehende Tables nebeneinander oder untereinander setzen.


Statt der beiden geschachtelten for-Schleifen könnte ismember helfen:
Code:
[tf, loc] = ismember(["abc", "def", "ghi"], ["jkl", "ghi", "def"])
tf =

  1×3 logical array
   0   1   1

loc =
     0     3     2


Alternativ könntest du die SQL-Abfrage so konstruieren, dass du nur die Daten holst, die du willst. Wenn du dich mit SQL nicht gut auskennst, kann der Database Explorer hilfreich sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kopi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 28.09.08
Wohnort: weit weg von der Heimat
Version: R2020b
     Beitrag Verfasst am: 17.11.2020, 20:31     Titel:
  Antworten mit Zitat      
Guten Abend Harald,

konnte gestern Abend leider nicht weitermachen. Du hast einen ausgeprägten Humor. Über den letzten Satz musste ich herzlichst lachen!

Vielen Dank dafür deinen Tipp direkt auf die Datenbank zuzugreifen. Habe es ausprobiert und mich ein wenig mit der Syntax von SQLite beschäftigt ohne den DatabaseExplorer zu nutzen. Smile So geht der Zugriff deutlich schneller.

Code:

Haltungen = {'H_396','H_227' ,'H_162','H_164_B',...
    'Verdolung_Teil_2_A_A_B','Auslass_RÜB_3_B',...
    'H_535','H_572'};
for ii = 17:numel(folders(:,1))
    path1 = ['C:\2D_Model\' char(folders(ii,1))  '\'];
    conn = sqlite([path1 dbfile], 'readonly');
    if(isempty(conn.IsReadOnly))
        disp('Cannot connect database')
        disp(conn.IsReadOnly)
        return;
    else
        disp('Database connected')
    end
       
    for jj=1 : numel(Haltungen)
    % ; %Greife auf LAU_GL_EL zu
    sqlquery = ['SELECT * FROM LAU_GL_EL  WHERE KANTE =''' char(Haltungen(jj)) ''';'];
    results = fetch(conn, sqlquery);    
     
    end
   
    close(conn);
end

 


Da ich immer noch nicht die liebe beim DatabaseExplorer gefunden habe, werde ich die Probleme die ich mit "IHR" hier https://www.gomatlab.de/datenbank-mit-sqlite-ffnen-t49926.html
beschreiben.


Viele Grüße
Kopi
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.