begin process at 2012 05 28 11:43:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

Aide sur la construction d'une fonction


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Aide sur la construction d'une fonction

vendredi 11 août 2006 à 10:44:24 | Aide sur la construction d'une fonction

iamor

Bonsoir, je souhaite améliorer un programme que j'ai codé pour qu'il soit plus clean, mais pour se faire j'aurai besoin d'avoir une petite aide sur la construction d'une fonction.

Le programme en question récupère à partir d'un fichier texte une matrice de covaraince, test si elle est définie positive, puis la rende définie positive dans le cas ou elle ne l'est pas.
Ensuite il la décompose suivant cholesky puis la multiplie par une vecteur de variables aléoatoires normales afin de simuler une loie normale.

Mon code est le suivant sans amélioration:

[code]
//fichier main principal
#include "essai.h"
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <string>


using namespace std;

 

int main()
{
 //initialise la graine du générateur de variable normale
 init_genrand(time(NULL));
 ifstream fichierEntree("D:\\Documents and Settings\\AMOR\\Desktop\\VaRaction\\covariance.txt", ios::in);
 int dim;
 fichierEntree >> dim;
 ArrayLengthSpecifier dimension(dim);
 SymmetricMatrix covariance(dimension);
 /* lecture de la matrice */
 for( int i=1 ; i<=dim ; ++i )
 { 
 for( int j=1 ; j<=i ; ++j ) 
 {   
 double val;   
 fichierEntree >> val;   
 covariance(i,j) = val; 
 }
 }
 fichierEntree.close();
 
 
 //décompose la matrice de covariance suivant cholesky
 Matrix C; 
 C = chol(covariance); 
 int nbre_simul;
 ColumnVector E;
 ColumnVector epsilon_correl;
 

 
 //saisie du nombre de simulation
 cout << "Veuillez saisir le nombre de simulations souhaitees : ";
 cin >> nbre_simul;
 // définie la matrice de sortie
 Matrix simul_epsilon (nbre_simul,dim);
 for(int i=1 ; i<=nbre_simul ; ++i )
 { 
 E = simind(dim); 
 epsilon_correl = C * E;    
 for(int j=1 ; j<=dim ; ++j )
 {   
 simul_epsilon(i,j) = epsilon_correl(j); 
 }
 }
 
 std::cout << simul_epsilon(4,4) << std::endl;

   
 /* affichage pour tester la matrice de cholesky */
 for( int i=1 ; i<=dim ; ++i )
 { 
 for( int j=1 ; j<=dim ; ++j )
 {   
 if (j==1)
 std::cout << C(i,j); 
 else
   {
 std::cout << " " << C(i,j); 
   } 
 } 
    std::cout << std::endl;
 }


 /* affichage pour tester la matrice simul_epsilon */
 for( int i=1 ; i<=nbre_simul ; ++i )
 { 
 for( int j=1 ; j<=dim ; ++j )
 {   
 if (j==1)
 std::cout << simul_epsilon(i,j); 
 else
   {
 std::cout << " " << simul_epsilon(i,j); 
   } 
 } 
    std::cout << std::endl;
 }
 
 
 //écriture de la matrice de Cholesky transformée dans un fichier .txt

 ofstream fichierSortie("C:\\Matrice de cholesky transformée.txt",ios::out);
 if (!fichierSortie)
 {
  cerr << "Création du fichier impossible" << endl;
  exit(1);
    }
 for (int i=1;i<=dim;i++)
 { 
 for (int j=1;j<=i;j++)
 {   
 if (j==1)
 fichierSortie << C(i,j);
 else
   {
   fichierSortie <<  " " << C(i,j);                           
   }
 }
 fichierSortie << endl;
 }
 
 return 0;
 
}
[/code]

Pour l'améliorer je construis en plus des fonction simind et chol une fonction simcor qui va se charger de faire la décomposition de cholesky puis multiplier celle-ci par le vecteur de variable aléatoire normale et cela pour n simulations.

Voilà le fichier contenant ces fonctions:
[code]
// Il s'agit du fichier DLL principal.

#include "stdafx.h"

#include "CorrelSimul.h"

ReturnMatrix chol(const SymmetricMatrix& correlation)
{
 //renvoie la dimension de la matrice de corrélation
 ArrayLengthSpecifier dimension(correlation.Nrows());
 int dimension1 = correlation.Nrows();
 //initialise le test de défini positivité à faux
 bool test=false;
 //diagonalise la matrice de corrélation
 DiagonalMatrix D(dimension);
 Matrix V(dimension1,dimension1);
 LowerTriangularMatrix L(dimension);
 Matrix resultat;
 //renvoie les valeurs propres
 EigenValues(correlation,D,V);
 //
 if (D(1)<=0) test=true;
  
 if (test=false)
 {
  L = Cholesky(correlation);
  resultat=L;
 }
 else
 {
  for (int i = 1; i <= dimension1; i++)
  {
   D(i)=sqrt(max(D(i),0)); /* on transforme D en D+ puis en (D+)^1/2
         pour prendre la racine carrée */
  }
  
   resultat = V*D*V.t();
    
  
 }
 
 D.Release();
 V.Release();
 L.Release();
 return resultat;
}

ReturnMatrix simind(const int& nbre_noms)
{
 //créer une matrice colonne epsilon
 ColumnVector epsilon;
 //redimensionne la matrice espsilon avec la dimension correpondante
 //au nombre de titre
 epsilon.ReSize(nbre_noms);
 //générateur de loie normale
 for (int i=1;  i<=nbre_noms; ++i)
 { 
  
  epsilon(i)= normal_random();
 }
 epsilon.Release();
 return epsilon;
}


ReturnMatrix simcor(const int& nbre_simul, const int& dim, const SymmetricMatrix& covariance)
{
  
 //décompose la matrice de covariance suivant cholesky
 Matrix C; 
 C = chol(covariance);

 //définie le vecteur de variables aléatoires normales
 ColumnVector E;

 //définie le vecteur issue de la multiplication de E et C
 ColumnVector epsilon_correl;

 // définie la matrice de sortie
 Matrix simul_epsilon (nbre_simul,dim);

 for(int i=1 ; i<=nbre_simul ; ++i )
 { 
 E = simind(dim); 
 epsilon_correl = C * E;    
 for(int j=1 ; j<=dim ; ++j )
 {   
 simul_epsilon(i,j) = epsilon_correl(j); 
 }
 }
 
 C.Release();
 E.Release();
 epsilon_correl.Release();
 simul_epsilon.Release();


 return simul_epsilon;
}
[/code]

Le fichier principal devient
[code]
//fichier main principal
#include "essai.h"
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <string>


using namespace std;

 

int main()
{
 //initialise la graine du générateur de variable normale
 init_genrand(time(NULL));
 ifstream fichierEntree("D:\\Documents and Settings\\AMOR\\Desktop\\VaRaction\\covariance.txt", ios::in);
 int dim;
 fichierEntree >> dim;
 ArrayLengthSpecifier dimension(dim);
 SymmetricMatrix covariance(dimension);
 /* lecture de la matrice */
 for( int i=1 ; i<=dim ; ++i )
 { 
 for( int j=1 ; j<=i ; ++j ) 
 {   
 double val;   
 fichierEntree >> val;   
 covariance(i,j) = val; 
 }
 }
 fichierEntree.close();
 

 //saisie du nombre de simulation
 int x;
 cout << "Veuillez saisir le nombre de simulations souhaitees : ";
 cin >> x;

 

 //définie la matrice de sortie
 //Matrix sortie(x,dim);
 //sortie = simcor(x, dim, covariance);
 //std::cout << sortie(4,4) << std::endl;
 

 //écriture de la matrice de Cholesky transformée dans un fichier .txt

 ofstream fichierSortie("C:\\Matrice de cholesky transformée.txt",ios::out);
 if (!fichierSortie)
 {
  cerr << "Création du fichier impossible" << endl;
  exit(1);
    }
 Matrix COLout;
 COLout = chol(covariance);
 for (int i=1;i<=dim;i++)
 { 
 for (int j=1;j<=i;j++)
 {   
 if (j==1)
 fichierSortie << COLout(i,j);
 else
   {
   fichierSortie <<  " " << COLout(i,j);                           
   }
 }
 fichierSortie << endl;
 }

 return 0;
 
}
[/code]

Le problème c'est que j'ai un message d'erreur qui est le suivant et dont je ne comprend pas l'origine !
[code]
essai.cpp(45) : error C2660: 'simcor'*: la fonction ne prend pas 3 arguments
[/code]
L'origine du problème est mis en commentaires dans le fichier principal

Qu'en pensez-vous ?

vendredi 11 août 2006 à 11:28:29 | Re : Aide sur la construction d'une fonction

turnerom

Salut,

Regarde le prototype de ta fonction dans ton .hpp, ca doit pas être la bonne !

TuRn3r
vendredi 11 août 2006 à 11:31:19 | Re : Aide sur la construction d'une fonction

iamor

Merci du conseil,

En effet un oubli de ma part, je n'ai pas changé la définition de la fonction dans le fichier.h ce qui est fait maintenant!

 



Cette discussion est classée dans : int, include, for, matrice, epsilon


Répondre à ce message

Sujets en rapport avec ce message

vecteurs 3D [ par nonocpp ] #include #include #include   using namespace std;  int main(void){ int i,k,j; ofstream arno; vector*>*& compilation mai au lancement "erreur la memoire ne peu pas pas etre read" [ par touny23 ] je maitrise pas tro le C.mai comme j ai un projet a faire dessus pour la rentré , je sui obligé de m y mettre .j arrive a compiler sous dev-cpp mai lo classe matrice [ par cyrinelahsini ] salut,je programme avec c++ sous linux.j'utilise une class matrice avec une fonction membre qui doit me retourner une instance de cette class.mais j'a un programme qui tourne pas [ par youssefmahdia ] bonjour,voila, ce programme ne tourne pas,#include  #include  main() { int i,j; int s[5][5]; for(i=0;i {for(j=0;j s[i][j]=(j/(int)pow( matrice de caractere en c [ par flofloo ] slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){     char **mat = NULL;     int i;     mat = remplir aléatoirement une matrice binaire dynamique [ par amani20081984 ] bonjour, je veux bien remplir une matrice de structure dynamique d'une manière aléatoire par des valeurs 0 et 1 en utilisant la fonction rand(),voicii Remplir une matrice ? [ par MmDHost ] Bonjour,J'ai besoin de crée une matrice pour un projet sur un Modèle Numérique de Terrain cependant j'ai une érreur que je n'arrive pas à corriger, po Return tableau? [ par zut69 ] Bonjour,Je suis en train d'écrire un petit programme sur les matrices en C, mais vu que je veux faire quelque chose d'assez général, j'ai besoin que d surcharges des operators [ par leroiloup ] salut a tout j'ais un probleme d'implementer les deux operator (operator+, operator*) et comment l'etuliser dans main() #include #include using names


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales