Temporäres Array nach jedem Durchlauf auf Null setzen + aufsummieren
-
Hallo Zusammen!
Ich habe ein kleines Problem mit einem temporären Array und anschliessender Aufsummierung von den Werten. Hoffentlich kann mir wer helfen.
Erstmal der relevante Programm-Code:
while (j < i-1) { j = j + 1; if ((data[j] >= 140) && (j < 20100)) j = j+1000; if ((data[j] >= 140) && (j+20100 > i-1)) break; if (data[j] >= 140) { for (k=j-20000; k<j+20000; k++) { A_temp[k] = data[k]; } A_sum = A_sum + A_temp; j = j + 2000; } }
Was soll dieser machen:
Ich habe einen Datensatz und will immer wenn dieser einen Wert von >= 140 annimmt den Wertebereich drum herum (-20000 bis 20000) in ein temporäres Array ablegen. Anschliessend sollen die 40000 Werte in einem Array A_sum aufsummiert werden.
Das erste Problem ist das (wenn ich die natürlich bisher falsche Zeile mit dem aufsummieren mal weglasse) das Array A_temp sich nicht überschreibt, sondern am Ende 120000 Werte hat. Also quasi alle drei Stellen wo der Wert >= 140 ist aneinander gereiht. Wie schaffe ich es das dieses Array immer überschrieben wird?
Zweitens: Ich würde das ganze gerne danach aufsummieren, also die ersten 40000 Werte aus A_temp in A_Sum, dann die nächsten 40000 drauf addiert, so dass das Array A_sum immer 40000 Werte enthält. Allerdings schaffe ich das bisher nicht..Vielen Dank schonmal für eure Antworten und Hilfestellungen,
Kevley
PS: Die ersten beiden if-Anweisungen dienen nur dazu am Anfang und Ende zu definieren um nicht übers Ziel zu schiessen
-
Du solltest dir mehr Variablen gönnen (j und k reichen nicht). Und auch bessere Namen.
Der Index von A_temp[] geht ja immer von 0 bis 39999 .A_temp ohne Klammern ist die Adresse von dem ersten Element vom Array.
Darum ist die Zeile 14 unbrauchbar.Die Summe musst du in der Schleife bilden. Aber dann kannst du auch auf das Array verzichten.
Welchen Wert hat A_sum vor der Schleife?
-
Zeile 14 war nur da um zu zeigen wie ich es mir vorgestellt habe wo die Aufsummierung abläuft.
A_sum habe ich vorher folgendermassen definiert:
double A_sum[40000] = {0};
Das Problem ist das A_temp am Ende 120000 Elemete gross ist, zumindestens wenn ich es mir via fprintf() ausgeben lasse in einer Textdatei.
-
Äh, ...
eine Summe ist doch ein Einzelwert.Warum hast du ein Array?
Und A_temp ist so groß, wie du es vorher definiert hast.
Das weißt du vorher und nicht erst beimprintf
.
-
Okay, ich möchte jedes einzelne Elemente des Arrays aufsummieren.
So das ich am Ende ein neues Array habe, wo 40000 Werte drin stehen, diese aber aufsummiert
-
Du kannst ruhig Fachsprache benutzen, die typischen Leser dieses Forums verstehen dich dann trotzdem. Wahrscheinlich sogar besser als im Moment. Denn ich kapiere gerade nicht mehr, was du überhaupt als Eingangsdaten vorliegen hast und was du am Ende haben möchtest. Es riecht irgendwie nach Signalverarbeitung, aber dein Codeabschnitt ist so konkret, dass ich das Gesamtbild nicht erkennen kann. Etwas mehr Abstand in der Beschreibung deines Vorhabens würde hilfreich sein.
-
Kevley schrieb:
Okay, ich möchte jedes einzelne Elemente des Arrays aufsummieren.
So das ich am Ende ein neues Array habe, wo 40000 Werte drin stehen, diese aber aufsummiert
Das nennt sich dann (meistens) cumsum und nicht sum. Schreib dir eine unterfunktion dafür:
#include <stdio.h> void cumsum(int *source, int *target, unsigned int length) { unsigned int i = 0; target[0] = source[0]; for (i = 1; i < length; ++i) target[i] = source[i] + target[i - 1]; } int main() { unsigned int i; int x[5] = { 1, 2, 3, 4, 5 }; int y[5]; cumsum(x, y, 5); printf("x y\n----\n"); for (i = 0; i < 5; ++i) printf("%d %d\n", x[i], y[i]); return 0; }
-
Kevley schrieb:
Okay, ich möchte jedes einzelne Elemente des Arrays aufsummieren.
So das ich am Ende ein neues Array habe, wo 40000 Werte drin stehen, diese aber aufsummiert
Brauchst du wirklich dieses Array, oder ist es nur ein Hilfsmittel, von dem du meinst, dass du es brauchst?
Beschreib mal dein eigentliches Problem und nicht das Problem mit deinem (evtl falschen) Lösungsversuch.
-
Okay, ich versuche mal meine Aufgabe zu beschreiben.
Ich habe ein Signal mit 200000 Werten (kann später auch mal viel mehr sein)
Darin sind ungefähr 5 Ausschläge zu erkennen wo das Signal ansteigt.
Jetzt gilt es diese "Peaks" auszuschneiden in mit einem Wertebereich von
-20000 < STELLE DES SCHWELLWERTES < 20000.
Alle "Peaks" sollen dann in einem Vektor aufsummiert werden.
Sinn und Zweck davon ist es um zu sehen ob dies Linear ist oder aufgrund des starken Rauschen im Signal nicht linear ansteigt.Ein "Peak" hat eine ungefähre Breite von 1000 Samplepoints. Und zwischen den einzelnen Peaks ist ein Wertebereich von ca. 40000 Samplepoints. Mal mehr mal weniger.
Ich hoffe das ist verständlich, sonst hakt ruhig nach
-
Kevley schrieb:
Alle "Peaks" sollen dann in einem Vektor aufsummiert werden.
Sinn und Zweck davon ist es um zu sehen ob dies Linear ist oder aufgrund des starken Rauschen im Signal nicht linear ansteigt.Ich hoffe das ist verständlich, sonst hakt ruhig nach
Was genau soll auf linearität überprüft werden? Der Peak? Oder hast du einen konstanten, stark verrauschten peak, und willst checken ob dieser auch wirklich näherungsweise konstant ist (indem du mit cumsum darüber integrierst)?
Was genau willst du an den peaks analysieren, das ist immer noch nicht klar.
-
Mal sehen, ob ich das verstanden habe.
Da ist ein Signal mit (fünf) Peaks (sagen wir mal mit dem Wert 1000).
Du möchtest jetzt in einem Array diese Peaks(und Umgebung) aufaddieren, so das der neue Peak den Wert 5000 hat.Oder
du möchtest eine Summe über die 40000 Werte haben.
Am Ende hast du dann fünf Summen (für jeden Peak eine)