INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

mehrdimensionales Array verarbeiten



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!

22.08.2013, 23:08
Beitrag #1

Hasenfuss Offline
LVF-Stammgast
***


Beiträge: 331
Registriert seit: Dec 2012

2012
2012
DE



mehrdimensionales Array verarbeiten
Guten Abend!

Vielen Dank für Eure Beiträge zu meiner Frage, wie ich ein einzelnes Array in seiner Größe begrenzen kann. Dank Euch habe ich neue Möglichkeiten kennengelernt, wie man das machen kann. Die Variante mit der Queue hat mir gefallen, weil ich nicht wusste, dass ich alle in der Queue enthaltenen Elemente als Array auslesen kann. Das mit der Queue hat allerdings den Nachteil, dass ich stets nur 1 Element anfügen kann. Besteht mein "Datenstrom" aus einem Array mit mehreren Elementen, so müsste ich dies z.B. durch eine indizierte for-Schleife auftrennen, um jedes Element einzeln in die Queue zu senden.

Aus den Beiträgen habe ich gelernt, dass man bei großen Arrays auf die Speichereffizenz achten sollte. Dazu kann es vorteilhaft sein, ein Array zu indizieren und auf Build-Funktionen zu verzichten und ReplaceArraySubset-Variante zu nehmen.

Leider reicht meine Erfahrung noch nicht aus, um diese Erkenntnisse bestmöglich zu berücksichtigen, darum möchte ich meinen Ansatz hier vorstellen und ich würde mich über Rückmeldungen freuen, an welchen Stellen noch andere Lösungsmöglichkeiten bestehen.

Zunächst erzeuge ich ein Testsignal aus drei Sinus-Kurven mit unterschiedlichen Amplituden und Offsets. Dieses Signal wird in einen 1D-Array-Strang umgewandelt, weil ich in dieser Form später meine Mess-Signale von der Hardware bekomme.

Es wird ein Array initialisiert mit AnzKanäle = 3 und MaxAnzahl=2500.
Der 1D-Array-Strang wird in ein 2D-Array umgewandelt, dass zur Form des initialisierten Arrays passt.

Der umgewandelte Datenstrang wird an das init. Array drangehängt und der vordere Teil entsprechend abgesägt, so dass nur MaxAnzahl Elemente vorhanden sind.

Diese Methode funktioniert, ich bin mir aber nicht sicher, ob diese Form im Sinne der Speicherauslastung optimal ist, da ich durch Dranhängen und Zurechtsägen Build-Funktionen verwende. Natürlich habe ich versucht, mit der Funktion "Teil ersetzen" zu arbeiten und in dem angehängten Bild ist zu sehen, dass diese Funktion nicht funktioniert.

Dann wird auch in Euren Lösungsvorschlängen in dem Thread zu 1D-Arrays die Funktion Array rotieren verwendet. Diese Funktion arbeitet aber mit 1D-Arrays.

Ein anderer Lösungsansatz wäre nun, die 2D-Arrays in einer indizierten Schleife in 1D-Arrays umzuwandeln, um dort mit den 1D-Arrays zu arbeiten. Ist diese Lösung meinem ersten Ansatz vorzuziehen, um der Maßnahme gerecht zu werden, Build-Funktionen zu vermeiden?


Angehängte Datei(en) Thumbnail(s)
       

11.0 .vi  Testprogramm_LV2010.vi (Größe: 13,95 KB / Downloads: 206)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
22.08.2013, 23:32 (Dieser Beitrag wurde zuletzt bearbeitet: 22.08.2013 23:37 von Hasenfuss.)
Beitrag #2

Hasenfuss Offline
LVF-Stammgast
***


Beiträge: 331
Registriert seit: Dec 2012

2012
2012
DE



RE: mehrdimensionales Array verarbeiten
Ich habe hier nochmal das Testprogramm etwas erweitert. In dieser Version sind es nicht 3 Kanäle und Testsignale, sondern 20 Kanäle. Und Maxanzahl hat den Wert 100.000. Ich habe unterschiedliche Pausen in der while-Schleife ausprobiert. Die Prozessorauslastung ging bei 50ms bis zu 50 Prozent hoch. Ein Szenario mit 500ms Wartezeit und einer MaxLänge von 30.000 Datensätzen (*20 Kanäle) entsprechen dabei annähernd realistischen Werten.

Muss ich also den dort verwendeten Ansatz aus Performancegründen umbauen? Leider übersteigt diese Frage mein bisheriges Wissen und falls ihr mir weitere Optimierungstipps geben könntet, würde ich mich sehr freuen.


Angehängte Datei(en)
10.0 .vi  Testprogramm_in_Schleife2.vi (Größe: 30,98 KB / Downloads: 219)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2013, 07:13
Beitrag #3

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
RE: mehrdimensionales Array verarbeiten
Was machst Du mit den Sinüssen (?)? Blink Da macht doch jeder dasselbe, oder sehe ich das falsch? Dann reicht das auch nur einmal.

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2013, 07:49
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: mehrdimensionales Array verarbeiten
Habe mirs kurz anesehen, das BD ist ja riesig. Auf alle Fälle müßte Dein Wissen nach 224 Beirägen ausreichend sein, um solche unzumutbaren Strickmuster zu vermeiden und die ersten 17 Waveforms so zu erzeugen:

   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2013, 07:50 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2013 07:53 von GerdW.)
Beitrag #5

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: mehrdimensionales Array verarbeiten
Hallo Hasenfuss,

Zitat:Die Prozessorauslastung ging bei 50ms bis zu 50 Prozent hoch.
Kein Wunder, wenn du Arrays mit jeweils 2Mio DBL-Werten (also jeweils 16MB-Blöcke) in diverse Anzeigen schiebst und noch dazu einen Mischsignal-Graph benutzt...
Nimm die ganzen Anzeigeelemente aus der Schleife heraus und die Rechenlast geht auf ca. ¼ zurück (bei mir von 18% auf 4%)!

Außerdem solltest du die Signalgenerierung aus der Schleife herausnehmen, wenn du hier etwas halbwegs korrekt simulieren willst.

Zum eigentlichen Problem:
Durch die Benutzung von InsertIntoArray und ArraySubset muss fortlaufend der MemoryManager eingreifen. Dies geht zu Lasten der Performance. Vielleicht solltest du mit ReplaceArraySubset arbeiten?


Angehängte Datei(en)
11.0 .vi  Testprogramm_in_Schleife2.vi (Größe: 20,13 KB / Downloads: 205)

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2013, 08:20
Beitrag #6

Hasenfuss Offline
LVF-Stammgast
***


Beiträge: 331
Registriert seit: Dec 2012

2012
2012
DE



RE: mehrdimensionales Array verarbeiten
Herzlichen Dank für Eure Antworten. Man kann die Testsignalerzeugung sicherlich auf elegantere Weise erzeugen als ich in dem Beispiel dies schnell mit Copy-Paste gemacht habe und das VI auf diese Weise so verunstaltet habe, ich werde mich bemühen, so etwas nicht mehr zu tun.

Meine eigentliche Frage betraf aber den zweiten Teil des Programms, in welchem das Array für den Mischsignalgraph aufbereitet wird.

Zitat von GerdW:
"Durch die Benutzung von InsertIntoArray und ArraySubset muss fortlaufend der MemoryManager eingreifen. Dies geht zu Lasten der Performance. Vielleicht solltest du mit ReplaceArraySubset arbeiten? "

Schaut doch mal im ersten Beitrag von mir das zweite kurze Bild ohne das lange Frontpanel an. Dort habe ich versucht, die Ersetzen-Funktion zu benutzen, leider passen die Datentypen nicht zueinander. Und selbst wenn ich jetzt den neuen Teil vorne oder hinten anfüge, so muss ich auch noch rotieren, eine Rotation geht aber nur eindimensional, sofern ich die Funktion dazu benutze.

Ich bekomme es nicht hin, mit ReplaceArraySubset-Funktion zu arbeiten bzw. den Strang an neuen Elementen so umzuformen, dass er in das indizierte Array hineinpasst.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
23.08.2013, 08:56
Beitrag #7

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: mehrdimensionales Array verarbeiten
Hallo Hasenfuss,

Zitat: Dort habe ich versucht, die Ersetzen-Funktion zu benutzen, leider passen die Datentypen nicht zueinander.
ReplaceArray kann man so benutzen:
   
Wenn du ein 2D-Teilarray ersetzen willst, musst du beide Indizes angeben! Hätte man mit etwas rumprobieren schnell rausfinden können...

Zitat:Und selbst wenn ich jetzt den neuen Teil vorne oder hinten anfüge, so muss ich auch noch rotieren, eine Rotation geht aber nur eindimensional, sofern ich die Funktion dazu benutze.
Wie wäre es denn, wenn du deinen Buffer intern als 1D-Array ausführst? Dann kannst du bequem RotateArray nutzen und einfach die neuen Daten per ReplaceArray in den Buffer eintragen. Nur für die nachfolgende Auswertung stellst du dann auf 2D-Array um...

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.08.2013, 00:16
Beitrag #8

Hasenfuss Offline
LVF-Stammgast
***


Beiträge: 331
Registriert seit: Dec 2012

2012
2012
DE



RE: mehrdimensionales Array verarbeiten
Hallo GerdW,

danke für die Idee, nur mit einem 1D-Array zu arbeiten, darauf wäre ich nicht gekommen, ich werds auch mal ausprobieren.

Mich interessiert mal, ob Du auch mit den Funktionen Signalverlauf erstellen/Komponenten lesen ... arbeitest? Mein erster Versuche bestand darin, ein 1D-Array aus mehreren Signalverläufen zu erstellen, wo ich dann auch das dt und Attribute wie Kanalnamen und Einheit mit angeben kann (http://www.labviewforum.de/attachment.php?aid=45947). Oder arbeitest Du lieber mit "reinen" Arrays so wie jetzt hier in dem Thread?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.08.2013, 12:51
Beitrag #9

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: mehrdimensionales Array verarbeiten
Hallo Hasenfuss,

im Allgemeinen arbeite ich mit den "rohen" Arraydaten - das hat aber auch seine Gründe:
- bekannte und feste Sampleraten
- Datenverarbeitung wird manchmal einfache dadurch
- Target: auf cRIO/FPGA "braucht" man keine Waveforms
- Mischung verschiedenster Datenquellen (nicht nur DAQmx, sondern auch CAN, UDP-Botschaften, etc.)...

Aber wenn ich mal Waveforms nutze, dann natürlich auch mit den zugehörigen Funktionen.

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.08.2013, 20:23 (Dieser Beitrag wurde zuletzt bearbeitet: 25.08.2013 20:25 von Hasenfuss.)
Beitrag #10

Hasenfuss Offline
LVF-Stammgast
***


Beiträge: 331
Registriert seit: Dec 2012

2012
2012
DE



RE: mehrdimensionales Array verarbeiten
Hallo GerdW,

danke, dass Du Dir noch etwas Zeit genommen hast, meine Frage bezüglich reinem Array oder der anderen Funktion mit den Signalverläufen zu beantworten.

Arbeitest Du lieber mit den Einzelgraphen oder auch mal mit dem Mischsignalgraph? Ich hab in meiner Anwendung verschiedene physikal. Größen, die man nicht alle in ein Diagramm packen kann (z.B. Weg, Kraft, Temperatur ...), darum hatte ich in meinen ersten Versuchen mehrere Einzelgraphen übereinander positioniert. Ich fand es manchmal unpraktisch, wenn ich bei einer der Größen die Zoom-Funktion verwendet hatte und die anderen Graphen dann anders liefen. Ich hatte dann eine Synchronisierungstaste eingebaut, welche alle Anzeigen wieder synchronisiert hat. Bei dem Mischsignalgraph hab ich eben nur eine x-Achse, die dann für alle Untergraphen gilt und ich finde es praktisch, dass man die Verläufe zwischen den Graphen hin- und herschieben kann (zumindest so lang man analoge und digitale Signale trennt). Mir ist deshalb der Mischsignalgraph irgendwie wegen der Vielzahl von verschiedenen Messgrößen, die aber alle die gleiche Zeitbasis haben, lieber.

Ich frage deshalb nochmal nach, weil Du mir in Deiner Antwort vom 23.08.2013 um 08:50 Uhr schriebst: "... und noch dazu einen Mischsignal-Graph benutzt... ". Hat der Mischsignalgraph vielleicht irgendwelche besonderen Nachteile? Oder arbeitet der im Vergleich zu den anderen Graphen ineffizienter?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  CAN Nachrichten in Array verarbeiten und aus Case Struktur weiterverarbeiten Tomate27 4 4.554 17.07.2020 13:30
Letzter Beitrag: Tomate27
  Datenstring von Serieller Verbindung verarbeiten stefan1312 5 3.870 30.09.2019 14:53
Letzter Beitrag: stefan1312
  Ansteigende / Abfallende Flanke trennen und verarbeiten erzengelsamael 4 5.663 22.10.2014 16:12
Letzter Beitrag: erzengelsamael
  Mehrdimensionales Array erzeugen labview2013 5 6.344 14.10.2013 16:03
Letzter Beitrag: jg
  Matrix Zeilenweise verarbeiten Dom0503 8 7.310 15.07.2011 10:07
Letzter Beitrag: Dom0503
  Eventstruktur in SubVi verarbeiten (aus Haupt Vi) qubie 1 3.923 12.06.2011 19:56
Letzter Beitrag: BNT

Gehe zu: