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.