Annotation of rpl/src/statistiques.c, revision 1.16.2.2

1.1       bertrand    1: /*
                      2: ================================================================================
1.16.2.2! bertrand    3:   RPL/2 (R) version 4.0.23
1.15      bertrand    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
1.11      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction réalisant la somme de la matrice statistique
                     29: ================================================================================
                     30:   Entrées : pointeur sur une matrice entière ou réelle
                     31: --------------------------------------------------------------------------------
                     32:   Sorties : renvoie NULL s'il y a defaut de mémoire
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: struct_vecteur *
                     39: sommation_statistique(struct_matrice *s_matrice)
                     40: {
                     41:    integer8                    *cumul_entier;
                     42: 
                     43:    logical1                    erreur_memoire;
                     44:    logical1                    resultat_entier;
                     45: 
                     46:    real8                       *colonne;
                     47: 
                     48:    struct_vecteur              *s_vecteur;
                     49: 
                     50:    unsigned long               i;
                     51:    unsigned long               j;
                     52: 
                     53:    if ((s_vecteur = (struct_vecteur *) malloc(sizeof(struct_vecteur))) == NULL)
                     54:    {
                     55:        return NULL;
                     56:    }
                     57: 
                     58:    /*
                     59:     * Calculs en virgule fixe
                     60:     */
                     61: 
                     62:    if ((*s_matrice).type == 'I')
                     63:    {
                     64:        if ((cumul_entier = (integer8 *) malloc((*s_matrice).nombre_colonnes *
                     65:                sizeof(integer8))) == NULL)
                     66:        {
                     67:            free(s_vecteur);
                     68:            return NULL;
                     69:        }
                     70: 
                     71:        for(j = 0; j < (*s_matrice).nombre_colonnes; cumul_entier[j++] = 0);
                     72: 
                     73:        for(resultat_entier = d_vrai, i = 0; (i < (*s_matrice).nombre_lignes)
                     74:                && (resultat_entier == d_vrai); i++)
                     75:        {
                     76:            for(j = 0; (j < (*s_matrice).nombre_colonnes) &&
                     77:                    (resultat_entier == d_vrai); j++)
                     78:            {
                     79:                if (depassement_addition(&(cumul_entier[j]), &(((integer8 **)
                     80:                        (*s_matrice).tableau)[i][j]), &(cumul_entier[j]))
                     81:                        == d_erreur)
                     82:                {
                     83:                    resultat_entier = d_faux;
                     84:                }
                     85:            }
                     86:        }
                     87: 
                     88:        if (resultat_entier == d_vrai)
                     89:        {
                     90:            /*
                     91:             * Pas de dépassement
                     92:             */
                     93: 
                     94:            (*s_vecteur).type = 'I';
                     95:            (*s_vecteur).taille = (*s_matrice).nombre_colonnes;
                     96:            (*s_vecteur).tableau = cumul_entier;
                     97:        }
                     98:        else
                     99:        {
                    100:            /*
                    101:             * Dépassement... Refaire le calcul en virgule flottante
                    102:             */
                    103: 
                    104:            free(cumul_entier);
                    105: 
                    106:            if (((*s_vecteur).tableau = malloc((*s_matrice).nombre_colonnes *
                    107:                    sizeof(real8))) == NULL)
                    108:            {
                    109:                free(s_vecteur);
                    110:                return NULL;
                    111:            }
                    112: 
                    113:            if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    114:                    sizeof(real8))) == NULL)
                    115:            {
                    116:                free(s_vecteur);
                    117:                return NULL;
                    118:            }
                    119: 
                    120:            for(j = 0; j < (*s_matrice).nombre_colonnes; j++)
                    121:            {
                    122:                for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    123:                {
                    124:                    colonne[i] = (real8) ((integer8 **)
                    125:                            (*s_matrice).tableau)[i][j];
                    126:                }
                    127: 
                    128:                ((real8 *) (*s_vecteur).tableau)[j] = sommation_vecteur_reel(
                    129:                        colonne, &((*s_matrice).nombre_lignes),
                    130:                        &erreur_memoire);
                    131: 
                    132:                if (erreur_memoire == d_vrai)
                    133:                {
                    134:                    free(s_vecteur);
                    135:                    return NULL;
                    136:                }
                    137:            }
                    138: 
                    139:            free(colonne);
                    140: 
                    141:            (*s_vecteur).type = 'R';
                    142:            (*s_vecteur).taille = (*s_matrice).nombre_colonnes;
                    143:        }
                    144:    }
                    145: 
                    146:    /*
                    147:     * Calculs en virgule flottante
                    148:     */
                    149: 
                    150:    else if ((*s_matrice).type == 'R')
                    151:    {
                    152:        if (((*s_vecteur).tableau = malloc((*s_matrice).nombre_colonnes *
                    153:                sizeof(real8))) == NULL)
                    154:        {
                    155:            free(s_vecteur);
                    156:            return NULL;
                    157:        }
                    158: 
                    159:        if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    160:                sizeof(real8))) == NULL)
                    161:        {
                    162:            free(s_vecteur);
                    163:            return NULL;
                    164:        }
                    165: 
                    166:        for(j = 0; j < (*s_matrice).nombre_colonnes; j++)
                    167:        {
                    168:            for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    169:            {
                    170:                colonne[i] = ((real8 **) (*s_matrice).tableau)[i][j];
                    171:            }
                    172: 
                    173:            ((real8 *) (*s_vecteur).tableau)[j] = sommation_vecteur_reel(
                    174:                    colonne, &((*s_matrice).nombre_lignes), &erreur_memoire);
                    175: 
                    176:            if (erreur_memoire == d_vrai)
                    177:            {
                    178:                free(s_vecteur);
                    179:                return NULL;
                    180:            }
                    181:        }
                    182: 
                    183:        free(colonne);
                    184: 
                    185:        (*s_vecteur).type = 'R';
                    186:        (*s_vecteur).taille = (*s_matrice).nombre_colonnes;
                    187:    }
                    188: 
                    189:    return s_vecteur;
                    190: }
                    191: 
                    192: 
                    193: /*
                    194: ================================================================================
                    195:   Fonction réalisant la somme des produits d'une colonne de la matrice
                    196:   statistique par une autre colonne
                    197: ================================================================================
                    198:   Entrées : pointeur sur une matrice entière ou réelle
                    199: --------------------------------------------------------------------------------
                    200:   Sorties : renvoie NULL s'il y a defaut de mémoire
                    201: --------------------------------------------------------------------------------
                    202:   Effets de bord : néant
                    203: ================================================================================
                    204: */
                    205: 
                    206: struct_vecteur *
                    207: sommation_produits_colonnes_statistiques(struct_matrice *s_matrice,
                    208:        unsigned long position_1, unsigned long position_2)
                    209: {
                    210:    integer8                    *cumul_entier;
                    211:    integer8                    tampon;
                    212: 
                    213:    logical1                    erreur_memoire;
                    214:    logical1                    resultat_entier;
                    215: 
                    216:    real8                       *colonne;
                    217: 
                    218:    struct_vecteur              *s_vecteur;
                    219: 
                    220:    unsigned long               i;
                    221: 
                    222:    if ((s_vecteur = (struct_vecteur *) malloc(sizeof(struct_vecteur))) == NULL)
                    223:    {
                    224:        return NULL;
                    225:    }
                    226: 
                    227:    position_1--;
                    228:    position_2--;
                    229: 
                    230:    /*
                    231:     * Calculs en virgule fixe
                    232:     */
                    233: 
                    234:    if ((*s_matrice).type == 'I')
                    235:    {
                    236:        if ((cumul_entier = (integer8 *) malloc(sizeof(integer8))) == NULL)
                    237:        {
                    238:            free(s_vecteur);
                    239:            return NULL;
                    240:        }
                    241: 
                    242:        (*cumul_entier) = 0;
                    243: 
                    244:        for(resultat_entier = d_vrai, i = 0; (i < (*s_matrice).nombre_lignes)
                    245:                && (resultat_entier == d_vrai); i++)
                    246:        {
                    247:            if (depassement_multiplication(&(((integer8 **) (*s_matrice)
                    248:                    .tableau)[i][position_1]), &(((integer8 **) (*s_matrice)
                    249:                    .tableau)[i][position_2]), &tampon) == d_erreur)
                    250:            {
                    251:                resultat_entier = d_faux;
                    252:            }
                    253:            else if (depassement_addition(cumul_entier, &tampon, cumul_entier)
                    254:                    == d_erreur)
                    255:            {
                    256:                resultat_entier = d_faux;
                    257:            }
                    258:        }
                    259: 
                    260:        if (resultat_entier == d_vrai)
                    261:        {
                    262:            /*
                    263:             * Pas de dépassement
                    264:             */
                    265: 
                    266:            (*s_vecteur).type = 'I';
                    267:            (*s_vecteur).taille = 1;
                    268:            (*s_vecteur).tableau = cumul_entier;
                    269:        }
                    270:        else
                    271:        {
                    272:            /*
                    273:             * Dépassement... Refaire le calcul en virgule flottante
                    274:             */
                    275: 
                    276:            free(cumul_entier);
                    277: 
                    278:            if (((*s_vecteur).tableau = malloc(sizeof(real8))) == NULL)
                    279:            {
                    280:                free(s_vecteur);
                    281:                return NULL;
                    282:            }
                    283: 
                    284:            if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    285:                    sizeof(real8))) == NULL)
                    286:            {
                    287:                free(s_vecteur);
                    288:                return NULL;
                    289:            }
                    290: 
                    291:            for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    292:            {
                    293:                colonne[i] = ((real8) ((integer8 **)
                    294:                        (*s_matrice).tableau)[i][position_1]) *
                    295:                        ((real8) ((integer8 **) (*s_matrice).tableau)
                    296:                        [i][position_2]);
                    297:            }
                    298: 
                    299:            (*((real8 *) (*s_vecteur).tableau)) = sommation_vecteur_reel(
                    300:                    colonne, &((*s_matrice).nombre_lignes),
                    301:                    &erreur_memoire);
                    302: 
                    303:            if (erreur_memoire == d_vrai)
                    304:            {
                    305:                free(s_vecteur);
                    306:                return NULL;
                    307:            }
                    308: 
                    309:            free(colonne);
                    310: 
                    311:            (*s_vecteur).type = 'R';
                    312:            (*s_vecteur).taille = 1;
                    313:        }
                    314:    }
                    315: 
                    316:    /*
                    317:     * Calculs en virgule flottante
                    318:     */
                    319: 
                    320:    else if ((*s_matrice).type == 'R')
                    321:    {
                    322:        if (((*s_vecteur).tableau = malloc(sizeof(real8))) == NULL)
                    323:        {
                    324:            free(s_vecteur);
                    325:            return NULL;
                    326:        }
                    327: 
                    328:        if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    329:                sizeof(real8))) == NULL)
                    330:        {
                    331:            free(s_vecteur);
                    332:            return NULL;
                    333:        }
                    334: 
                    335:        for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    336:        {
                    337:            colonne[i] = ((real8 **) (*s_matrice).tableau)[i][position_1]
                    338:                    * ((real8 **) (*s_matrice).tableau)[i][position_2];
                    339:        }
                    340: 
                    341:        (*((real8 *) (*s_vecteur).tableau)) = sommation_vecteur_reel(
                    342:                colonne, &((*s_matrice).nombre_lignes), &erreur_memoire);
                    343: 
                    344:        if (erreur_memoire == d_vrai)
                    345:        {
                    346:            free(s_vecteur);
                    347:            return NULL;
                    348:        }
                    349: 
                    350:        free(colonne);
                    351: 
                    352:        (*s_vecteur).type = 'R';
                    353:        (*s_vecteur).taille = 1;
                    354:    }
                    355: 
                    356:    return s_vecteur;
                    357: }
                    358: 
                    359: 
                    360: /*
                    361: ================================================================================
                    362:   Fonction réalisant la somme d'une colonne de la matrice statistique
                    363: ================================================================================
                    364:   Entrées : pointeur sur une matrice entière ou réelle
                    365: --------------------------------------------------------------------------------
                    366:   Sorties : renvoie NULL s'il y a defaut de mémoire
                    367: --------------------------------------------------------------------------------
                    368:   Effets de bord : néant
                    369: ================================================================================
                    370: */
                    371: 
                    372: struct_vecteur *
                    373: sommation_colonne_statistique(struct_matrice *s_matrice, unsigned long position)
                    374: {
                    375:    integer8                    *cumul_entier;
                    376: 
                    377:    logical1                    erreur_memoire;
                    378:    logical1                    resultat_entier;
                    379: 
                    380:    real8                       *colonne;
                    381: 
                    382:    struct_vecteur              *s_vecteur;
                    383: 
                    384:    unsigned long               i;
                    385: 
                    386:    if ((s_vecteur = (struct_vecteur *) malloc(sizeof(struct_vecteur))) == NULL)
                    387:    {
                    388:        return NULL;
                    389:    }
                    390: 
                    391:    position--;
                    392: 
                    393:    /*
                    394:     * Calculs en virgule fixe
                    395:     */
                    396: 
                    397:    if ((*s_matrice).type == 'I')
                    398:    {
                    399:        if ((cumul_entier = (integer8 *) malloc(sizeof(integer8))) == NULL)
                    400:        {
                    401:            free(s_vecteur);
                    402:            return NULL;
                    403:        }
                    404: 
                    405:        (*cumul_entier) = 0;
                    406: 
                    407:        for(resultat_entier = d_vrai, i = 0; (i < (*s_matrice).nombre_lignes)
                    408:                && (resultat_entier == d_vrai); i++)
                    409:        {
                    410:            if (depassement_addition(cumul_entier, &(((integer8 **)
                    411:                    (*s_matrice).tableau)[i][position]), cumul_entier)
                    412:                    == d_erreur)
                    413:            {
                    414:                resultat_entier = d_faux;
                    415:            }
                    416:        }
                    417: 
                    418:        if (resultat_entier == d_vrai)
                    419:        {
                    420:            /*
                    421:             * Pas de dépassement
                    422:             */
                    423: 
                    424:            (*s_vecteur).type = 'I';
                    425:            (*s_vecteur).taille = 1;
                    426:            (*s_vecteur).tableau = cumul_entier;
                    427:        }
                    428:        else
                    429:        {
                    430:            /*
                    431:             * Dépassement... Refaire le calcul en virgule flottante
                    432:             */
                    433: 
                    434:            free(cumul_entier);
                    435: 
                    436:            if (((*s_vecteur).tableau = malloc(sizeof(real8))) == NULL)
                    437:            {
                    438:                free(s_vecteur);
                    439:                return NULL;
                    440:            }
                    441: 
                    442:            if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    443:                    sizeof(real8))) == NULL)
                    444:            {
                    445:                free(s_vecteur);
                    446:                return NULL;
                    447:            }
                    448: 
                    449:            for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    450:            {
                    451:                colonne[i] = (real8) ((integer8 **)
                    452:                        (*s_matrice).tableau)[i][position];
                    453:            }
                    454: 
                    455:            (*((real8 *) (*s_vecteur).tableau)) = sommation_vecteur_reel(
                    456:                    colonne, &((*s_matrice).nombre_lignes),
                    457:                    &erreur_memoire);
                    458: 
                    459:            if (erreur_memoire == d_vrai)
                    460:            {
                    461:                free(s_vecteur);
                    462:                return NULL;
                    463:            }
                    464: 
                    465:            free(colonne);
                    466: 
                    467:            (*s_vecteur).type = 'R';
                    468:            (*s_vecteur).taille = 1;
                    469:        }
                    470:    }
                    471: 
                    472:    /*
                    473:     * Calculs en virgule flottante
                    474:     */
                    475: 
                    476:    else if ((*s_matrice).type == 'R')
                    477:    {
                    478:        if (((*s_vecteur).tableau = malloc(sizeof(real8))) == NULL)
                    479:        {
                    480:            free(s_vecteur);
                    481:            return NULL;
                    482:        }
                    483: 
                    484:        if ((colonne = (real8 *) malloc((*s_matrice).nombre_lignes *
                    485:                sizeof(real8))) == NULL)
                    486:        {
                    487:            free(s_vecteur);
                    488:            return NULL;
                    489:        }
                    490: 
                    491:        for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    492:        {
                    493:            colonne[i] = ((real8 **) (*s_matrice).tableau)[i][position];
                    494:        }
                    495: 
                    496:        (*((real8 *) (*s_vecteur).tableau)) = sommation_vecteur_reel(
                    497:                colonne, &((*s_matrice).nombre_lignes), &erreur_memoire);
                    498: 
                    499:        if (erreur_memoire == d_vrai)
                    500:        {
                    501:            free(s_vecteur);
                    502:            return NULL;
                    503:        }
                    504: 
                    505:        free(colonne);
                    506: 
                    507:        (*s_vecteur).type = 'R';
                    508:        (*s_vecteur).taille = 1;
                    509:    }
                    510: 
                    511:    return s_vecteur;
                    512: }
                    513: 
                    514: 
                    515: /*
                    516: ================================================================================
                    517:   Fonction réalisant la moyenne de la matrice statistique
                    518: ================================================================================
                    519:   Entrées : pointeur sur une matrice entière ou réelle
                    520: --------------------------------------------------------------------------------
                    521:   Sorties : renvoie NULL s'il y a defaut de mémoire
                    522: --------------------------------------------------------------------------------
                    523:   Effets de bord : néant
                    524: ================================================================================
                    525: */
                    526: 
                    527: struct_vecteur *
                    528: moyenne_statistique(struct_matrice *s_matrice)
                    529: {
                    530:    integer8                    *tampon;
                    531: 
                    532:    logical1                    resultat_entier;
                    533: 
                    534:    struct_vecteur              *s_vecteur;
                    535: 
                    536:    unsigned long               i;
                    537: 
                    538:    if ((s_vecteur = sommation_statistique(s_matrice)) == NULL)
                    539:    {
                    540:        return NULL;
                    541:    }
                    542: 
                    543:    if ((*s_vecteur).type == 'R')
                    544:    {
                    545:        for(i = 0; i < (*s_vecteur).taille; i++)
                    546:        {
                    547:            ((real8 *) (*s_vecteur).tableau)[i] /= ((real8)
                    548:                    (*s_matrice).nombre_lignes);
                    549:        }
                    550:    }
                    551:    else
                    552:    {
                    553:        resultat_entier = d_vrai;
                    554: 
                    555:        for(i = 0; i < (*s_vecteur).taille; i++)
                    556:        {
                    557:            if ((((integer8 *) (*s_vecteur).tableau)[i] %
                    558:                    (*s_matrice).nombre_lignes) != 0)
                    559:            {
                    560:                resultat_entier = d_faux;
                    561:                break;
                    562:            }
                    563:        }
                    564: 
                    565:        if (resultat_entier == d_vrai)
                    566:        {
                    567:            for(i = 0; i < (*s_vecteur).taille; i++)
                    568:            {
                    569:                ((integer8 *) (*s_vecteur).tableau)[i] /= ((integer8)
                    570:                        (*s_matrice).nombre_lignes);
                    571:            }
                    572:        }
                    573:        else
                    574:        {
                    575:            tampon = (*s_vecteur).tableau;
                    576: 
                    577:            if (((*s_vecteur).tableau = malloc((*s_vecteur).taille *
                    578:                    sizeof(real8))) == NULL)
                    579:            {
                    580:                return NULL;
                    581:            }
                    582: 
                    583:            for(i = 0; i < (*s_vecteur).taille; i++)
                    584:            {
                    585:                ((real8 *) (*s_vecteur).tableau)[i] = ((real8) tampon[i]) /
                    586:                        ((real8) (*s_matrice).nombre_lignes);
                    587:            }
                    588: 
                    589:            (*s_vecteur).type = 'R';
                    590:            free(tampon);
                    591:        }
                    592:    }
                    593: 
                    594:    return s_vecteur;
                    595: }
                    596: 
                    597: 
                    598: /*
                    599: ================================================================================
                    600:   Fonction réalisant la variance de la matrice statistique
                    601: ================================================================================
                    602:   Entrées : pointeur sur une matrice entière ou réelle et type.
                    603:   Type vaut 'E' ou 'P' selon qu'il s'agit de statistiques sur un échantillon
                    604:   ou sur la population entière.
                    605: --------------------------------------------------------------------------------
                    606:   Sorties : renvoie NULL s'il y a defaut de mémoire
                    607: --------------------------------------------------------------------------------
                    608:   Effets de bord : néant
                    609: ================================================================================
                    610: */
                    611: 
                    612: struct_vecteur *
                    613: variance_statistique(struct_matrice *s_matrice, unsigned char type)
                    614: {
                    615:    integer8                        *tampon;
                    616: 
                    617:    logical1                        erreur_memoire;
                    618: 
                    619:    unsigned long                   i;
                    620:    unsigned long                   j;
                    621: 
                    622:    real8                           *cumul;
                    623: 
                    624:    struct_vecteur                  *s_moyenne;
                    625:    struct_vecteur                  *s_variance;
                    626: 
                    627:    if ((s_moyenne = moyenne_statistique(s_matrice)) == NULL)
                    628:    {
                    629:        return NULL;
                    630:    }
                    631: 
                    632:    /*
                    633:     * Le résultat de cette fonction est toujours réel.
                    634:     */
                    635: 
                    636:    if ((cumul = (real8 *) malloc((*s_matrice).nombre_lignes * sizeof(real8)))
                    637:            == NULL)
                    638:    {
                    639:        return NULL;
                    640:    }
                    641: 
                    642:    if ((s_variance = (struct_vecteur *) malloc(sizeof(struct_vecteur)))
                    643:            == NULL)
                    644:    {
                    645:        return NULL;
                    646:    }
                    647: 
                    648:    if ((*s_moyenne).type == 'I') 
                    649:    {
                    650:        tampon = (*s_moyenne).tableau;
                    651: 
                    652:        if (((*s_moyenne).tableau = malloc((*s_moyenne).taille * sizeof(real8)))
                    653:                == NULL)
                    654:        {
                    655:            return NULL;
                    656:        }
                    657: 
                    658:        for(i = 0; i < (*s_moyenne).taille; i++)
                    659:        {
                    660:            ((real8 *) (*s_moyenne).tableau)[i] = (real8) (tampon[i]);
                    661:        }
                    662: 
                    663:        (*s_moyenne).type = 'R';
                    664:        free(tampon);
                    665:    }
                    666: 
                    667:    if (((*s_variance).tableau = malloc((*s_matrice).nombre_colonnes *
                    668:            sizeof(real8))) == NULL)
                    669:    {
                    670:        return NULL;
                    671:    }
                    672: 
                    673:    if ((*s_matrice).type == 'I')
                    674:    {
                    675:        for(j = 0; j < (*s_matrice).nombre_colonnes; j++)
                    676:        {
                    677:            for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    678:            {
                    679:                cumul[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    680:                        [i][j]) - ((real8 *) (*s_moyenne).tableau)[j]) *
                    681:                        (((real8) ((integer8 **) (*s_matrice).tableau)[i][j]) -
                    682:                        ((real8 *) (*s_moyenne).tableau)[j]);
                    683:            }
                    684: 
                    685:            ((real8 *) (*s_variance).tableau)[j] = sommation_vecteur_reel(
                    686:                    cumul, &((*s_matrice).nombre_lignes), &erreur_memoire);
                    687: 
                    688:            if (erreur_memoire == d_vrai)
                    689:            {
                    690:                return NULL;
                    691:            }
                    692: 
                    693:            if (type == 'E')
                    694:            {
                    695:                ((real8 *) (*s_variance).tableau)[j] /= (real8)
                    696:                        ((*s_matrice).nombre_lignes - 1);
                    697:            }
                    698:            else
                    699:            {
                    700:                ((real8 *) (*s_variance).tableau)[j] /= (real8)
                    701:                        (*s_matrice).nombre_lignes;
                    702:            }
                    703:        }
                    704:    }
                    705:    else
                    706:    {
                    707:        for(j = 0; j < (*s_matrice).nombre_colonnes; j++)
                    708:        {
                    709:            for(i = 0; i < (*s_matrice).nombre_lignes; i++)
                    710:            {
                    711:                cumul[i] = (((real8 **) (*s_matrice).tableau)[i][j] -
                    712:                        ((real8 *) (*s_moyenne).tableau)[j]) *
                    713:                        (((real8 **) (*s_matrice).tableau)[i][j] -
                    714:                        ((real8 *) (*s_moyenne).tableau)[j]);
                    715:            }
                    716: 
                    717:            ((real8 *) (*s_variance).tableau)[j] = sommation_vecteur_reel(
                    718:                    cumul, &((*s_matrice).nombre_lignes), &erreur_memoire);
                    719: 
                    720:            if (erreur_memoire == d_vrai)
                    721:            {
                    722:                return NULL;
                    723:            }
                    724: 
                    725:            if (type == 'E')
                    726:            {
                    727:                ((real8 *) (*s_variance).tableau)[j] /= (real8)
                    728:                        ((*s_matrice).nombre_lignes - 1);
                    729:            }
                    730:            else
                    731:            {
                    732:                ((real8 *) (*s_variance).tableau)[j] /= (real8)
                    733:                        (*s_matrice).nombre_lignes;
                    734:            }
                    735:        }
                    736:    }
                    737: 
                    738:    free((*s_moyenne).tableau);
                    739:    free(s_moyenne);
                    740:    free(cumul);
                    741: 
                    742:    (*s_variance).type = 'R';
                    743:    (*s_variance).taille = (*s_matrice).nombre_colonnes;
                    744: 
                    745:    return s_variance;
                    746: }
                    747: 
                    748: 
                    749: /*
                    750: ================================================================================
                    751:   Fonction réalisant l'écart-type de la matrice statistique
                    752: ================================================================================
                    753:   Entrées : pointeur sur une matrice entière ou réelle
                    754: --------------------------------------------------------------------------------
                    755:   Sorties : renvoie NULL s'il y a defaut de mémoire
                    756: --------------------------------------------------------------------------------
                    757:   Effets de bord : néant
                    758: ================================================================================
                    759: */
                    760: 
                    761: struct_vecteur *
                    762: ecart_type_statistique(struct_matrice *s_matrice, unsigned char type)
                    763: {
                    764:    struct_vecteur                  *s_vecteur;
                    765: 
                    766:    unsigned long                   i;
                    767: 
                    768:    if ((s_vecteur = variance_statistique(s_matrice, type)) == NULL)
                    769:    {
                    770:        return NULL;
                    771:    }
                    772: 
                    773:    for(i = 0; i < (*s_vecteur).taille; i++)
                    774:    {
                    775:        ((real8 *) (*s_vecteur).tableau)[i] = sqrt(((real8 *)
                    776:                (*s_vecteur).tableau)[i]);
                    777:    }
                    778: 
                    779:    return s_vecteur;
                    780: }
                    781: 
                    782: 
                    783: /*
                    784: ================================================================================
                    785:   Fonction réalisant la corrélation de deux colonnes la matrice statistique
                    786: ================================================================================
                    787:   Entrées : pointeur sur une matrice entière ou réelle
                    788: --------------------------------------------------------------------------------
                    789:   Sorties :
                    790: --------------------------------------------------------------------------------
                    791:   Effets de bord : néant
                    792: ================================================================================
                    793: */
                    794: 
                    795: real8
                    796: correlation_statistique(struct_matrice *s_matrice,
                    797:        unsigned long colonne_1, unsigned long colonne_2, logical1 *erreur)
                    798: {
                    799:    logical1                erreur_memoire;
                    800: 
                    801:    real8                   denominateur;
                    802:    real8                   moyenne_colonne_1;
                    803:    real8                   moyenne_colonne_2;
                    804:    real8                   numerateur;
                    805:    real8                   *vecteur;
                    806: 
                    807:    unsigned long           i;
                    808:    unsigned long           nombre_observations;
                    809: 
                    810:    (*erreur) = d_absence_erreur;
                    811: 
                    812:    if ((vecteur = (real8 *) malloc((nombre_observations =
                    813:            (*s_matrice).nombre_lignes) * sizeof(real8))) == NULL)
                    814:    {
                    815:        (*erreur) = d_erreur;
                    816:        return 0;
                    817:    }
                    818: 
                    819:    colonne_1--;
                    820:    colonne_2--;
                    821: 
                    822:    if ((*s_matrice).type == 'R')
                    823:    {
                    824:        for(i = 0; i < nombre_observations; i++)
                    825:        {
                    826:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_1];
                    827:        }
                    828: 
                    829:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
                    830:                &nombre_observations, &erreur_memoire) / nombre_observations;
                    831: 
                    832:        if (erreur_memoire == d_vrai)
                    833:        {
                    834:            (*erreur) = d_erreur;
                    835:            return 0;
                    836:        }
                    837: 
                    838:        for(i = 0; i < nombre_observations; i++)
                    839:        {
                    840:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_2];
                    841:        }
                    842: 
                    843:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
                    844:                &nombre_observations, &erreur_memoire) / nombre_observations;
                    845: 
                    846:        if (erreur_memoire == d_vrai)
                    847:        {
                    848:            (*erreur) = d_erreur;
                    849:            return 0;
                    850:        }
                    851: 
                    852:        for(i = 0; i < nombre_observations; i++)
                    853:        {
                    854:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                    855:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                    856:                    [i][colonne_2] - moyenne_colonne_2);
                    857:        }
                    858: 
                    859:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    860:                &erreur_memoire);
                    861: 
                    862:        if (erreur_memoire == d_vrai)
                    863:        {
                    864:            (*erreur) = d_erreur;
                    865:            return 0;
                    866:        }
                    867: 
                    868:        for(i = 0; i < nombre_observations; i++)
                    869:        {
                    870:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                    871:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                    872:                    [i][colonne_1] - moyenne_colonne_1);
                    873:        }
                    874: 
                    875:        denominateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    876:                &erreur_memoire);
                    877: 
                    878:        if (erreur_memoire == d_vrai)
                    879:        {
                    880:            (*erreur) = d_erreur;
                    881:            return 0;
                    882:        }
                    883: 
                    884:        for(i = 0; i < nombre_observations; i++)
                    885:        {
                    886:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_2] -
                    887:                    moyenne_colonne_2) * (((real8 **) (*s_matrice).tableau)
                    888:                    [i][colonne_2] - moyenne_colonne_2);
                    889:        }
                    890: 
                    891:        denominateur *= sommation_vecteur_reel(vecteur, &nombre_observations,
                    892:                &erreur_memoire);
                    893: 
                    894:        if (erreur_memoire == d_vrai)
                    895:        {
                    896:            (*erreur) = d_erreur;
                    897:            return 0;
                    898:        }
                    899: 
                    900:        denominateur = sqrt(denominateur);
                    901:    }
                    902:    else
                    903:    {
                    904:        for(i = 0; i < nombre_observations; i++)
                    905:        {
                    906:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                    907:                    [i][colonne_1];
                    908:        }
                    909: 
                    910:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
                    911:                &nombre_observations, &erreur_memoire) / nombre_observations;
                    912: 
                    913:        if (erreur_memoire == d_vrai)
                    914:        {
                    915:            (*erreur) = d_erreur;
                    916:            return 0;
                    917:        }
                    918: 
                    919:        for(i = 0; i < nombre_observations; i++)
                    920:        {
                    921:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                    922:                    [i][colonne_2];
                    923:        }
                    924: 
                    925:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
                    926:                &nombre_observations, &erreur_memoire) / nombre_observations;
                    927: 
                    928:        if (erreur_memoire == d_vrai)
                    929:        {
                    930:            (*erreur) = d_erreur;
                    931:            return 0;
                    932:        }
                    933: 
                    934:        for(i = 0; i < nombre_observations; i++)
                    935:        {
                    936:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    937:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                    938:                    ((integer8 **) (*s_matrice).tableau)
                    939:                    [i][colonne_2]) - moyenne_colonne_2);
                    940:        }
                    941: 
                    942:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    943:                &erreur_memoire);
                    944: 
                    945:        if (erreur_memoire == d_vrai)
                    946:        {
                    947:            (*erreur) = d_erreur;
                    948:            return 0;
                    949:        }
                    950: 
                    951:        for(i = 0; i < nombre_observations; i++)
                    952:        {
                    953:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    954:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                    955:                    ((integer8 **) (*s_matrice).tableau)
                    956:                    [i][colonne_1]) - moyenne_colonne_1);
                    957:        }
                    958: 
                    959:        denominateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    960:                &erreur_memoire);
                    961: 
                    962:        if (erreur_memoire == d_vrai)
                    963:        {
                    964:            (*erreur) = d_erreur;
                    965:            return 0;
                    966:        }
                    967: 
                    968:        for(i = 0; i < nombre_observations; i++)
                    969:        {
                    970:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    971:                    [i][colonne_2]) - moyenne_colonne_2) * (((real8)
                    972:                    ((integer8 **) (*s_matrice).tableau)
                    973:                    [i][colonne_2]) - moyenne_colonne_2);
                    974:        }
                    975: 
                    976:        denominateur *= sommation_vecteur_reel(vecteur, &nombre_observations,
                    977:                &erreur_memoire);
                    978: 
                    979:        if (erreur_memoire == d_vrai)
                    980:        {
                    981:            (*erreur) = d_erreur;
                    982:            return 0;
                    983:        }
                    984: 
                    985:        denominateur = sqrt(denominateur);
                    986:    }
                    987: 
                    988:    free(vecteur);
                    989: 
                    990:    return numerateur / denominateur;
                    991: }
                    992: 
                    993: 
                    994: /*
                    995: ================================================================================
                    996:   Fonction réalisant la covariance de deux colonnes la matrice statistique
                    997: ================================================================================
                    998:   Entrées : pointeur sur une matrice entière ou réelle
                    999: --------------------------------------------------------------------------------
                   1000:   Sorties :
                   1001: --------------------------------------------------------------------------------
                   1002:   Effets de bord : néant
                   1003: ================================================================================
                   1004: */
                   1005: 
                   1006: real8
                   1007: covariance_statistique(struct_matrice *s_matrice,
                   1008:        unsigned long colonne_1, unsigned long colonne_2,
                   1009:        unsigned char type, logical1 *erreur)
                   1010: {
                   1011:    logical1                erreur_memoire;
                   1012: 
                   1013:    real8                   denominateur;
                   1014:    real8                   moyenne_colonne_1;
                   1015:    real8                   moyenne_colonne_2;
                   1016:    real8                   numerateur;
                   1017:    real8                   *vecteur;
                   1018: 
                   1019:    unsigned long           i;
                   1020:    unsigned long           nombre_observations;
                   1021: 
                   1022:    (*erreur) = d_absence_erreur;
                   1023: 
                   1024:    if ((vecteur = (real8 *) malloc((nombre_observations =
                   1025:            (*s_matrice).nombre_lignes) * sizeof(real8))) == NULL)
                   1026:    {
                   1027:        (*erreur) = d_erreur;
                   1028:        return 0;
                   1029:    }
                   1030: 
                   1031:    colonne_1--;
                   1032:    colonne_2--;
                   1033: 
                   1034:    if (type == 'E')
                   1035:    {
                   1036:        denominateur = nombre_observations - 1;
                   1037:    }
                   1038:    else
                   1039:    {
                   1040:        denominateur = nombre_observations;
                   1041:    }
                   1042: 
                   1043:    if ((*s_matrice).type == 'R')
                   1044:    {
                   1045:        for(i = 0; i < nombre_observations; i++)
                   1046:        {
                   1047:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_1];
                   1048:        }
                   1049: 
                   1050:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
                   1051:                &nombre_observations, &erreur_memoire) / nombre_observations;
                   1052: 
                   1053:        if (erreur_memoire == d_vrai)
                   1054:        {
                   1055:            (*erreur) = d_erreur;
                   1056:            return 0;
                   1057:        }
                   1058: 
                   1059:        for(i = 0; i < nombre_observations; i++)
                   1060:        {
                   1061:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_2];
                   1062:        }
                   1063: 
                   1064:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
                   1065:                &nombre_observations, &erreur_memoire) / nombre_observations;
                   1066: 
                   1067:        if (erreur_memoire == d_vrai)
                   1068:        {
                   1069:            (*erreur) = d_erreur;
                   1070:            return 0;
                   1071:        }
                   1072: 
                   1073:        for(i = 0; i < nombre_observations; i++)
                   1074:        {
                   1075:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                   1076:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                   1077:                    [i][colonne_2] - moyenne_colonne_2);
                   1078:        }
                   1079: 
                   1080:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                   1081:                &erreur_memoire);
                   1082: 
                   1083:        if (erreur_memoire == d_vrai)
                   1084:        {
                   1085:            (*erreur) = d_erreur;
                   1086:            return 0;
                   1087:        }
                   1088:    }
                   1089:    else
                   1090:    {
                   1091:        for(i = 0; i < nombre_observations; i++)
                   1092:        {
                   1093:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                   1094:                    [i][colonne_1];
                   1095:        }
                   1096: 
                   1097:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
                   1098:                &nombre_observations, &erreur_memoire) / nombre_observations;
                   1099: 
                   1100:        if (erreur_memoire == d_vrai)
                   1101:        {
                   1102:            (*erreur) = d_erreur;
                   1103:            return 0;
                   1104:        }
                   1105: 
                   1106:        for(i = 0; i < nombre_observations; i++)
                   1107:        {
                   1108:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                   1109:                    [i][colonne_2];
                   1110:        }
                   1111: 
                   1112:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
                   1113:                &nombre_observations, &erreur_memoire) / nombre_observations;
                   1114: 
                   1115:        if (erreur_memoire == d_vrai)
                   1116:        {
                   1117:            (*erreur) = d_erreur;
                   1118:            return 0;
                   1119:        }
                   1120: 
                   1121:        for(i = 0; i < nombre_observations; i++)
                   1122:        {
                   1123:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                   1124:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                   1125:                    ((integer8 **) (*s_matrice).tableau)
                   1126:                    [i][colonne_2]) - moyenne_colonne_2);
                   1127:        }
                   1128: 
                   1129:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                   1130:                &erreur_memoire);
                   1131: 
                   1132:        if (erreur_memoire == d_vrai)
                   1133:        {
                   1134:            (*erreur) = d_erreur;
                   1135:            return 0;
                   1136:        }
                   1137:    }
                   1138: 
                   1139:    free(vecteur);
                   1140: 
                   1141:    return numerateur / denominateur;
                   1142: }
                   1143: 
                   1144: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>