Annotation of rpl/src/statistiques.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
! 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:
! 23: #include "rpl.conv.h"
! 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>