Newmat matrice de variance covariance, Cholesky.
Bonjour,
J'ai un problème avec la librairie Newmat.
J'utilise MSVC 2008 Express Edition.
Je cherche à faire une factorisation de Cholesky. Ca marche dans certains cas et pas dans d'autres.
Le premier cas - n'a jamais marché: je remplis un tableau[5]de données aléatoires. Je calcule ensuite une matrice de var-covar 5x5. Je passe la matrice en paramètre à la fonction Cholesky. J'obtiens une erreur: la matrice ne serait pas definie positive (or il me semble que les matrices de variance covariance sont par définition définie positive).
Le second cas -je rentre les valeurs à la main. Et là, ça marche pour pour une matrice 2x2, en revanche pour une matrice 5x5, ça plante.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#pragma once
#include "stdafx.h"
#include "newmat.h"
#include "newmatap.h"
#include "systd.h"
#include "MatrixUtil.h"
#include <iostream>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
int k;
double testarray[5][5];
double data[5][5];
double alea;
SymmetricMatrix Sm(5);
SymmetricMatrix Sn(5);
Real row[5];
Real row2[5];
//Matrix lb(5,5);
LowerTriangularMatrix lb(5);
//Matrix lbb(2,2);
LowerTriangularMatrix lbb(5);
//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()/1000000000;
}
}
//5 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;
data[2][0]=0.03411005;
data[2][1]=0.616749194;
data[2][2]=0.71715398;
data[2][3]=0.662020272;
data[2][4]=0.275495945;
data[3][0]=0.923914837;
data[3][1]=0.464834097;
data[3][2]=0.006845267;
data[3][3]=0.283835072;
data[3][4]=0.927493253;
data[4][0]=0.979239641;
data[4][1]=0.736209723;
data[4][2]=0.669861444;
data[4][3]=0.686475213;
data[4][4]=0.373474781;
for (int i=0;i<4;i++)
{
for (int j=0;j<4;j++)
{
row[j]=covar(testarray[i],testarray[j],5);
}
Sm.row(i+1)<<row;
}
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;
}
lbb= Cholesky(Sn);
lb=Cholesky(Sm);
cout<<lbb(1,1);
cin>>k;
return 0;
} |
Par ailleurs, voici le code pour la fonction de covariance, qui a fonctionné pour les tests que j'ai fait jusqu'à présent.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
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;
} |
la fonction covar fait appel à une fonction moy, qui ne présente pas d'intérêt particulier. Je la mets pour la forme.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
double moy(double *data, int nbdata)
{
double m=0;
for(int i=0;i<nbdata;i++)
{
m+=data[i];
}
m=m/nbdata;
return m;
} |
Je ne sais plus trop quoi penser.Si quelqu'un à une idée, je le remercie par avance.
@+
Tikam75007.