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!
Überprüfe mal, ob die Arrays, die an der markierten Stelle rauskommen, wirklich immer dieselbe Größe haben:
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
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!
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.
(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 ...
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
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?
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
(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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
28.04.2011, 19:00 (Dieser Beitrag wurde zuletzt bearbeitet: 29.04.2011 10:27 von Lucki.)
(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:
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.
(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
29.04.2011, 16:00 (Dieser Beitrag wurde zuletzt bearbeitet: 29.04.2011 16:01 von IchSelbst.)
(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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).