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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager