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