mikrocontroller.net

Forum: PC-Programmierung Messauswertung - Minima/Maxima suchen


Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe folgendes Problem, ich mache jeden Tag sehr viele Messungen und 
bin nun auf der Suche das ganze etwas zu erleichtern.
Ich habe pro Messung ca. 1000 x und y Werte, da ich aber 
Vergleichsmessungen machen hab ich da teilweise bis zu mehrere 1000 
Dateien.
Ich würd mir gern ein Prog schreiben, was mir in einem vorgegebenen 
x-Bereich  den kleinsten bzw. größten y-Wert raussucht und diese Werte 
dann ausgibt. Was meint ihr wie sich so ein Prog am besten umsetzen 
lässt, gnuplot, C++, awk? Oder gibt es da schon was ?

Gruß Mathias

Autor: Frank B. (frankman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde dir evtl. die Software CATMAN von der Firma Hottinger Baldwin 
empfehlen. Es handelt sich dabei um eine spezielle Messtechnik-Software, 
die extra auf solche Probleme zugeschnitten ist. Die Software erlaubt 
das erfassen, speichern, auswerten von Messwerten. Die Software kann 
G-byte-weise Messdaten verwalten oder grafisch darstellen. Kostet 
allerdings etwas.
Aber zusätzlich hast Du da einen sehr mächtigen Script-Editor zu 
verfügung, der auch eine Datenbankanbindung, Kommunikation mit Word und 
Excel ect. zulässt und sehr schnell und einfach zu erlernen ist.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip, darüber werd ich mal nachdenken, aber kurzfristig 
muss ich mir erst mal selbst was basteln und hatte auf ein paar Tips 
gehofft...

Gruß Mathias

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:
> Danke für den Tip, darüber werd ich mal nachdenken, aber kurzfristig
> muss ich mir erst mal selbst was basteln und hatte auf ein paar Tips
> gehofft...

Na ja. Was soll man dir da an Tips geben?
Welche Programmiersprache kannst du denn?
In der würde ich das machen.

Die Funktionalität an sich ist ja eher trivial wenn man eine
Programmiersprache beherrscht.

Wenn du aber erst noch programmieren lernen musst:
Kauf dir was Fertiges oder such dir jemanden der das
kann. Das geht kurzfristig schneller als wenn du erst noch
programmieren lernen musst. Aus deinem 'kurzfristig' werden
sonst nämlich schnell mal ein paar Wochen.

Autor: M@D (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend!

Liegen die Messungen bzw. deren Aufzeichnungen denn schon als Datei auf 
dem Rechner vor (z.B. als CSV-Datei), oder wird das Ganze über 'ne 
Schnittstelle (COM/USB) in "Echtzeit" eingelesen und verarbeitet?
Ersteres wäre in der Umsetzung ja relativ einfach, da könnte ich Dir ein 
kleines Programm schreiben, welches die Daten vergleicht.
Zweiteres ist natürlich auch möglich - da müßte man dann halt das 
Kommunikationsprotokoll kennen, um die Daten auseinander zu pflücken.
Mit welchem OS arbeitest Du denn vorzugsweise bzw. soll das Ganze unter 
WIN oder Linux laufen?
Falls Dateien bereits vorhanden sein sollten, dann schick' sie bitte per 
Mail: m a d - m e d i a @ g m x . d e (ohne Leerzeichen)

Wenn Du ein paar Eckdaten dazu frei gibst, dann werd' ich mal schauen, 
was man da machen kann.

Greetz M@D

Autor: Mathias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Dateien liegen schon vor, als *.txt, mach mal in eine in den 
Anhang...
Die Grundlagen in C/C++ krieg ich hin...
Würd die Daten aus dem File gerne in ein 2D Array speichern, weiß aber 
nicht wie es geht...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:
> Ja, die Dateien liegen schon vor, als *.txt, mach mal in eine in den
> Anhang...
> Die Grundlagen in C/C++ krieg ich hin...
> Würd die Daten aus dem File gerne in ein 2D Array speichern, weiß aber
> nicht wie es geht...

Musst du mit den Daten sonst noch was machen?

Grund: Um das Minimum/Maximum zu finden, musst du die Daten
nicht im Speicher zwischenspeichern.

Du liest eine Zeile ein und vergleichst sie mit dem momentanen
Minimum/Maximum. Falls erforderlich gibt es ein Update der
entsprechenden Min/Max Variablen.
Und das wars dann auch schon. Du brauchst die eingelesenen
Daten nie mehr wieder. Also wozu sie aufwändig speichern?

in Pseudocode:

   Datei öffnen (mit entsp. Fehlerbehandlung)

   erstes Datenpärchen lesen und als momentanes Min/Max zuweisen

   solange ein Datenpärchen von der Datei gelesen werden kann {
      Sind die Zahlen kleiner als Min
         -> Min einen neuen Wert zuweisen
      Sind die Zahlen größer als Max
         -> Max einen neuen Wert zuweisen
   }

   Datei schließen

   Min/Max  ausgeben

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ein Ansatzpunkt
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Help()
{
  printf( "Usage: MinMax <filename>\n" );
}

int main( int argc, char* argv[] )
{
  double MinX, MinY;
  double MaxX, MaxY;
  double TmpX, TmpY;
  unsigned char First = 1;
  char InBuffer[1024];
  
  if( argc != 2 ) {
    Help();
    return EXIT_FAILURE;
  }
  
  FILE* hFile = fopen( argv[1], "r" );
  if( hFile == NULL ) {
    printf( "Error opening file: '%s'\n", argv[1] );
    return EXIT_FAILURE;
  }
  
  while( fgets( InBuffer, sizeof( InBuffer ), hFile ) &&
         strcmp( InBuffer, "#End of File" ) != 0 ) {
    if( strlen( InBuffer ) == 0 )
      continue;
      
    if( sscanf( InBuffer, "%lf %lf", &TmpX, &TmpY ) == 2 ) {
      if( First ) {
        MinX = TmpX;
        MinY = TmpY;
        MaxX = TmpX;
        MaxY = TmpY;
        First = 0;
      }
      else {
        if( TmpY < MinY ) {
          MinY = TmpY;
          MinX = TmpX;
        }
        if( TmpY > MaxY ) {
          MaxY = TmpY;
          MaxX = TmpX;
        }
      }
    }
  }
  
  if( !feof( hFile ) ) {
    printf( "Error during reading of: '%s'\n", argv[1] );
  }
  else {
    printf( "Minimum: x:%lf y:%lf\n", MinX, MinY );
    printf( "Maximum: x:%lf y:%lf\n", MaxX, MaxY );
  }    
  
  fclose( hFile );
  
  return EXIT_SUCCESS;
}

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,
das hilft mir ein ganzes Stück weiter...
Vom Konzept her hab ich so ähnlich gedacht...
Eine Frage noch,
wenn ich das richtig verstanden habe übergebe ich der main Funktion bei 
argv den Dateinamen?
Ich habe ja meistens um die 500 Dateien...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:
> Vielen Dank,
> das hilft mir ein ganzes Stück weiter...
> Vom Konzept her hab ich so ähnlich gedacht...
> Eine Frage noch,
> wenn ich das richtig verstanden habe übergebe ich der main Funktion bei
> argv den Dateinamen?

Ja.

> Ich habe ja meistens um die 500 Dateien...

Würde ich nicht per C-Program erledigen, sondern extern von der
Shell aus mit einer Batch-Datei.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,
bin jetzt schon ein bissl weiter, mir ist jetzt aber aufgefallen das es 
doch besser ist, wenn ich die Werte in ein 2D-array schreibe.
Mit fgets lade ich ja quasi alles,
wie kann ich denn die Werte Zeile für Zeile in das arraa einlesen?

Vielen Dank schon mal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:
> Hallo nochmal,
> bin jetzt schon ein bissl weiter, mir ist jetzt aber aufgefallen das es
> doch besser ist, wenn ich die Werte in ein 2D-array schreibe.

Das glaub ich nicht.
Das willst du unter allen Umständen vermeiden, wenn es nur irgendwie
möglich ist. Denn dann wirds richtig aufwändig.
Und wenn ich mir so ansehe an welchen Problemen du so scheiterst,
glaube ich nicht, dass du das in C korrekt hinkriegst.

Aber seis drum:
Die einfachste Variante ist es, das File 2 mal zu lesen.
Einmal um festzustellen wieviele Datensätze es gibt.
Nach dieser Zahl wird dann das Array dynamisch allokiert
und erst dann werden die Daten in das Array geladen.

> wie kann ich denn die Werte Zeile für Zeile in das arraa einlesen?

Genauso wie ich es jetzt auch mache.

Wir sind jetzt genau an dem Punkt an dem ich sagte:
Such dir jemanden der das kann oder kauf dir was Fertiges.
Denn aus dem 'schnell mal machen' werden sonst Wochen.
Du bist jetzt genau an dem Punkt angelangt an dem sich die
Aufgabenstellung zu einer Mehr-Wochenarbeit entwickelt, weil dir
die Grundlagen fehlen.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C is kein Problem,
ich habe aber bisher nichts in die Richtung mit Dateien bearbeiten etc 
gemacht. Was ich bei dem Programm momentan noch als Problem sehe, das 
ich nur in einem bestimmten Bereich der x-Werte das Minima bzw. Maxima 
raussuchen will und nicht von der gnazen Datei.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:
> C is kein Problem,

Sorry.
Aber wenn es an dynamischer Speicherverwaltung happert,
am Einlesen von Daten in ein Array, dann IST C EIN PROBLEM.

Das sind alles C-Grundlagen: Einführung in C, Lektion 6 oder 7

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias wrote:

> ich nur in einem bestimmten Bereich der x-Werte das Minima bzw. Maxima
> raussuchen will und nicht von der gnazen Datei.

Wie definiert sich denn der Bereich?

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,
ich hatte nen Fehler drin es läuft jetzt erst mal...
den Bereich möchte ich selber angeben

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um so etwas mit C zu machen muss man schon Masochist sein, 
Skriptsprachen sind dazu besser geeignet. Beispiel in Ruby:
# Bereich definieren
bereich = 5.0..10.5

# auf jede Datei im Ordner daten anwenden
Dir.glob('daten/*.txt').each do |name|
  # Datei öffnen und zeilenweise bearbeiten
  File.open(name).each_line do |l|
    # Zeile aufspalten und zu float konvertieren
    x, y = line.split.map{|n| n.to_f}
    if bereich.include?(x)
      # mit y initialisieren, falls min/max-Werte noch leer
      y_min ||= y
      y_max ||= y

      # min/max-Werte zuweisen
      y_max = [y_max, y].max
      y_min = [y_max, y].max
    end
  end
end

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hört sich gut an,
aber dazu müsste ich erst ne skriptsprache lernen...

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
awk kann ich nur wenige Grundlagen...

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hört sich gut an, aber dazu müsste ich erst ne skriptsprache
> lernen...

Falls du öfters mal ganz schnell ein kleines Progrämmchen schreiben
möchtest, bei dem die Entwicklungszeit deutlich wichtiger als die
Laufzeiteffizienz ist, solltest du erwägen, eine der Sprachen Perl,
Python oder eben Ruby zu lernen.

Diese Sprachen (insbesondere die letzten beiden) sind sehr leicht zu
lernen. Nach einem Tag Tutorial Durcharbeiten kann man schon ziemlich
viel. Da alle drei Sprachen auch interaktiv benutzt werden können, ist
auch "exploratives Lernen" möglich.

Im Gegensatz zu typischen Skriptsprachen (wie bspw. Shell-Sprachen)
sind die Perl, Python und Ruby vollwertige Programmiersprachen mit
Objektorientierung, sehr umfangreichen Bibliotheken usw., so dass man
auch größere Softwareprojekte damit realisieren kann.

So, und jetzt zum Spaß deine Aufgabe einmal als Python-Progrämmchen
unter Verwendung von funktionalen Elementen:
u=1.3; o=2.7; f="test.txt"
print max(y for x,y in (map(float, z.split()) for z in file(f)) if u<=x<=o)

u und o sind die vorgegebenen Grenzen für x, f der Dateiname.

Der Ausdruck nach dem print bestimmt das Maximum aller y für alle
Zahlenpaare (x,y) die sich aus dem Aufsplitten der einzelnen Zeilen
von f in zwei Float-Zahlen ergeben, und deren x in [u,o] liegt.

Man kann das Programm natürlich genauso gut "klassisch" mit einer
For-Schleife und Variablen für Zwischenergebnisse hinschreiben. Jedem
wie's ihm beliebt.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Andreas Schwarz
Wie würde die Erweiterung zu dem Ruby Skript aussehen um die Min/Max 
Werte in eine Datei zu schreiben?
Hab mir jetzt überlegt, das ich mir Ruby aneignen möchte...

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. so:
# Bereich definieren
bereich = 5.0..10.5

outfile = File.open('minmax.txt', 'w')

# auf jede Datei im Ordner daten anwenden
Dir.glob('daten/*.txt').each do |name|
  # Datei öffnen und zeilenweise bearbeiten
  File.open(name).each_line do |l|
    # Zeile aufspalten und zu float konvertieren
    x, y = line.split.map{|n| n.to_f}
    if bereich.include?(x)
      # mit y initialisieren, falls min/max-Werte noch leer
      y_min ||= y
      y_max ||= y

      # min/max-Werte zuweisen
      y_max = [y_max, y].max
      y_min = [y_max, y].max

      outfile.printf("%f, %f\n", y_max, y_min)
    end
  end
end

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.