LabVIEWForum.de
Fragwürdiges Phänomen mit Arrays - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Fragwürdiges Phänomen mit Arrays (/Thread-Fragwuerdiges-Phaenomen-mit-Arrays)

Seiten: 1 2


Fragwürdiges Phänomen mit Arrays - WinniePooh - 27.04.2011 17:02

Hallo liebe LabView Gemeinde,
seit einigen Tagen habe ich in meinem Projekt den Fehler,
das mein Porgramm in einem Array nullen schreibt.

Ich kann dies nicht nachvollziehen, wo und wie es sie reinschreibt.
Deswegen brauche ich mal ein Rat.

Anbei lade ich das Programm komentiert hoch.

Die Funktion des Programms soll sein, Spannungsspitzen in einem sehr kurzem
Zeitpunkt darzustellen.

Bitte Um Hilfe.

Mfg

Winnie


RE: Fragwürdiges Phänomen mit Arrays - jg - 27.04.2011 18:56

Überprüfe mal, ob die Arrays, die an der markierten Stelle rauskommen, wirklich immer dieselbe Größe haben:
[attachment=33514]
Da du die alle zu einem 2D-Array zusammenbaust, werden Werte, die mglw. nicht vorhanden sind (da ein Array kürzer oder länger ist) mit Nullern aufgefüllt.

Gruß, Jens


RE: Fragwürdiges Phänomen mit Arrays - WinniePooh - 28.04.2011 08:48

Hi,
ich habe die Länge des Arrays überprüft und du hast recht,
sie haben nicht dieselbe länge. Und wenn du schon sagst, dass
LabView die Leeren Stellen mit Nullen vollschreibt so kam ich auf
diese Lösung wie im Bild.

Das Problem bei der Lösung ist sie ist viel zu langsam. Ich brauche
etwas schnelleres womit ich die stellen löschen kann und zweitens
ist dann die Frage, wird mir LabView nicht nochmal die leeren Stellen
mit Nullen vollschreiben.

Gruß


RE: Fragwürdiges Phänomen mit Arrays - Martin Heller - 28.04.2011 09:26

Hallo Winnie

Auto-Indexing (Ausgang der Schlaufe) ist das "schnellste", aber es wird alles hineingeschrieben...

Deine for-Schleife benötigt kein Index des Arrays für den Loop Count, da die Schleife wegen "Enable Indexing/k.a auf Deutsch".
mfg Martin


RE: Fragwürdiges Phänomen mit Arrays - IchSelbst - 28.04.2011 10:12

(28.04.2011 08:48 )WinniePooh schrieb:  Das Problem bei der Lösung ist sie ist viel zu langsam. Ich brauche etwas schnelleres womit ich die stellen löschen kann und zweitens ist dann die Frage, wird mir LabView nicht nochmal die leeren Stellen mit Nullen vollschreiben.
Die gepostete For-Schleife funktioniert so nicht. Du müsstest ein Schieberegister verwenden anstelle eines Tunnels. Der Tunnel bewirkt, dass nur die letzte Null ignoriert wird.

Langsam wird immer dann, wenn Kopieroperationen mit Array gemacht werden müssen. So in deinem Falle, da beim Eliminieren einer Null immer alle die Elemente, die nach der Null folgen, verschoben werden müssen. Im allgemeinen kann man sagen, dass Elemente wie "In Array ersetzen" insgesamt performanter sind. (Wobei es in deinem Falle auf die Anzahl der zu löschen Elemente ankommt bezogen auf die Gesamtanzahl der Arrayelemente.)

Ich würde das Eliminieren der Nullen machen wie im Bild angegeben.

Noch eine Sache:
Das Abfragen einen DBL-Zahl auf einen exakten Wert (hier Null) mittels des Elementes "Ist Gleich" ist praktisch gesehen ungünstig. Es kann nämlich vorkommen, dass der Anwender meint, ein Wert sein Null, "computertechnisch" ist er aber z.B. 10E-25 ...


RE: Fragwürdiges Phänomen mit Arrays - Kiesch - 28.04.2011 16:02

Wie löst man das dann programmatisch? Betrag von Wert kleiner Maschinengenauigkeit? Oder gibt man da noch ne Sicherheitsmarge mit, da sich Rundungsfehler akkumulieren können?


RE: Fragwürdiges Phänomen mit Arrays - IchSelbst - 28.04.2011 16:32

(28.04.2011 16:02 )Kiesch schrieb:  Wie löst man das dann programmatisch? Betrag von Wert kleiner Maschinengenauigkeit?
Im Prinzip genau so.
Allgemein gilt für "X=Y?": "|X-Y| < e ?", wobei e die Maschinenungenauigkeit ist. Und die kann man ansetzen wie man will. Nur eben nicht kleiner als die "kleinste Zahl, die man zu 1 dazu zählen kann, sodass das Ergebnis ungleich 1 ist." (siehe WikiPedia). Für viele Fälle reicht ein e mit einer Genauigkeit von 6 Stellen - bedenke: DBL hat 16 Stellen.

Zitat:Oder gibt man da noch ne Sicherheitsmarge mit, da sich Rundungsfehler akkumulieren können?
Im Prinzip hast du hiermit Recht.
Man muss als Programmierer immer im Hinterkopf haben, dass bei einer permanenten Addition ein erheblicher Rundungsfehler entstehen kann (nicht muss). Daher sollte man, falls möglich, nicht einen Algorithmus wählen, der kleine Werte aufaddiert, sondern einen, der einen konstanten Wert mit z.B. einer Integer-Zahl multipliziert.

Die Sache mit dem Rundungsfehler gilt es natürlich nur bei Gleitkommazahlen. Bei Integer-Zahlen gibt es grundsätzlich keine Rundungsfehler.


RE: Fragwürdiges Phänomen mit Arrays - Lucki - 28.04.2011 19:00

(28.04.2011 16:32 )IchSelbst schrieb:  Allgemein gilt für "X=Y?": "|X-Y| < e ?", wobei e die Maschinenungenauigkeit ist. Und die kann man ansetzen wie man will. Nur eben nicht kleiner als die "kleinste Zahl, die man zu 1 dazu zählen kann, sodass das Ergebnis ungleich 1 ist." (siehe WikiPedia). Für viele Fälle reicht ein e mit einer Genauigkeit von 6 Stellen - bedenke: DBL hat 16 Stellen.

Das ist alles genau richtig, bis auf die anfängliche Formel. Die Maschinenungenauigkeit ist auf die Zahl 1 bezogen. Für die Ungenauigkeit einer anderen Zahl als 1 muß man die Maschinenungenauigkeit mit der Zahl multiplizieren. Bei 100 ist die Ungenauigkeit entsprechend +-100*e. Es muß also richtig heißen:
"X=Y"? --> |X-Y| < |X|*e
wobei man statt |X| auch |Y| verwenden kann.
oder: |X/Y-1| < e oder: |Y/X-1| < e
Wenn man das so macht, muß man nach meiner Erfahrung nicht noch Sicherheiten berücksichtigen. Ich denke eher, daß die in der LV- Maschinenkonstante schon mit drin sind.
Edit: Habe das e mal bezüglich Reserven geprüft, mit diesem VI:
[attachment=33552]
Ergebnis:
Zahl <2: Ergebnis immer ungleich
Zahl 2..4: Mal so, mal so
Zahl >4 immer gleich.
Die Reserven sind also da, denn sonst wäre der Umschlagpunkt bei 1 und nicht bei 2..4.


RE: Fragwürdiges Phänomen mit Arrays - WinniePooh - 29.04.2011 15:39

(28.04.2011 10:12 )IchSelbst schrieb:  Langsam wird immer dann, wenn Kopieroperationen mit Array gemacht werden müssen. So in deinem Falle, da beim Eliminieren einer Null immer alle die Elemente, die nach der Null folgen, verschoben werden müssen. Im allgemeinen kann man sagen, dass Elemente wie "In Array ersetzen" insgesamt performanter sind. (Wobei es in deinem Falle auf die Anzahl der zu löschen Elemente ankommt bezogen auf die Gesamtanzahl der Arrayelemente.)

Ich würde das Eliminieren der Nullen machen wie im Bild angegeben.

Noch eine Sache:
Das Abfragen einen DBL-Zahl auf einen exakten Wert (hier Null) mittels des Elementes "Ist Gleich" ist praktisch gesehen ungünstig. Es kann nämlich vorkommen, dass der Anwender meint, ein Wert sein Null, "computertechnisch" ist er aber z.B. 10E-25 ...

Nach dem Programm was du erstellt hast, nimmst du die Nullen aus dem Array raus und schiebst sie in ein neues Array.

Mein Anliegen ist es, in dem neuen Array die Werte zu haben, die keine Nullen sind, d.h. alles ausser den nullen.
Habe versucht das Programm versucht nach meinen Wünschen zu ändern, aber irgendwie weiß ich nicht wie das genau miteinander
zusammenhängt.

Kannst du mir mal da ein Tipp geben?

Gruß Winnie


RE: Fragwürdiges Phänomen mit Arrays - IchSelbst - 29.04.2011 16:00

(29.04.2011 15:39 )WinniePooh schrieb:  Nach dem Programm was du erstellt hast, nimmst du die Nullen aus dem Array raus und schiebst sie in ein neues Array.
Nein.

Was du im Bild siehst, ist der FALSE-Case der IF-Struktur, nicht der TRUE-Case! Im False-Case ist das Array wie auch der aktuelle Index einfach nur durchverbunden.

Das Element "Im Bereich" liefert true, wenn der Wert zwischen den Grenzen liegt. Die Grenzen sind +-1E-5. Ist der Wert Null, liefert das Element true. Bei True wird das bestehende Array weiter verwendet, bei False, also wenn der Wert ungleich Null ist, wird dieses Element in das Array übernommen.