Italia
Foro

schnelle Routine per Durchschnittsbildung aus Array gesucht

 
- Page 1 -



KHR
Hallo miteinander,

.

ich möchte eine grande Menge Meßdaten aufbereiten und dann als Kurve(n) darstellen. Die Daten werden aus einer File eingelesen und in Arrays zwischengelagert

Um stark flackernde Meßwerte in einer übersichtlichen Kurve darstellen zu können möchte ich diese circa Durchschnittsbildung beruhigen Das ganze soll dann im fertigen Programm per fünf zahlenreihen gehen

Bisher mache ich das in etwas so:

Es gibt 5 arrays mit 100 elementen Float-Variablen , bei beginn mit 0 gefüllt

Ein Satz Meßwerte wird eingelesen, Jedes Array erhält ein Element eingetragen

Für jedes Array wird der Durchschnitt ermittelt,

die jeweiligen Punkte werden geplottet

und weiter geht es mit dem nächsten Datensatz Meßwerte.

Da ich bisher den Durchschnitt mit while-wend Schleifen errechne, wird alles unendlich langsam. Selbst mit Profan2cpp dauert es Minuten bis der Schirm vollgekritzelt ist.

Hier mal ein ganz kurzer Auszug der Daten wie sie vorliegen. Real haben die File oft circa zehn- oder gar zwanzigtausend Datensätze (Zeilen)

25.07.2007;08:22:53;1874;63.3;0.019387;0.023140;0.024151;0.022312;-----;-----
25.07.2007;08:22:54;1871;63.3;0.028538;0.022725;0.025337;0.022793;-----;-----
25.07.2007;08:22:55;1914;63.3;0.024311;0.023610;0.022366;0.022739;-----;-----
25.07.2007;08:22:56;1889;63.3;0.021887;0.023453;0.019952;0.022303;-----;-----
25.07.2007;08:22:57;1895;63.3;0.027712;0.023644;0.021144;0.022193;-----;-----
25.07.2007;08:22:58;1902;63.3;0.023383;0.023765;0.022752;0.022195;-----;-----
25.07.2007;08:22:59;1891;63.3;0.026178;0.023538;0.022319;0.022224;-----;-----
25.07.2007;08:23:00;1912;63.3;0.024255;0.023965;0.021904;0.022195;-----;-----
25.07.2007;08:23:01;1898;63.3;0.021041;0.023673;0.024442;0.022237;-----;-----
25.07.2007;08:23:02;1895;63.3;0.024243;0.023550;0.022202;0.022322;-----;-----
25.07.2007;08:23:03;1919;63.3;0.029875;0.023874;0.022494;0.022521;-----;-----
25.07.2007;08:23:04;1930;63.3;0.027768;0.024126;0.022018;0.022461;-----;-----
25.07.2007;08:23:05;1914;63.3;0.020411;0.023905;0.020469;0.022334;-----;-----
25.07.2007;08:23:06;1915;63.3;0.027465;0.023837;0.023016;0.022474;-----;-----
25.07.2007;08:23:07;1924;63.3;0.020727;0.023959;0.023631;0.022536;-----;-----
25.07.2007;08:23:08;1891;63.3;0.020876;0.023436;0.021933;0.022374;-----;-----
25.07.2007;08:23:09;1867;63.3;0.020627;0.023159;0.020591;0.022087;-----;-----
....
Die ersten beiden Spalten Datum und Zeit sind uninteressant, erst danach gehts richtig los.

Vor lauter Frust circa meine Ideenlosigkeit hab ich die bisherigen Codes gelöscht
Hat da jemand ne Idee, wie so was schneller gehen potuto??

Bin halt leider doch kein Programmierer sondern nur ein Profan-Wurschtler.
 
Gruß
Karl-Heinz
WIN XP home/Pro / XPROFAN 11 / P2CPP
ATMEL + BASCOM Fan
03.06.2008  
 



 
- Page 2 -



Thomas
Freier
@Frank, dann spende uns doch bitte die Mittelwert-Funktion einer Spalte (max., min. und Summe haben wir ja schon). Und wenn possibile eine Funktion, die die Anzahl der mit Werten gefüllten Items einer Spalte ermittelt.
 
Gruß Thomas
Windows XP SP2, XProfan X2
04.06.2008  
 



Hier der Source zum Bild...

Beinhaltet eine Funktion createHPicByStats(data$,xx,yy) und liefert ein Bildhandle der Statistik zurück. Die Ausgabegrösse kann per Pixel xx und yy eingestellt werden. Mit der Funktion kann man auch zur Laufzeit per String solch ein Diagramm erzeugen. Im Titel steht die Anzahl der benötigten Millisekunden.

Orginalcode: [...] 

Ohne xpse
KompilierenMarkierenSeparieren
WINDOW 100,100 - 700,500
CLS $888888
var TME&=&GETTICKCOUNT
var HPIC&=CREATEHPICBYSTATS(FILE_GET_CONTENTS(fme-300-test.txt),600,420)
SETTEXT %HWND,STR$(&GETTICKCOUNT-TME&)+ ms
DRAWPIC HPIC&,10,10;0
USERMESSAGES $0014

WHILE 1

    WAITINPUT

ENDWHILE

end

proc CREATEHPICBYSTATS

    PARAMETERS S$,XX&,YY&
    DECLARE LN$[],HDR$[],ENTI$[]
    LN$[]=EXPLODE(S$+
    ,
    )
    var C&=SIZEOF(LN$[])
    HDR$[]=EXPLODE(LN$[0],;)
    var HDRC&=SIZEOF(HDR$[])
    var F!=0
    var F2!=0
    DECLARE VMIN![HDRC&],VMAX![HDRC&],V![HDRC&,C&],VMM![HDRC&],COL&[IF(HDRC&>7,HDRC&,8)],COLB&[HDRC&],OLDF![HDRC&]
    MAT VMIN![]=999999999999999
    MAT VMAX![]=-999999999999999
    DEC HDRC&
    DEC C&
    COL&[0]=$FF0000
    COL&[1]=$00FF00
    COL&[2]=$0000FF
    COL&[3]=$880000
    COL&[4]=$008800
    COL&[5]=$000088
    COL&[6]=$FF8800
    COL&[7]=$00FF88
    var CL&=0

    WHILE 1

        INC CL&

        IFNOT CL&<C&

            BREAK

        ENDIF

        ENTI$[]=EXPLODE(LN$[CL&],;)
        SETSIZE ENTI$[],HDRC&+1

        WHILELOOP 0,HDRC&

            F!=VAL(ENTI$[&LOOP])
            V![&LOOP,CL&]=F!

            IF VMIN![&LOOP]>F!

                VMIN![&LOOP]=F!

            ENDIF

            IF VMAX![&LOOP]<F!

                VMAX![&LOOP]=F!

            ENDIF

        ENDWHILE

    ENDWHILE

    var I&=0
    var A!=0

    WHILELOOP 0,HDRC&

        VMM![&LOOP]=(VMAX![&LOOP]-VMIN![&LOOP])
        A!=V![&LOOP,1]
        F!=VMM![&LOOP]

        IF F!=0

            CONTINUE

        ENDIF

        F2!=A!-VMIN![&LOOP]

        IF F2!=0

            CONTINUE

        ENDIF

        OLDF![&LOOP]=(F2!/F!*YY&)

    ENDWHILE

    var Y!=0
    var HOP!=C&/XX&
    var XH!=1
    var YYHOP!=YY&*0.1
    var X&=0
    var HPIC&=CREATE(hNewPic,XX&,YY&,$FFFFFF)
    STARTPAINT HPIC&

    WHILE 1

        INC X&

        WHILELOOP 0,HDRC&

            F!=VMM![&LOOP]

            IFNOT F!=0

                F2!=V![&LOOP,XH!]-VMIN![&LOOP]

                IFNOT F2!=0

                    F!=(OLDF![&LOOP]*0.9)+(F2!/F!*YYHOP!)

                ELSE

                    F!=(OLDF![&LOOP]*0.9)

                ENDIF

                USEPEN 0,0,COL&[&LOOP]
                LINE (X&-1),(YY&-OLDF![&LOOP]) - (X&),(YY&-F!)
                OLDF![&LOOP]=F!

            ENDIF

        ENDWHILE

        XH!=XH!+HOP!

        IF XH!>C&

            BREAK

        ENDIF

    ENDWHILE

    ENDPAINT
    RETURN HPIC&

endproc

proc FILE_GET_CONTENTS

    PARAMETERS FLE$
    var B&=FILESIZE(FLE$)

    IF B&<1

        RETURN

    ENDIF

    DECLARE MEM#
    DIM MEM#,B&
    var R&=BLOCKREAD(FLE$,MEM#,0,B&)
    var S$=CHAR$(MEM#,0,R&)
    DISPOSE MEM#
    RETURN S$

endproc

proc FILE_PUT_CONTENTS

    PARAMETERS FLE$,S$
    var L&=LEN(S$)

    IF L&=0

        var FH&=ASSIGN(FLE$)
        REWRITE FH&
        CLOSE FH&
        ASSIGN FH&,
        RETURN

    ENDIF

    DECLARE MEM#
    DIM MEM#,L&+1
    STRING MEM#,0=S$
    BLOCKWRITE FLE$,MEM#,0,L&
    DISPOSE MEM#

endproc

proc RGB.MIX

    PARAMETERS COL1&,COL2&,TRANSL!
    RETURN RGB(GETRVALUE(COL1&)*(1-TRANSL!)+GETRVALUE(COL2&)*(TRANSL!),GETGVALUE(COL1&)*(1-TRANSL!)+GETGVALUE(COL2&)*(TRANSL!),GETBVALUE(COL1&)*(1-TRANSL!)+GETBVALUE(COL2&)*(<
TRANSL!)) endproc end

Wenn ich jetzt bedenke das diese Methode auch Spalte 1 und Spalte 2 mitberechnet (aber hier keine Zahlen findet) dann potuto ich mir vorstellen, dass mit kleiner Optimierung zu diesem Punkt vielleicht sogar 4 bis 5 statt 6,8 Sekunden erreicht werden können.

@KHR: Wie lange necessario der Algo per die komplette File?

17 kB
Hochgeladen:04.06.2008
Downloadcounter169
Download
913 kB
Hochgeladen:04.06.2008
Downloadcounter175
Download
1.020 kB
Hochgeladen:04.06.2008
Downloadcounter125
Download
 
04.06.2008  
 



He typisch - auf meinem Notebook mit 2,4GHz sogar nur 6.2 Sekunden, statt wie auch meinem DesktopPC mit 3,2 GhZ 6.8 Sekunden. Hat noch jemand nen 486dx4/100 herumzugammeln?
 
05.06.2008  
 




Thomas
Freier
Ein schnell zusammengestrickter Test circa eine doWhile- Schleife ist auch nicht gerade langsam (hier nur per 4 Reihen mit Mittelwert/sec und circa eine *.dbf) .

856 kB
Hochgeladen:05.06.2008
Downloadcounter107
Download
6 kB
Hochgeladen:05.06.2008
Downloadcounter153
Download
6 kB
Hochgeladen:05.06.2008
Downloadcounter139
Download
 
Gruß Thomas
Windows XP SP2, XProfan X2
05.06.2008  
 



Es sieht so aus als ob Du die Skalen nicht normalisierst - bekommst das noch fix eingebaut?

Und per einen Performancevergleich wäre es imho nötig alle 10 Spalten zu beachten. (Das macht mein Beispiel auch, obwohl es bei Datum und Zeit naturalmente nur 0 evaluiert und nutzt.)

Also Skalen normalisieren (x und y) und alle Spalten beachten und dann: Dauer preisgeben per Codeperformancevergleich.
 
05.06.2008  
 




Thomas
Freier
@iF: aus Zeitgründen habe ich es bei 6 Werten belassen. Die Hauptzeit wird beim Erstellen der *.dbf verbraten. Hier wäre ein Vergleich zum Listview oder GridBoxen noch interessant. Die Skalierung, wenn ich sie richtig hinbekommen habe, kostet ca. 300ms bei einer Endzeit von 3734 ms.
Auf meinem Rechner liegen beide Anwendungen sicher auf gleicher Höhe, wenn die weiteren 4 Werte dazu kommen.

324 kB
Hochgeladen:05.06.2008
Downloadcounter89
Download
16 kB
Hochgeladen:05.06.2008
Downloadcounter222
Download
 
Gruß Thomas
Windows XP SP2, XProfan X2
05.06.2008  
 



Hm, irgendwas stimmt nicht mit der Normalisierung - die muss automatisch bestimmt werden per jede Spalte separat. Beispielsweise hast Du eine schwarze Linie in der Mitte, die ist sozuagen nicht auf das ganze Y-Spektrum angezeigt. Eine Umrechnung zur einer einstellbaren Ausgabegröße fehlt da auch noch drin. ^^
 
05.06.2008  
 




Thomas
Freier
@ iF: die schwarze Linie ist die Temperatur (in fme-300-test.txt ist max=64.8° - min=63.9°) . Bei meiner Skalierung entspricht 1° = 13.9 Punkte. Di più Ausschlag kommt da nicht raus. Seine Temperaturanzeige geht von 44° bis 80°. Da hilft nur eine filigranere Grafik wie bei dir. War aber nicht mein Ziel .
 
Gruß Thomas
Windows XP SP2, XProfan X2
05.06.2008  
 



Ich sah grad das ich oben den falschen Code gepostet hatte, das war eine Vorversion.

Der Orginalcode unter [...]  war/ist jedoch der richtige.

Ich habe den ohne xpse-Code oben korrigiert - jetzt stimmts mit Exe und Screenshot überein.

KHR hätte es auffallen müssen.
 
06.06.2008  
 



 
- Page 3 -



KHR
Hallo miteinander,

zuerst mal vielen Dank per Eure Mühe und sorry, daß ich toter Mann speile.

Ich bin momentan beruflich unterwegs und habe durch ungünstige Umstände nur sehr begrentzen Zugang zum Internet und auch zu meinem Notebokk, da es dauernd an der Anlage eines Kunden hängt und eifrig Daten mitschreiben muß

Ich melde mich wieder, wenn ich wieder Normalzustand habe.

Dankeschön und schöne Grüße
 
Gruß
Karl-Heinz
WIN XP home/Pro / XPROFAN 11 / P2CPP
ATMEL + BASCOM Fan
09.06.2008  
 




Thomas
Freier
Hmm iF, irgendwie sind die Kurven von showdata2.exe nicht nachvollziehbar.

 
Gruß Thomas
Windows XP SP2, XProfan X2
11.06.2008  
 



Hat Dein Dateianhang irgendwas mit ShowData2.Exe zu tun? (Weil mir das nicht so scheint...)

Bezüglich nicht nachvollziehbar - inwiefern?

Die davon erzeugten Kurven [...]  .
 
11.06.2008  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

3.802 Views

Untitledvor 0 min.
H.Brill24.04.2023
Jörg Sellmeyer30.05.2018
iF06.11.2014
Michael Wodrich26.02.2014
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie