Spalten von 2D-Array einzeln aussortieren und mitteln
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Spalten von 2D-Array einzeln aussortieren und mitteln
Hallo zusammen,
ich bin schon eine ganze Weile am rumprobieren wie ich mein Problem am besten lösen kann. Es sieht folgendermaßen aus:
Ich erhalte von einem Messgerät einen Datenstring in dem die Spannungswerte von 5 Kanälen ausgelesen werden. Diese Messung wiederhole ich 50 mal. Da es sich um ein PWM-Signal handelt, mich aber nur der High-Pegel interessiert und ich das Messgerät nicht exakt triggern kann, muss ich aus den 50 Messwerten pro Kanal die Low-Pegel(bzw die Abtastungen, die die Flanken getroffen haben) rausfiltern und schließlich über die restlichen Messwerte mitteln.
Ich habe das jetzt wie im Anhang gelöst, indem ich den String aufdrösle, sortiere und in ein 2D-Array schreibe. Dieses 2D-Array in ein Double-Array umwandle, schließlich eine Spalte abtrenne, in ein 1D-Array umwandle, dieses Array elementweise mit 0,99*Maximalwert des Arrays vergleiche, diese durch 0 ersetze und schließlich wieder in ein Array schreibe, welches ich wiederum nach 0en durchsuche, diese entferne und schließlich ein Array mit ausschließlich Messwerten, die in meinem Toleranzbereich liegen erhalte. Darüber mittle ich und bekomme den Wert den ich brauche. Jetzt erscheint mir das arg umständlich und ich müsste nun für jeden Kanal den Vorgang wiederholen. Da ich aber irgendwann 20+ Kanale haben werde wird das riesig und vermutlich auch rechenaufwändig.
Meine Frage nun: Geht das eleganter? Ich bin noch nicht so erfahren mit dem Jonglieren mit Arrays und hab sicherlich einige Fehler drin.
Labview-Version
Im Anhang ein vereinfachtes VI (ohne das auslesen meines Messgeräts, mit Beispielstring), sowie ein Screenshot einiger Messwerte, da sonst ja nur der Beispielstring eingelesen wird und das "aussortieren" nicht deutlich wird. Für Tipps wär ich sehr dankbar!
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
Hallo Thorax,
anbei eine etwas abgeänderte Version. Deine zwei Schleifen am Ende waren schon in der Kategorie Rube-Goldberg: die erste Schleife schreibt Nullen in ein Array, die zweite filtert sie dann wieder aus! Dein Quasi-Indizieren einer Spalte war auch "fragwürdig"...
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
Hey GerdW,
Ja das mit dem "ich schreib Nullen rein und filter sie wieder raus" ist mir natürlich auch aufgefallen
Deswegen ja hier auch die Frage, wie es eleganter läuft. Ich wusste z.B. vorher nicht, daß ich mit einer Array-Konstanten ein neues Array erstellen kann und daran meine benötigten Werte anhängen kann. Und daß die Auto-Indizierung auch "nach innen" läuft hatte ich auch nicht gewusst. Das hilft mir natürlich ungemein! Besten Dank!
Hätte nicht gedacht, daß mir so schnell und so kompetent geholfen werden kann!
16.08.2012, 14:15 (Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2012 17:56 von Lucki.)
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
Gerd hat hier aus unverzeihlicher Faulheit nur die halbe Arbeit geleistet . Denn die linke, unverändert übernommene Hälfte des Vis läßts sich genau so radikal vereinfachen wie die rechte.
Edit: VI in Übereistimmung mit Bild gebracht!
16.08.2012, 14:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2012 14:21 von GerdW.)
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
@Lucki:
Hehe, es gab einen Notruf unseres Prüfstands. Der geht vor!
Und wenn wir schon dabei sind: Auch wenn der Compiler dies (hoffentlich) wegrationalisiert, muss man nicht in der Schleife jedesmal den String neu konvertieren...
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
(16.08.2012 14:20 )GerdW schrieb: @Lucki:
Und wenn wir schon dabei sind: Auch wenn der Compiler dies (hoffentlich) wegrationalisiert, muss man nicht in der Schleife jedesmal den String neu konvertieren...
Doch, so viel Realitätsnähe in der Simulation muss schon sein. Die Stringkonstante steht ja für das Einlesen der Messwerte bei jedem Schleifenduchlauf. Es ist eigentlich gar keine Konstante.
Es ist ausgesprochen positiv, dass Thorax sich die Mühe gemacht hat, das Vi stark zu vereinfachen. Für gewöhnlich wird das ganze Datenerfassungs-Gedöns einfach mit gepostet, wodurch das VI auf unseren PCs mangel Hardware nlcht läuft und wir mehr Mühe haben, die Frage zu beantworten.
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
@Lucki:
Danke für deine weitere Verbesserung, leider passt das angehängte VI nicht zum Screenshot.
Die Stringformatierung funktioniert ebenfalls wie beschrieben, allerdings wollte ich gerne die Schleife beibehalten, da die auch noch mit leicht veränderten Strings klarkommt. (Zumindest hab ich was umgestellt und die Ausgabe hat immer noch funktioniert. Ich kann mir da z.B. auch das VDC noch rausholen, falls ichs doch nochmal benötige.) Die Formatierung verschluckt die Buchstaben einfach, wenn ich das richtig interpretiere?!
Meine im Anfangs-VI gepostete, doppelte While-Schleife hat auch einen Zweck. Wie du gut erkannt hast, hängt da eigentlich noch ein ganz schöner Wust an Instrumentenkonfiguration und Mess-Schleifen drin. Das hab ich nur weggelassen und den Beispiel-String reingehängt.
Also ich als Labview-Neuling find das Programm einfach klasse. Es lassen sich so schnell Erfolge erzielen, für die ich in C++ wahrscheinlich wochenlang gebraucht hätte. Allerdings gibt es einfach soviel zu entdecken, daß ich immer wieder googlen muss (naja eigentlich landet man immer hier im Forum), wenn ich bestimmte Funktionen brauch.
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
(16.08.2012 15:49 )Thorax schrieb: Danke für deine weitere Verbesserung, leider passt das angehängte VI nicht zum Screenshot.
Fehler von mir, habe das falsche Vi oben ausgetauscht
Zitat:Die Formatierung verschluckt die Buchstaben einfach, wenn ich das richtig interpretiere?!
Ja, genau so ist es. Wenn also z.B ein Stringelement lautet:
"56.78 mA", dann ist des Zahlenergebnis bei Formatierung mit Formatstring "%f" 56.78. Das ist nur dann anders, wenn ein Trenzeichen dazwischen wäre, also "56.78, mA". Das sind dann 2 Elemente, also bei Konvertierung nach Stringarray "56.78" und "mA", und bei Formatierung nach Zahl 56.78 und 0.
(Das Beispiel ist möglicherweise schlecht gewählt, ich bin mir jetzt nicht sicher, ob das "m" noch als zur Zahl gehörendens milli = Faktor 10^-3 aufgefasst wird. Hab jetzt keine Lust zum Probieren. Wahrscheinlich aber nicht, das Leerzeichen verhindert das)
16.08.2012, 17:58 (Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2012 17:59 von jg.)
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
(16.08.2012 17:53 )Lucki schrieb: Ja, genau so ist es. Wenn also z.B ein Stringelement lautet:
"56.78 mA", dann ist des Zahlenergebnis bei Formatierung mit Formatstring "%f" 56.78. Das ist nur dann anders, wenn ein Trenzeichen dazwischen wäre, also "56.78, mA". Das sind dann 2 Elemente, also bei Konvertierung nach Stringarray "56.78" und "mA", und bei Formatierung nach Zahl 56.78 und 0.
Nachtrag: Das gilt so leider nicht bei Standard-LabVIEW-Optionen. Üblicherweise nimmt nämlich LabVIEW das Dezimaltrennzeichen des Betriebssystems für Konvertierungen (@Lucki: ich weiß, du hast das in den Optionen ausgeschalten). In Deutschland kommt dann bei 56.78 und %f nur ein 56 raus. Wenn man auf Nummer sicher gehen will, dann sollte man explizit das Dezimaltrennzeichen beim Formatstring angeben, also z.B. %.;%f oder %,;%f !!!
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: Spalten von 2D-Array einzeln aussortieren und mitteln
(16.08.2012 17:58 )jg schrieb: [quote='Lucki' pid='141076' dateline='1345136033']
Wenn man auf Nummer sicher gehen will, dann sollte man explizit das Dezimaltrennzeichen beim Formatstring angeben, also z.B. %.;%f oder %,;%f !!!
Das kann ich nur unterstreichen. Da ist man auch sicher, wenn ein Programm kompiliert und auf einem anderen PC verwendet wird, dass es da keine unliebsamen Überraschungen gibt.
Ja, ich habe sowohl in den Labview-Grundeinstellungen als auch in den Windows-Einstellungen den Punkt konfiguriert.
Wenn jetzt jemand mit Komma als Dezimalzeichen in den Messdaten kommt, dann kann ich allerdings z.B, die Funktion links im Bild
überhaupt nicht verwenden: Mit True wird das LF-Systemzeichen verwendet, mit False das Windows-Systemzeichen - jedes Mal ist es der Punkt. Ich bin dann gewzungen, die Funktin rechts im Bild zu verwenden. Trotzdem: Gute Entscheidung, das provinzlerische Komma in beiden Systemen gar nicht erst zuzulassen.