Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Tabellen in Matlab bearbeiten

 

Lankev
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 01.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2019, 16:23     Titel: Tabellen in Matlab bearbeiten
  Antworten mit Zitat      
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.

Liebe Grüße
Lankev
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 20.146
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 01.07.2019, 16:57     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.915
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.07.2019, 12:00     Titel: Re: Tabellen in Matlab bearbeiten
  Antworten mit Zitat      
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

Vielleicht so? Teste das mal und passe es an das an, was es machen soll.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 01.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2019, 09:34     Titel:
  Antworten mit Zitat      
Danke euch zwei!

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?

Code:
Data = xlsread('Dateiname.xlsx');


so wäre mein erster Gedanke gewesen, aber ich weiß nicht ob das Programm das dann verwenden kann.

Lg Lankev
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.915
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.07.2019, 13:33     Titel:
  Antworten mit Zitat      
Hallo Lankev,

Zitat:
Die ", 1" in der 4. und 5. Zeile bedeuten dass die Größe der Tabelle von der ersten Spalte abhängt oder?

Welche Tabelle?
size(x, 1) gibt die Anzahl der Zeilen einer Matrix zurück siehe:
Code:

true(n,1) erzeuigt einen [n x 1] Vektor vom Typ logical. Siehe
Code:


Zitat:
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?
Code:
Data = xlsread('Dateiname.xlsx');

so wäre mein erster Gedanke gewesen, aber ich weiß nicht ob das Programm das dann verwenden kann.

Probiere es einfach mal aus. Falls es Schwierigkeiten gibt, poste eine Erklärung dazu.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 01.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.07.2019, 14:10     Titel:
  Antworten mit Zitat      
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?

So sieht mein Code aus zurzeit:
Code:
Data = xlsread('EAF_Power_input_bearb.xlsx');  

P = 0;
PCount = 0;
zeroCount = 0;
mindP = 1.5e9;
keep = true(size(Data, 1), 1);

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.

Vielen vielen dank jetzt schon für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Lankev
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 01.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2019, 09:45     Titel:
  Antworten mit Zitat      
Hallo zusammen, habe meinen code jetzt richtig programmiert

Code:
Data = xlsread('EAF_Power_input_bearb.xlsx');  

P = 0;
PCount = 0;
zeroCount = 0;
mindP = 1.5e9;
keep = true(size(Data, 1), 1);
Leerlauf = 0;

for k = 1:size(Data, 1)  
  P = P + Data(k, 2);
  if P < mindP && P > 0
    PCount = PCount + 1;
  elseif Data(k, 2) ~= 0
    PCount = PCount + 1;
  else P > mindP && Data(k, 2) == 0 && Data(k+1, 2) == 0 && Data(k+2, 2) == 0;
       zeroCount = zeroCount + 1;
      if zeroCount > 10
         break
      end      
  end
end


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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.915
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.07.2019, 12:49     Titel:
  Antworten mit Zitat      
Hallo Lankev,

Code:
Data = xlsread('EAF_Power_input_bearb.xlsx');  

P = 0;
PCount = 0;
zeroCount = 0;
mindP = 1.5e9;
% keep = true(size(Data, 1), 1);  % Nicht verwendet
% Leerlauf = 0;   % Nicht verwendet

n = size(Data, 1);
PCountCollect = zeros(1, n);  % Großzügige Pre-Allocation
zeroCountCollect = zeros(1, n);
iCollect = 0;

for k = 1:n
  P = P + Data(k, 2);
  if P < mindP && P > 0
    PCount = PCount + 1;
  elseif Data(k, 2) ~= 0
    PCount = PCount + 1;
  else P > mindP && Data(k, 2) == 0 && Data(k+1, 2) == 0 && Data(k+2, 2) == 0;
       zeroCount = zeroCount + 1;
      if zeroCount > 10
         iCollect = iCollect + 1;
         PCountCollect(iCollect) = PCount;
         zeroCountCollect(iCollect) = zeroCount;
         PCount = 0;
         zeroCount = 0;
      end      
  end
end

PCountCollect = PCountCollect(1:iCollect);
zeroCount = zeroCountCollect(1:iCollect);

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 01.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2019, 13:00     Titel:
  Antworten mit Zitat      
Vielen Lieben Dank, Es funktioniert jetzt soweit!

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.

Mfg Lankev
Private Nachricht senden Benutzer-Profile anzeigen
 
aharrer
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 01.06.17
Wohnort: 92318 Neumarkt
Version: 2017b
     Beitrag Verfasst am: 16.07.2019, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

vielleicht noch ein Tipp zur Optimierung der Einlese- und Schreib-Geschwindigkeit:
Code:


xlsread wird ja seit geraumer Zeit nicht mehr empfohlen.

Viele Grüße

aharrer
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2019 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.