Matrice variance covariance Memory allocation [Résolu]

tikam75007 14 Messages postés jeudi 30 août 2007Date d'inscription 17 novembre 2009 Dernière intervention - 28 avril 2009 à 10:02 - Dernière réponse : abourammada 1 Messages postés mercredi 9 décembre 2009Date d'inscription 19 décembre 2010 Dernière intervention
- 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 

2 réponses

Répondre au sujet
Niddam31 1 Messages postés samedi 25 octobre 2008Date d'inscription 22 novembre 2009 Dernière intervention - 22 nov. 2009 à 22:34
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Niddam31
abourammada 1 Messages postés mercredi 9 décembre 2009Date d'inscription 19 décembre 2010 Dernière intervention - 19 déc. 2010 à 22:27
0
Utile
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.