Verfasst am: 15.11.2020, 17:14
Titel: Tabel in einer Schleife erweitern
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.
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) ifstrcmp(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
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.
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 ;)
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.
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 ;)
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
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 ;)
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);
% Gibt es eine bessere Möglichkeit als die for-Schleife und strcmp zum Heraussuchen der Haltungen? for oo=1:size(results,1) ifstrcmp(results(oo,2),Haltungen(1,jj)) if jj==1
data = [data; results(oo,1:3)];
else ifsize(data,1) == size(data1,1)+1
data1 = [data1; results(oo,2:3)];
data = [data, data1];
data1 =[];
elseifsize(data,1) ~= size(data1,1)
data1 = [data1; results(oo,2:3)];
% Wie kann DD an TT angehängt werden? ifsize(data,2)==17 && ii==17
TT = table(datenum(data(:,1)), cell2mat(data(:,[3:2:17])));
data =[];
elseifsize(data,2)==17 && ii>=18
DD = table(datenum(data(:,1)), cell2mat(data(:,[3:2:17])));
data =[];
end
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 ;)
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. 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);
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
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.