Verfasst am: 01.07.2019, 15:23
Titel: Tabellen in Matlab bearbeiten
Hallo zusammen,
Ich habe eine .csv Datei in matlab eingelesen und jetzt möchte ich mit matlab diese bearbeiten bzw. eine neue bearbeitete Datei mir ausgeben lassen.
In der zweiten Spalte meiner Liste sind Leistungen und die sind manchmal null. Wenn eine Summen leistung von mindestens 1 Millionen Watt zusammengekommen ist, soll matlab alle Zeilen mit 0 Watt herauslöschen bis auf 2 Zeilen, diese sollen bleiben. Ab diesem Punkt soll wieder von Vorne die Summe der Leistungen gezählt werden und das gleiche wieder passieren. (Wenn 1Mio Watt erreicht, die nächsten 0er Felder bis auf 2 Löschen)
Bin leider ein kompletter matlab Neuling und würd mich über jede noch so kleine Hilfe freuen.
cumsum sollte helfen um die Summen zu berechnen. Dann find, um die erste Überschreitung zu finden. Dann nochmal find, um die nächste von 0 verschiedene Stelle zu finden und die dazwischenliegenden nach Wunsch zu entfernen.
Anhand eines Beispiels ist sowas oft anschaulicher.
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 ;)
Verfasst am: 03.07.2019, 11:00
Titel: Re: Tabellen in Matlab bearbeiten
Hallo Lankev,
Bitte poste, in welchem Format die Inputs vorliegen. Dass sie aus einem CSV-File stammen, ist dabei nicht wichtig.
Die Methode, die Harald beschrieben hat, ist sehr gut. Wenn du gerade erst anfängst in Matlab zu programmieren, wäre eine Schleife einfacher zu schreiben, allerdings läuft sie weniger effizient. Wenn es aber nicht schlimm ist, eine halbe Sekunde länger zu warten:
Code:
Data = rand(1000, 2); % Test data
S = 0;
zeroCount = 0;
keep = true(size(Data, 1), 1);
for k = 1:size(Data, 1)% Schliefe über die Zeilen
S = S + Data(k, 2);
if S > 1e6
% "alle Zeilen mit 0 Watt herauslöschen bis auf 2 Zeilen, diese sollen bleiben." if Data(k, 2) == 0
zeroCount = zeroCount + 1;
if zeroCount > 2
keep(k) = false;
end else% Data(k, 2) ~= 0:
S = 0;
zeroCount = 0;
end end end
zu diesem Code muss ich noch etwas fragen. Die ", 1" in der 4. und 5. Zeile bedeuten dass die Größe der Tabelle von der ersten Spalte abhängt oder?
Und das ", 2" in der 6. Zeile bedeuted dass die Daten aus der 2. Spalte verwendet werden oder?
Und zu deiner Frage @Jan S in welchem Format die Inputs vorliegen. Ich weiß leider nicht genau was du da meinst, habe Watt-Messwerte im Minutentakt und das über einen langen Zeitraum hinweg. Die Daten selbst, also die Watt-Werte sind ganz normale Zahlen und wurden schon von einem anderen Programm nach Excel importiert.
Und zu meinen Inputs wollte ich fragen wie ich es am Besten importieren soll?
Und das ", 2" in der 6. Zeile bedeuted dass die Daten aus der 2. Spalte verwendet werden oder?
Ja.
Data(k, 2)
ist das Element aus der zweiten Spalte in der k.ten Zeile.
Diese grundlegenden Fragen zur Indizierung in Matlab lernst du am besten beim Lesen der "Getting Started" Kapitel in der Dokumentation. Matlabs "OnRamp" ist auch sehr hilfreich.
Zitat:
Und zu deiner Frage @Jan S in welchem Format die Inputs vorliegen. Ich weiß leider nicht genau was du da meinst, habe Watt-Messwerte im Minutentakt und das über einen langen Zeitraum hinweg.
Eine mögliche Antwort wäre: Die Daten liegen als [100 x 2] Matrix vom Typ double vor. Die physikalische Bedeutung ist für die Lösung in Matlab egal.
Zitat:
Und zu meinen Inputs wollte ich fragen wie ich es am Besten importieren soll?
Vielen vielen dank für die Hilfe, weiß nicht was ich ohne dich bzw dieses Forum gemacht hätte.
Hab das jetzt meinem Problem angepasst und für meine erste Charge in der Tabelle (also bei >1.5e9 und mindestens 2 Nullen) funktioniert es wie gehofft. Im Workspace wird mir die Länge, in der Leistung fließt ausgegeben.
Mein Programm hört wegen meinem "break" logischerweise auf alles durchzugehen.
wenn ich dieses Break aber weggebe bekomme ich nicht die Länge meiner einzelnen Chargen als ergebnis sondern die Summe.
Gibt es eine Möglichkeit dass das Programm mir meine Anzahl an Leistungen die hineingingen als ergebnis ausgibt und dann wieder für die nächste charge von vorne beginnt?
for k = 1:size(Data, 1)
P = P + Data(k, 2);
PCount = PCount + 1;
if P > mindP && Data(k, 2) == 0;
zeroCount = zeroCount + 1;
if zeroCount > 2 break end end end
Schlussendlich bräuchte ich die Anzahl an Leistungseingängen bis eben 1.5e9 eingegangen ist, die Anzahl an Null Leistung bis dann wieder Leistung kommt und für die Nächste charge das gleiche.
Jedoch statt dieses "breaks" am Ende möchte ich PCount und zeroCount abspeichern und die schleife von diesem Punkt an neu zählen lassen und diese werte dann wieder zu PCount und zeroCount hinzuspeichern (nicht überschreiben)
sind wsl 2 ganz kurze befehle aber ich find in der Hilfe nichts hilfreiches...
Ich hätte noch eine kurze frage. Wie kann man es machen, dass ein zähler programmiert wird welcher nur zählt, wenn mind 10 mal genau derselbe Wert kommt, also zum Bsp. 0. Es soll erst die Anzahl an 0er gezählt werden wenn mindestens 10 0er direkt hintereinander stehen.
xlsread wird ja seit geraumer Zeit nicht mehr empfohlen.
Viele Grüße
aharrer
Einstellungen und Berechtigungen
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.