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

1.1       bertrand    1: /*
                      2: ================================================================================
1.42    ! bertrand    3:   RPL/2 (R) version 4.1.14
1.39      bertrand    4:   Copyright (C) 1989-2013 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: 
1.41      bertrand   50:    integer8                    i;
                     51:    integer8                    j;
1.1       bertrand   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:    {
1.41      bertrand   64:        if ((cumul_entier = (integer8 *) malloc(((size_t) (*s_matrice)
                     65:                .nombre_colonnes) * sizeof(integer8))) == NULL)
1.1       bertrand   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: 
1.41      bertrand  106:            if (((*s_vecteur).tableau = malloc(((size_t) (*s_matrice)
                    107:                    .nombre_colonnes) * sizeof(real8))) == NULL)
1.1       bertrand  108:            {
                    109:                free(s_vecteur);
                    110:                return NULL;
                    111:            }
                    112: 
1.41      bertrand  113:            if ((colonne = (real8 *) malloc(((size_t) (*s_matrice)
                    114:                    .nombre_lignes) * sizeof(real8))) == NULL)
1.1       bertrand  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:    {
1.41      bertrand  152:        if (((*s_vecteur).tableau = malloc(((size_t) (*s_matrice)
                    153:                .nombre_colonnes) * sizeof(real8))) == NULL)
1.1       bertrand  154:        {
                    155:            free(s_vecteur);
                    156:            return NULL;
                    157:        }
                    158: 
1.41      bertrand  159:        if ((colonne = (real8 *) malloc(((size_t) (*s_matrice).nombre_lignes) *
1.1       bertrand  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,
1.41      bertrand  208:        integer8 position_1, integer8 position_2)
1.1       bertrand  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: 
1.41      bertrand  220:    integer8                    i;
1.1       bertrand  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: 
1.41      bertrand  284:            if ((colonne = (real8 *) malloc(((size_t) (*s_matrice)
                    285:                    .nombre_lignes) * sizeof(real8))) == NULL)
1.1       bertrand  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: 
1.41      bertrand  328:        if ((colonne = (real8 *) malloc(((size_t) (*s_matrice).nombre_lignes) *
1.1       bertrand  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 *
1.41      bertrand  373: sommation_colonne_statistique(struct_matrice *s_matrice, integer8 position)
1.1       bertrand  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: 
1.41      bertrand  384:    integer8                    i;
1.1       bertrand  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: 
1.41      bertrand  442:            if ((colonne = (real8 *) malloc(((size_t) (*s_matrice)
                    443:                    .nombre_lignes) * sizeof(real8))) == NULL)
1.1       bertrand  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: 
1.41      bertrand  484:        if ((colonne = (real8 *) malloc(((size_t) (*s_matrice).nombre_lignes) *
1.1       bertrand  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: 
1.41      bertrand  536:    integer8                    i;
1.1       bertrand  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: 
1.41      bertrand  577:            if (((*s_vecteur).tableau = malloc(((size_t) (*s_vecteur).taille) *
1.1       bertrand  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: 
1.41      bertrand  619:    integer8                        i;
                    620:    integer8                        j;
1.1       bertrand  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: 
1.41      bertrand  636:    if ((cumul = (real8 *) malloc(((size_t) (*s_matrice).nombre_lignes) *
                    637:           sizeof(real8))) == NULL)
1.1       bertrand  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: 
1.41      bertrand  652:        if (((*s_moyenne).tableau = malloc(((size_t) (*s_moyenne).taille) *
                    653:                sizeof(real8))) == NULL)
1.1       bertrand  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: 
1.41      bertrand  667:    if (((*s_variance).tableau = malloc(((size_t) (*s_matrice).nombre_colonnes)
                    668:            * sizeof(real8))) == NULL)
1.1       bertrand  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: 
1.41      bertrand  766:    integer8                        i;
1.1       bertrand  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,
1.41      bertrand  797:        integer8 colonne_1, integer8 colonne_2, logical1 *erreur)
1.1       bertrand  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: 
1.41      bertrand  807:    integer8                i;
                    808:    integer8                nombre_observations;
1.1       bertrand  809: 
                    810:    (*erreur) = d_absence_erreur;
                    811: 
1.41      bertrand  812:    if ((vecteur = (real8 *) malloc(((size_t) (nombre_observations =
                    813:            (*s_matrice).nombre_lignes)) * sizeof(real8))) == NULL)
1.1       bertrand  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,
1.41      bertrand  830:                &nombre_observations, &erreur_memoire) /
                    831:                ((real8) nombre_observations);
1.1       bertrand  832: 
                    833:        if (erreur_memoire == d_vrai)
                    834:        {
                    835:            (*erreur) = d_erreur;
                    836:            return 0;
                    837:        }
                    838: 
                    839:        for(i = 0; i < nombre_observations; i++)
                    840:        {
                    841:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_2];
                    842:        }
                    843: 
                    844:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
1.41      bertrand  845:                &nombre_observations, &erreur_memoire) /
                    846:                ((real8) nombre_observations);
1.1       bertrand  847: 
                    848:        if (erreur_memoire == d_vrai)
                    849:        {
                    850:            (*erreur) = d_erreur;
                    851:            return 0;
                    852:        }
                    853: 
                    854:        for(i = 0; i < nombre_observations; i++)
                    855:        {
                    856:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                    857:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                    858:                    [i][colonne_2] - moyenne_colonne_2);
                    859:        }
                    860: 
                    861:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    862:                &erreur_memoire);
                    863: 
                    864:        if (erreur_memoire == d_vrai)
                    865:        {
                    866:            (*erreur) = d_erreur;
                    867:            return 0;
                    868:        }
                    869: 
                    870:        for(i = 0; i < nombre_observations; i++)
                    871:        {
                    872:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                    873:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                    874:                    [i][colonne_1] - moyenne_colonne_1);
                    875:        }
                    876: 
                    877:        denominateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    878:                &erreur_memoire);
                    879: 
                    880:        if (erreur_memoire == d_vrai)
                    881:        {
                    882:            (*erreur) = d_erreur;
                    883:            return 0;
                    884:        }
                    885: 
                    886:        for(i = 0; i < nombre_observations; i++)
                    887:        {
                    888:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_2] -
                    889:                    moyenne_colonne_2) * (((real8 **) (*s_matrice).tableau)
                    890:                    [i][colonne_2] - moyenne_colonne_2);
                    891:        }
                    892: 
                    893:        denominateur *= sommation_vecteur_reel(vecteur, &nombre_observations,
                    894:                &erreur_memoire);
                    895: 
                    896:        if (erreur_memoire == d_vrai)
                    897:        {
                    898:            (*erreur) = d_erreur;
                    899:            return 0;
                    900:        }
                    901: 
                    902:        denominateur = sqrt(denominateur);
                    903:    }
                    904:    else
                    905:    {
                    906:        for(i = 0; i < nombre_observations; i++)
                    907:        {
                    908:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                    909:                    [i][colonne_1];
                    910:        }
                    911: 
                    912:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
1.41      bertrand  913:                &nombre_observations, &erreur_memoire) /
                    914:                ((real8) nombre_observations);
1.1       bertrand  915: 
                    916:        if (erreur_memoire == d_vrai)
                    917:        {
                    918:            (*erreur) = d_erreur;
                    919:            return 0;
                    920:        }
                    921: 
                    922:        for(i = 0; i < nombre_observations; i++)
                    923:        {
                    924:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                    925:                    [i][colonne_2];
                    926:        }
                    927: 
                    928:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
1.41      bertrand  929:                &nombre_observations, &erreur_memoire) /
                    930:                ((real8) nombre_observations);
1.1       bertrand  931: 
                    932:        if (erreur_memoire == d_vrai)
                    933:        {
                    934:            (*erreur) = d_erreur;
                    935:            return 0;
                    936:        }
                    937: 
                    938:        for(i = 0; i < nombre_observations; i++)
                    939:        {
                    940:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    941:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                    942:                    ((integer8 **) (*s_matrice).tableau)
                    943:                    [i][colonne_2]) - moyenne_colonne_2);
                    944:        }
                    945: 
                    946:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    947:                &erreur_memoire);
                    948: 
                    949:        if (erreur_memoire == d_vrai)
                    950:        {
                    951:            (*erreur) = d_erreur;
                    952:            return 0;
                    953:        }
                    954: 
                    955:        for(i = 0; i < nombre_observations; i++)
                    956:        {
                    957:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    958:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                    959:                    ((integer8 **) (*s_matrice).tableau)
                    960:                    [i][colonne_1]) - moyenne_colonne_1);
                    961:        }
                    962: 
                    963:        denominateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                    964:                &erreur_memoire);
                    965: 
                    966:        if (erreur_memoire == d_vrai)
                    967:        {
                    968:            (*erreur) = d_erreur;
                    969:            return 0;
                    970:        }
                    971: 
                    972:        for(i = 0; i < nombre_observations; i++)
                    973:        {
                    974:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                    975:                    [i][colonne_2]) - moyenne_colonne_2) * (((real8)
                    976:                    ((integer8 **) (*s_matrice).tableau)
                    977:                    [i][colonne_2]) - moyenne_colonne_2);
                    978:        }
                    979: 
                    980:        denominateur *= sommation_vecteur_reel(vecteur, &nombre_observations,
                    981:                &erreur_memoire);
                    982: 
                    983:        if (erreur_memoire == d_vrai)
                    984:        {
                    985:            (*erreur) = d_erreur;
                    986:            return 0;
                    987:        }
                    988: 
                    989:        denominateur = sqrt(denominateur);
                    990:    }
                    991: 
                    992:    free(vecteur);
                    993: 
                    994:    return numerateur / denominateur;
                    995: }
                    996: 
                    997: 
                    998: /*
                    999: ================================================================================
                   1000:   Fonction réalisant la covariance de deux colonnes la matrice statistique
                   1001: ================================================================================
                   1002:   Entrées : pointeur sur une matrice entière ou réelle
                   1003: --------------------------------------------------------------------------------
                   1004:   Sorties :
                   1005: --------------------------------------------------------------------------------
                   1006:   Effets de bord : néant
                   1007: ================================================================================
                   1008: */
                   1009: 
                   1010: real8
1.41      bertrand 1011: covariance_statistique(struct_matrice *s_matrice, integer8 colonne_1,
                   1012:        integer8 colonne_2, unsigned char type, logical1 *erreur)
1.1       bertrand 1013: {
                   1014:    logical1                erreur_memoire;
                   1015: 
                   1016:    real8                   denominateur;
                   1017:    real8                   moyenne_colonne_1;
                   1018:    real8                   moyenne_colonne_2;
                   1019:    real8                   numerateur;
                   1020:    real8                   *vecteur;
                   1021: 
1.41      bertrand 1022:    integer8                i;
                   1023:    integer8                nombre_observations;
1.1       bertrand 1024: 
                   1025:    (*erreur) = d_absence_erreur;
                   1026: 
1.41      bertrand 1027:    if ((vecteur = (real8 *) malloc(((size_t) (nombre_observations =
                   1028:            (*s_matrice).nombre_lignes)) * sizeof(real8))) == NULL)
1.1       bertrand 1029:    {
                   1030:        (*erreur) = d_erreur;
                   1031:        return 0;
                   1032:    }
                   1033: 
                   1034:    colonne_1--;
                   1035:    colonne_2--;
                   1036: 
                   1037:    if (type == 'E')
                   1038:    {
1.41      bertrand 1039:        denominateur = ((real8) nombre_observations) - 1;
1.1       bertrand 1040:    }
                   1041:    else
                   1042:    {
1.41      bertrand 1043:        denominateur = ((real8) nombre_observations);
1.1       bertrand 1044:    }
                   1045: 
                   1046:    if ((*s_matrice).type == 'R')
                   1047:    {
                   1048:        for(i = 0; i < nombre_observations; i++)
                   1049:        {
                   1050:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_1];
                   1051:        }
                   1052: 
                   1053:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
1.41      bertrand 1054:                &nombre_observations, &erreur_memoire) /
                   1055:                ((real8) nombre_observations);
1.1       bertrand 1056: 
                   1057:        if (erreur_memoire == d_vrai)
                   1058:        {
                   1059:            (*erreur) = d_erreur;
                   1060:            return 0;
                   1061:        }
                   1062: 
                   1063:        for(i = 0; i < nombre_observations; i++)
                   1064:        {
                   1065:            vecteur[i] = ((real8 **) (*s_matrice).tableau)[i][colonne_2];
                   1066:        }
                   1067: 
                   1068:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
1.41      bertrand 1069:                &nombre_observations, &erreur_memoire) /
                   1070:                ((real8) nombre_observations);
1.1       bertrand 1071: 
                   1072:        if (erreur_memoire == d_vrai)
                   1073:        {
                   1074:            (*erreur) = d_erreur;
                   1075:            return 0;
                   1076:        }
                   1077: 
                   1078:        for(i = 0; i < nombre_observations; i++)
                   1079:        {
                   1080:            vecteur[i] = (((real8 **) (*s_matrice).tableau)[i][colonne_1] -
                   1081:                    moyenne_colonne_1) * (((real8 **) (*s_matrice).tableau)
                   1082:                    [i][colonne_2] - moyenne_colonne_2);
                   1083:        }
                   1084: 
                   1085:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                   1086:                &erreur_memoire);
                   1087: 
                   1088:        if (erreur_memoire == d_vrai)
                   1089:        {
                   1090:            (*erreur) = d_erreur;
                   1091:            return 0;
                   1092:        }
                   1093:    }
                   1094:    else
                   1095:    {
                   1096:        for(i = 0; i < nombre_observations; i++)
                   1097:        {
                   1098:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                   1099:                    [i][colonne_1];
                   1100:        }
                   1101: 
                   1102:        moyenne_colonne_1 = sommation_vecteur_reel(vecteur,
1.41      bertrand 1103:                &nombre_observations, &erreur_memoire) /
                   1104:                ((real8) nombre_observations);
1.1       bertrand 1105: 
                   1106:        if (erreur_memoire == d_vrai)
                   1107:        {
                   1108:            (*erreur) = d_erreur;
                   1109:            return 0;
                   1110:        }
                   1111: 
                   1112:        for(i = 0; i < nombre_observations; i++)
                   1113:        {
                   1114:            vecteur[i] = (real8) ((integer8 **) (*s_matrice).tableau)
                   1115:                    [i][colonne_2];
                   1116:        }
                   1117: 
                   1118:        moyenne_colonne_2 = sommation_vecteur_reel(vecteur,
1.41      bertrand 1119:                &nombre_observations, &erreur_memoire) /
                   1120:                ((real8) nombre_observations);
1.1       bertrand 1121: 
                   1122:        if (erreur_memoire == d_vrai)
                   1123:        {
                   1124:            (*erreur) = d_erreur;
                   1125:            return 0;
                   1126:        }
                   1127: 
                   1128:        for(i = 0; i < nombre_observations; i++)
                   1129:        {
                   1130:            vecteur[i] = (((real8) ((integer8 **) (*s_matrice).tableau)
                   1131:                    [i][colonne_1]) - moyenne_colonne_1) * (((real8)
                   1132:                    ((integer8 **) (*s_matrice).tableau)
                   1133:                    [i][colonne_2]) - moyenne_colonne_2);
                   1134:        }
                   1135: 
                   1136:        numerateur = sommation_vecteur_reel(vecteur, &nombre_observations,
                   1137:                &erreur_memoire);
                   1138: 
                   1139:        if (erreur_memoire == d_vrai)
                   1140:        {
                   1141:            (*erreur) = d_erreur;
                   1142:            return 0;
                   1143:        }
                   1144:    }
                   1145: 
                   1146:    free(vecteur);
                   1147: 
                   1148:    return numerateur / denominateur;
                   1149: }
                   1150: 
                   1151: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>