/*============================================================================* *H *H FILE *H sortiere_RKI_Datensaetze_ein.c *H *H MODIFICATION HISTORY *H *H Date Name Modification *H --------------------------------------------------------------------------- *H 16.05.2021 JMH Initiale Version *H 16.05.2021 JMH Aufgeräumt *H *============================================================================*/ /*----------------------------------------------------------------------------* * Include Files *----------------------------------------------------------------------------*/ #include #include /*----------------------------------------------------------------------------* * Private #define's *----------------------------------------------------------------------------*/ #define KRANKHEITSDAUER 14.0 /* Tage */ /*============================================================================* *F *F FUNCTION *F mexFunction *F *F PURPOSE *F Hauptschleife in MEX-Datei, um Rechenzeit zu verkürzen *F *============================================================================*/ void mexFunction (int nlhs, mxArray *plhs [], int nrhs, const mxArray *prhs []) { double AnzahlTage; int Daten_m; int Daten_n; double *Daten; int Zeit_d_n; double *Zeit_d; int Meldezeit_d_n; double *Meldezeit_d; double *Krankdauer_d; int Kranke_n; double *Kranke; int Kranke_MD_n; double *Kranke_MD; int Gesund_n; double *Gesund; int Tote_n; double *Tote; int Kranke_Alter_m; int Kranke_Alter_n; double *Kranke_Alter; int Tote_Alter_m; int Tote_Alter_n; double *Tote_Alter; int ii; int jj; int kk; int Index; int Alter; int Gruppe; /******************************************************************************/ if (nrhs < 4) { mexErrMsgTxt ("Anzahl der Input-Argumente zu klein!"); } if (nlhs < 7) { mexErrMsgTxt ("Anzahl der Output-Argumente zu klein!"); } /******************************************************************************/ AnzahlTage = mxGetScalar (prhs [0]); /******************************************************************************/ Daten_m = mxGetM (prhs [1]); Daten_n = mxGetN (prhs [1]); Daten = mxGetPr (prhs [1]); /******************************************************************************/ Zeit_d_n = mxGetN (prhs [2]); Zeit_d = mxGetPr (prhs [2]); /******************************************************************************/ Meldezeit_d_n = mxGetN (prhs [3]); Meldezeit_d = mxGetPr (prhs [3]); /******************************************************************************/ /******************************************************************************/ plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL); Krankdauer_d = mxGetPr (plhs [0]); *Krankdauer_d = KRANKHEITSDAUER; /******************************************************************************/ Kranke_n = (int) AnzahlTage; plhs [1] = mxCreateDoubleMatrix (1, Kranke_n, mxREAL); Kranke = mxGetPr (plhs [1]); for (ii = 0; ii < Kranke_n; ii++) { Kranke [ii] = 0.0; } /******************************************************************************/ Kranke_MD_n = (int) AnzahlTage; plhs [2] = mxCreateDoubleMatrix (1, Kranke_MD_n, mxREAL); Kranke_MD = mxGetPr (plhs [2]); for (ii = 0; ii < Kranke_MD_n; ii++) { Kranke_MD [ii] = 0.0; } /******************************************************************************/ Gesund_n = ((int) AnzahlTage) + ((int) *Krankdauer_d); plhs [3] = mxCreateDoubleMatrix (1, Gesund_n, mxREAL); Gesund = mxGetPr (plhs [3]); for (ii = 0; ii < Gesund_n; ii++) { Gesund [ii] = 0.0; } /******************************************************************************/ Tote_n = ((int) AnzahlTage) + ((int) *Krankdauer_d); plhs [4] = mxCreateDoubleMatrix (1, Tote_n, mxREAL); Tote = mxGetPr (plhs [4]); for (ii = 0; ii < Tote_n; ii++) { Tote [ii] = 0.0; } /******************************************************************************/ Kranke_Alter_m = ((int) AnzahlTage) - 1; Kranke_Alter_n = 6; plhs [5] = mxCreateDoubleMatrix (Kranke_Alter_m, Kranke_Alter_n, mxREAL); Kranke_Alter = mxGetPr (plhs [5]); for (ii = 0; ii < Kranke_Alter_m; ii++) { for (jj = 0; jj < Kranke_Alter_n; jj++) { kk = ii + jj * Kranke_Alter_m; Kranke_Alter [kk] = 0.0; } } /******************************************************************************/ Tote_Alter_m = ((int) AnzahlTage) - 1 + ((int) *Krankdauer_d); Tote_Alter_n = 6; plhs [6] = mxCreateDoubleMatrix (Tote_Alter_m, Tote_Alter_n, mxREAL); Tote_Alter = mxGetPr (plhs [6]); for (ii = 0; ii < Tote_Alter_m; ii++) { for (jj = 0; jj < Tote_Alter_n; jj++) { kk = ii + jj * Tote_Alter_m; Tote_Alter [kk] = 0.0; } } /******************************************************************************/ for (Index = 0; Index < Zeit_d_n; Index++) { /* * Konsistenzprüfungen und Korrekturen */ /* * NeuerFall: * 0: Fall ist in der Publikation für den aktuellen Tag und in der für * den Vortag enthalten * 1: Fall ist nur in der aktuellen Publikation enthalten * -1: Fall ist nur in der Publikation des Vortags enthalten * Damit ergibt sich: * Anzahl Fälle der aktuellen Publikation als Summe(AnzahlFall), * wenn NeuerFall in (0,1); * Delta zum Vortag als Summe(AnzahlFall), wenn NeuerFall in (-1,1) * (Datensätze mit NeuerFall < 0 ignorieren!) */ kk = Index + (6 - 1) * Daten_m; if (Daten [kk] < 0.0) { continue; } /* * NeuerTodesfall: * 0: Fall ist in der Publikation für den aktuellen Tag und in der für * den Vortag jeweils ein Todesfall * 1: Fall ist in der aktuellen Publikation ein Todesfall, nicht jedoch * in der Publikation des Vortages * -1: Fall ist in der aktuellen Publikation kein Todesfall, jedoch war * er in der Publikation des Vortags ein Todesfall * -9: Fall ist weder in der aktuellen Publikation noch in der des * Vortages ein Todesfall * Damit ergibt sich: * Anzahl Todesfälle der aktuellen Publikation als * Summe(AnzahlTodesfall), wenn NeuerTodesfall in (0,1); * Delta zum Vortag als Summe(AnzahlTodesfall), wenn NeuerTodesfall in * (-1,1) * (AnzahlTodesfall nullsetzen bei Datensätzen mit NeuerTodesfall = -1!) */ kk = Index + (7 - 1) * Daten_m; if (fabs (Daten [kk] + 1.0) < 0.1) { kk = Index + (2 - 1) * Daten_m; Daten [kk] = 0.0; } /* * NeuGenesen: * 0: Fall ist in der Publikation für den aktuellen Tag und in der für * den Vortag jeweils Genesen * 1: Fall ist in der aktuellen Publikation Genesen, nicht jedoch in der * Publikation des Vortages * -1: Fall ist in der aktuellen Publikation nicht Genesen, jedoch war er * in der Publikation des Vortags Genesen * -9: Fall ist weder in der aktuellen Publikation noch in der des * Vortages Genesen * Damit ergibt sich: * Anzahl Genesen der aktuellen Publikation als Summe(AnzahlGenesen), * wenn NeuGenesen in (0,1); * Delta zum Vortag als Summe(AnzahlGenesen) wenn NeuGenesen in (-1,1) * (AnzahlGenesen nullsetzen bei Datensätzen mit NeuGenesen = -1!) */ kk = Index + (11 - 1) * Daten_m; if (fabs (Daten [kk] + 1.0) < 0.1) { kk = Index + (12 - 1) * Daten_m; Daten [kk] = 0.0; } /* * AnzahlFall: Anzahl der Fälle in der entsprechenden Gruppe * (AnzahlFall muß größer als Null sein!) */ kk = Index + (1 - 1) * Daten_m; if (Daten [kk] < 1.0) { mexErrMsgTxt ("Daten (Index, 1) < 1"); } /* * AnzahlTodesfall: Anzahl der Todesfälle in der entsprechenden Gruppe * (AnzahlTodesfall darf nicht negativ und nicht größer als AnzahlFall * sein!) */ ii = Index + (2 - 1) * Daten_m; jj = Index + (1 - 1) * Daten_m; if ((Daten [ii] < 0.0) || (Daten [ii] > Daten [jj])) { mexErrMsgTxt ("(Daten(Idx, 2) < 0) || (Daten(Idx, 2) > Daten(Idx, 1))"); } /* * AnzahlGenesen: Anzahl der Genesenen in der entsprechenden Gruppe * (AnzahlGenesen darf nicht negativ und nicht größer als AnzahlFall sein!) */ ii = Index + (12 - 1) * Daten_m; jj = Index + (1 - 1) * Daten_m; if ((Daten [ii] < 0.0) || (Daten [ii] > Daten [jj])) { mexErrMsgTxt ("(Daten(Idx, 12) < 0) || (Daten(Idx, 12) > Daten(Idx, 1))"); } /* * Die Summe von AnzahlTodesfall und AnzahlGenesen darf nicht größer als * AnzahlFall sein! */ ii = Index + (2 - 1) * Daten_m; jj = Index + (12 - 1) * Daten_m; kk = Index + (1 - 1) * Daten_m; if ((Daten [ii] + Daten [jj]) > Daten [kk]) { mexErrMsgTxt ("(Daten(Index, 2) + Daten(Index, 12)) > Daten(Index, 1)"); } /* * Neuinfizierte ab ihrem Erkrankungsdatum in die Tabelle eintragen */ kk = Index + (1 - 1) * Daten_m; for (ii = (((int) Zeit_d [Index]) - 1); ii < Kranke_n; ii++) { Kranke [ii] = Kranke [ii] + Daten [kk]; } /* * Neuinfizierte ab ihrem Meldedatum in die Tabelle eintragen */ kk = Index + (1 - 1) * Daten_m; for (ii = (((int) Meldezeit_d [Index]) - 1); ii < Kranke_MD_n; ii++) { Kranke_MD [ii] = Kranke_MD [ii] + Daten [kk]; } /* * Gestorbene ab 14 Tage nach ihrem Erkrankungsdatum in die Tabelle * eintragen (Mit einem empirischen Wert von 14 Tagen ergeben sich * konsistente zeitliche Abstände der Verlaufsmaxima von Todesfällen und * Neuinfizierten bei dem Vergleich von RKI-Originaldaten und * zeit.de-Daten!) */ kk = Index + (2 - 1) * Daten_m; for (ii = (((int) Zeit_d [Index]) - 1 + ((int) *Krankdauer_d)); ii < Tote_n; ii++ ) { Tote [ii] = Tote [ii] + Daten [kk]; } /* * Genesene ab 14 Tage nach ihrem Erkrankungsdatum in die Tabelle eintragen * (Mit einem empirischen Wert von 14 Tagen ergeben sich konsistente * zeitliche Abstände zwischen Verlaufsmaximum der momentan Kranken und * Wendepunkt der akkumulierten Infizierten bei dem Vergleich von * RKI-Originaldaten und zeit.de-Daten! * Achtung: spätestens 31 Tage nach dem Erkrankungsdatum sollte man * entweder gesund oder tot sein!) */ kk = Index + (12 - 1) * Daten_m; for (ii = (((int) Zeit_d [Index]) - 1 + ((int) *Krankdauer_d)); ii < Gesund_n; ii++ ) { Gesund [ii] = Gesund [ii] + Daten [kk]; } /* * Neuinfizierte und Gestorbene gemäß ihres Alters in die Tabellen * eintragen */ kk = Index + (14 - 1) * Daten_m; Alter = (int) Daten [kk]; if (Alter == 0) { Gruppe = 0; } else if (Alter == 5) { Gruppe = 1; } else if (Alter == 15) { Gruppe = 2; } else if (Alter == 35) { Gruppe = 3; } else if (Alter == 60) { Gruppe = 4; } else if (Alter == 80) { Gruppe = 5; } else if (Alter == 99) { Gruppe = 6; } else { mexErrMsgTxt ("Unbekannte Altersgruppe!"); } if (Gruppe < 6) { /* * Neuinfizierte an ihrem Erkrankungsdatum in die Tabelle eintragen */ ii = Index + (1 - 1) * Daten_m; kk = ((int) Zeit_d [Index]) - 1 + Gruppe * Kranke_Alter_m; Kranke_Alter [kk] = Kranke_Alter [kk] + Daten [ii]; /* * Gestorbene 14 Tage nach ihrem Erkrankungsdatum in die Tabelle * eintragen */ ii = Index + (2 - 1) * Daten_m; kk = ((int) Zeit_d [Index]) - 1 + ((int) *Krankdauer_d) + Gruppe * Tote_Alter_m; Tote_Alter [kk] = Tote_Alter [kk] + Daten [ii]; } } } /* END OF FUNCTION mexFunction */ /* END OF FILE sortiere_RKI_Datensaetze_ein.c */