Matrice variance covariance Memory allocation [Résolu]

Messages postés
14
Date d'inscription
jeudi 30 août 2007
Dernière intervention
17 novembre 2009
- - Dernière réponse : abourammada
Messages postés
1
Date d'inscription
mercredi 9 décembre 2009
Dernière intervention
19 décembre 2010
- 19 déc. 2010 à 22:27
Hello tout le monde,

J'utilise Visual Studio 2008 et Vista, je travaille sur une implementation de la décomposition de Cholesky avec la librairie Newmat (www.robertnz.net )
L'idée est donc est de décomposer une matrice de variance co-variance en produit d'une matrice triangulaire et de sa transposée.

Je teste le programme de deux manières:
 je remplis, d'une part, un tableau 5 valeurs aléatoires et d'autre part un tableau 2 v.a à la main.
Je calcule les deux matrices de variance co-variance ( une matrice 5x5 et une de 2x2) à partir de ces tableaux.
Lorsque je lance la fonction cholesky, elle échoue sur la matrice 5x5.


                                                    ///main.cpp

#pragma once
#include "stdafx.h"
#include "newmat.h"
#include "newmatap.h"
#include "systd.h"
#include "MatrixUtil.h"
#include 
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    
    int k;
    double testarray[5][5];
    double data[2][5];
    SymmetricMatrix Sm(5);
    SymmetricMatrix Sn(2);
    Real row[5];
    Real row2[2];
    Matrix lb(5,5);
    Matrix lbb(2,2);
    

    //remplit 5 tableaux de 5 données aléatoires

    for (int i=0;i<5;i++)
    {
       for (int j=0; j<5;j++)
        {
         srand(rdtsc());
         testarray[i][j]=rand()/1000000;
        }         
    }

    //2 tableaux 5 données aléatoires excel

    data[0][0]=0.660048032;
    data[0][1]=0.217713592;
    data[0][2]=0.247516995;
    data[0][3]=0.227325802;
    data[0][4]=0.603684;

    data[1][0]=0.76597264;
    data[1][1]=0.807215493;
    data[1][2]=0.162867934;
    data[1][3]=0.175573876;
    data[1][4]=0.48842748;

  
   //Calcule la matrice de variance covariance 5x5

     for (int i=0;i<5;i++)
    {
        for (int j=0;j<5;j++)
        {
         row[j]=covar(testarray[i],testarray[j],5);
        }
         Sm.row(i+1)<<row;
    }

   Calcule la matrice de variance covariance 2x2

    for (int i=0;i<2;i++)
    {
      for(int j=0;j<2;j++)
      {
          row2[j]=covar(data[i],data[j],5);
      }

      Sn.row(i+1)<<row2;
    }
        
            
    // Appels à la fonction Cholesky()
        
        lbb= Cholesky(Sn);
        lb=Cholesky(Sm);

       //affiche une valeur pour vérifier que la matrice de résultat n'est pas vide      
        cout<<lbb(1,1);
        cin>>k; 



Voici les fonctions  pour la variance et la covariance, mais a priori elles fonctionnent.

                                                    // var.h


double moy(double *data, int nbdata)
{
    double m=0;

    for(int i=0;i<nbdata;i++)
    {
      m+=data[i];
    }

    m=m/nbdata;

    return m;
}

double covar(double *data1,double *data2,int nbdata)
{
    double m1=0;
    double m2=0;
    double prodecart=0;

    m1=moy(data1,nbdata);
    m2=moy(data2,nbdata);

    for (int i=0;i<nbdata;i++)
    {
      prodecart+=(data1[i]-m1)*(data2[i]-m2);
    }

    prodecart=prodecart/nbdata;

    return prodecart;
}



Lorsque je teste le programme Cholesky sur la matrice 5x5 échoue presque à chaque fois. Newmat lance une exception: " non positive defined memory exception at..." . Or à ce qui me semble les matrices de variance covariance sont par définition positive définie. J'imagine que j'ai un problème au moment du calcule de la matrice de variance covariance.
En revanche, je n'ai pas de problème avec la 2x2.

Si quelqu'un à une idée, merci par avance.

tikam75007
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
1
Date d'inscription
samedi 25 octobre 2008
Dernière intervention
22 novembre 2009
3
Merci
Elle est symetrice, c'est ok.

Mais n'aurais tu pas des val < 0 dans ta matrice de cov avec les moyennes calculées ?
Sinon, la decomp. de Cholesky est ok si c'est une matrice défine symetrique ET positive, decomposable tq:

X V * Vt avec X ta matrice de Cov symetrique > 0
V = matrice triangulaire superieure définie positive.

Merci Niddam31 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Niddam31
Messages postés
1
Date d'inscription
mercredi 9 décembre 2009
Dernière intervention
19 décembre 2010
0
Merci
Bonjour j'ai besoin d'un programme en c++ qui calcul la l'ecart type d'une matrice

Merci d'avance;
Commenter la réponse de abourammada

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.