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!
Ich stehe im Moment irgendwie auf der Leitung. Ich benutze LabVIEW zwar seit längerer Zeit immer mal wieder, aber mit Arrays habe ich leider (noch) keine tiefgreifenden Erfahrungen gemacht, auch die Suchfunktion hat mich auf keine zündende Idee gebracht.
Ich habe einen 2D-Array mit Byte-Werten (0-255) gefüllt und möchte diesen auf identische Zeilen durchsuchen und dann die erste gefunden Zeile behalten, die danach gefunden Zeilen löschen. Wenn LabVIEW dann eine gefunden hat und die verbleibenden Zeilen nach oben nachrücken, soll eine Zeile unter der letzen gefundenen Zeile weitergesucht werden, ohne die davor nochmals in die Suche einzubeziehen.
Später sollen dann auch ähnliche Zeilen gefunden, also z.B. wenn bei übereinstimmenden Spaltenpositionen das Byte um einen kleinen Wert X abweicht, aber das ist erstmal Zukunft...
Arrays nach einzelnen Werten duchsuchen ist kein Problem, aber wie kann ich ganze Zeilen vergleichen?
Vielen Dank im Voraus.
Viele Grüße
Anzeige
25.10.2007, 16:27 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2007 16:30 von jg.)
Die Vergleichs-Operationen (=,>,<,...) können in LV auch auf Arrays angewendet werden. Dabei kann man einstellen (per Rechter-Mausklick auf Operator), ob ein elementweiser Vergleich (->Ausgang ist ein Boolean-Array) oder ein Komplett-Vergleich (Ausgang ist eine Boolean) vorgenommen werden soll.
Ich würde grob folgendes vorschlagen:
Erste Zeile aus 2D-Array nehmen, dann Rest des Arrays von "hinten nach vorne (also hier bis zur 2. Zeile)" in For-Schleife durchsuchen, dabei bei Bedarf Zeilen löschen (Delete from Array), Array wird hierbei per Shift-Register von einem Durchlauf zum nächsten weitergegeben.
Dann dasselbe mit den weiteren Zeilen iterativ, bis du durch alle Zeilen durch bist.
erstmal tausend Dank für Eure schnelle und vor allem aufschlussreiche Hilfe! Das ist ja der Wahnsinn !!!
@Jens G: Dass man Vergleichsoperatoren auch auf Arrays anwenden kann... das hätte ich im Leben nicht probiert!
@Lucki: Diese minimalistischen Schleifen funktionieren absolut einwandfrei. Auf ein so kompakte Lösung wäre ich glaube ich in den nächsten 10 Jahren nicht gekommen! Absolut spitze!
Jetzt, da das einfache Modell so gut funktioniert, werde ich mal versuchen, das ganze etwas auszuweiten. Ich hoffe mal, ich schaffe es, Lucki's Lösung dahingehend umzubauen, dass ich auf der linken Seite zwei Arrays gleicher Größe habe, bei denen ich aus dem einen immer eine Zeile nehme und dann mit den Zeilen des anderen Arrays vergleiche. Das Ergebnis soll der komplette 1. Array und angehängt das, was vom zweiten Array übrigbleibt, sein. Also sozusagen ein hoffentlich etwas größerer Array als Resultat.
Also nochmal vielen Dank für Eure Hilfe, ich werde mich jetzt mal ans Tüfteln machen... wenn ich eine Lösung gefunden habe, werde ich sofort berichten.
Vielen Grüße shamu
27.10.2007, 20:57 (Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2007 21:26 von jg.)
Es geht sogar noch etwas minimalistischer, wenn man den Vergleichsoperator "Leeres Array" zum Schleifenabbruch verwendet.
Man kann auch den Vorschlag von Jens bzw. des Links aufgreifen und die mehrfachen Zeilen aus dem vorhandenen Array sukzessive herauslöschen. Das ist vielleicht noch etwas schneller. Im unten stehenden Bespiel durchsuche ich ganz normal mit aufsteigenden Index. Der Index aller Zeilen mit höherem Index rutscht beim Herauslöschen um einen Wert nach unten. Dem trage ich Rechnung, indem der Suchindex in einem solchen Fall nicht inkrementiert wird.
also ich muss schon sagen, Du bist ein Virtuose im Umgang mit Arrays!!!
Jetzt wollte ich Deine letzte Lösung mal etwas erweitern. Die Suche soll identisch bleiben, aber wenn eine identische Zeile gefunden wird, soll alles zwischen den beiden Zeilen (inklusive der 2. gleiche Zeile) gelöscht werden. Also z.B. greife ich mir Zeile 3 und durchsuchen den weiteren Array, finde jetzt in Zeile 7 eine identische Zeile, soll am Ende nur noch Zeile 1 bis 3 übrig bleiben und Zeile 8 - x an die 4. Stelle rücken.
Das kann doch nur eine kleine Änderung sein... :pccrash:Ich glaube ich denke zu kompliziert...
Tüftelnde Grüße und noch mal vielen Dank für die Klasse Hilfe!!!
Anzeige
30.10.2007, 23:29 (Dieser Beitrag wurde zuletzt bearbeitet: 31.10.2007 06:55 von Lucki.)
' schrieb:Jetzt wollte ich Deine letzte Lösung mal etwas erweitern. Die Suche soll identisch bleiben, aber wenn eine identische Zeile gefunden wird, soll alles zwischen den beiden Zeilen (inklusive der 2. gleiche Zeile) gelöscht werden. Also z.B. greife ich mir Zeile 3 und durchsuchen den weiteren Array, finde jetzt in Zeile 7 eine identische Zeile, soll am Ende nur noch Zeile 1 bis 3 übrig bleiben und Zeile 8 - x an die 4. Stelle rücken.
Das ist tatsächlich nur eine ganz kleine Änderung.
Bisher wurde, wenn im Rest-Array am Index i ein doppeltes Element X(i) gefunden wurde, dieses Element gelöscht.
Jetzt müssen alle Elemente 0..i gelöscht werden (Also Löschen bei Index 0 mit der Länge = i+1)
11.08.2015, 13:02 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2015 13:04 von Dustin.)
das Thema ist zwar schon etwas älter aber hatte das gleiche Problem (gleiche Zeilen sollen gelöscht werden) - dank Lucki auch gelöst. Jetzt möchte ich noch mit einem Zähler ausdrücken, wie oft die gleiche Zeile vorgekommen ist. Also wenn eine Zeile 5 mal gelöscht wurde, soll da stehen, dass die Zeile 6 mal vorkam.
Hab mal meine fehlerhafte Lösung als Screenshot angehängt. Bei mir zählt auch etwas hoch, aber leider komplett fehlerhaft und ohne Zusammenhang zur eigentlichen Lösung.
Meine Idee war dabei, dass wenn 2 Zeilen gleich sind und somit eine gelöscht wird, an der 9. Stelle meines Arrays eine Zahl hochgezählt und zurückgeführt wird.
Wäre froh, wenn mir jemand helfen könnte.
Gruß
11.08.2015, 13:10 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2015 13:13 von GerdW.)
wie sollen wir helfen? Sollen wir mit Paint in deinem Bild herummalen?
Häng doch mal das VI an…
Ansonsten ein genereller Tipp: Schieberegister sollte man initialisieren!
Zitat:Meine Idee war dabei, dass wenn 2 Zeilen gleich sind und somit eine gelöscht wird, an der 9. Stelle meines Arrays eine Zahl hochgezählt und zurückgeführt wird.
Warum an der neunten Stelle?
Erklär doch bitte etwas genauer, was da gemacht werden soll…
Ansonsten: 9. Element indizieren, inkrementieren, 9. Element ersetzen. In dieser Reihenfolge, ohne FeedbackNode!
VI anhängen darf ich leider nicht, da ich mit gekauften (und vom Hersteller passwortgeschützten) VIs arbeite.
An der 9. Stelle nur, weil ich vorher im Array 8 Datenwerte pro Zeile habe, und an der 9. soll dann eben stehen, wie oft diese Zeile vorkam.
Habe es jetzt so rum wie du meinst gemacht, ändert aber leider nichts.
Ich möchte, dass wenn der Vergleich der beiden Arrays True ist, also die gleiche Zeile noch einmal vorkommt, dass diese gelöscht wird und der Zähler in dieser Zeile an der 9. Stelle um einen hochgezählt wird. Das mit dem Löschen klappt problemlos, nur zählt er komplett willkürlich hoch.
Kann ich überhaupt aus der Schleife die Bedingung für meine Case-Struktur ziehen?