IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Impl�mentation en c++ de la fonction dsyev_


Sujet :

C++/CLI

  1. #1
    Membre �clair�
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    354
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 354
    Par d�faut Impl�mentation en c++ de la fonction dsyev_
    Bonjour,
    J'ai besoin d'utiliser la fonction suivante
    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
     
    extern "C" {
    int dsyev_(char *jobz, char *uplo, 
    	   int *n, double *a, int *lda, 
    	   double *w, double *work, int *lwork, 
    	   int *info);
    }
     
    void softassign::eigenvectorOfN(double *N, float* q){
     
      static float q_pre[4]; // previous result
     
      int dimN = 4;
      double w[4]; // eigenvalues
      double *work = new double; // workspace
      int info;
      int lwork = -1;
     
      dsyev_((char*)"V", (char*)"U",
    	 &dimN, N, &dimN,
    	 w, work, &lwork, &info);
      if(info != 0){
        fprintf(stderr, "info = %d\n", info);
        exit(1);
      }
      lwork = (int)work[0];
      delete work;
     
      work = new double [lwork];
     
      dsyev_((char*)"V", (char*)"U",
    	 &dimN, N, &dimN,
    	 w, work, &lwork, &info);
     
      delete [] work;
     
     
      if(info != 0){
        fprintf(stderr, "computing eigenvector FAIL! info = %d\n", info);
        //exit(1);
     
        // if fail, put back the previous result
        for(int i=0; i<4; i++){
          q[i] = q_pre[i];
        }
     
     
      }else{
     
        // last column of N is the eigenvector of the largest eigenvalue 
        // and N is stored column-major
        for(int i=0; i<4; i++){
          q[i] = N[4*3 + i];
          q_pre[i] = q[i];
        }
     
      }
     
     
    }
    Cette fonction m'a cr�e beaucoup de probl�mes � cause de l'utilisation de dsyev_ de la biblioth�que Lapack.
    Est ce qu'il y a quelqu'un qui peut me donner l'impl�mentation en c de cette fonction
    Merci beaucoup pour votre aide

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    1- C'est quoi le rapport avec C++/CLI ?
    2- Google est ton ami : http://www.netlib.org/clapack/old/double/dsyev.c
    3- votre code est extr�mement alambiqu� et je pense m�me faux d� � de multiple cast sauvages � la C, des new et des delete compl�tement inutiles, etc...

  3. #3
    Membre �clair�
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    354
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 354
    Par d�faut
    Merci bacelar pour votre r�ponse..

    Concernant le premier point : ce code cr�e un probl�me dans un projet c++/CLI. EN fait en ajoutant ce code , l'application ne s'ex�cute pas.
    Concernant le deuxi�me point: D'apr�s google j'ai trouv� que la fonction dsyev retourne eigenvalues et eigenvector mais d'apr�s ce que j'ai impl�ment� l'eigenvector est un vecteur avec nombre r�el et pas des nombres complexes alors que cette fonction retourne des valeurs complexes
    Concernant troisi�me point: J'ai pas compris qu'est ce que vous voulez dire exactement mais ce que je cherche c'est l'impl�mentation de dsyev.

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    >Concernant le premier point : ce code cr�e un probl�me dans un projet c++/CLI. EN fait en ajoutant ce code , l'application ne s'ex�cute pas.
    Oui, peut-�tre, mais je pense que si le projet serait en C++ standard vous auriez les m�mes probl�mes, car votre code utilisateur est une horreur en terme de complexit�, de fuite m�moire, de maintenabilit�.
    En C++ moderne, il n'y quasiment pas de cast, et jamais de cast � la C, quasiment pas de delete et encore moins de delete [].
    Franchement, plut�t que de jeter l'opprobre sur l'impl�mentation de dsyev_ dans une librairie extr�mement utilis�es donc extr�mement bien test�es, je v�rifierais mon code.
    Votre code ne devrait pas passer la moindre revue de code de vos paires.
    Il devrait �tre plus proche du code qui suit, qui est thread-safe, exception-safe, plus facile � maintenir et � d�buguer car utilisant les exceptions (la cr�ation du classe d'exception d�di�e serait un plus), initialise automatiquement les data donn�es � une librairie avec des valeurs par d�faut (les routines C "syst�mes" sont extr�mement susceptible sur l'initialisation de TOUTES les donn�es, m�me les champs non (encore) utilis�s).

    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
    const int DIM = 4;
    int MatrixOder=12;
    char V = 'V';
    char U = 'U';
     
    void softassign::eigenvectorOfN(double *N, float* q)
    {
    	std::array<double,DIM> w = {};
     
    	int info = 0;
    	double optimalSize;
    	int lwork = -1;
    	std::ostringstream msg;
     
    	dsyev_(&V, &U,&MatrixOder, N, &MatrixOder,&w[0], &optimalSize, &lwork, &info);
     
    	if(info != 0) { msg << "info =" << info << std::endl; throw (msg.str().c_str()); }
     
    	std::vector<double> work(optimalSize); // workspace
    	lwork = work.size();
     
    	dsyev_(&V, &U,&MatrixOder, N, &MatrixOder, &w[0], &work[0], &lwork, &info);
     
    	if(info != 0) { msg << "computing eigenvector FAIL! info =" << info << std::endl; throw (msg.str().c_str());}
    }

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Attention, � moins que j'aie encore manqu� un truc sur C++11, les additions de cha�nes litt�rales ne marcheront pas en C++ standard (et en C++/CLI, elles devraient �tre des cha�nes larges).

    De plus, si les deux premiers param�tres de dsyev_() sont cens�s �tre des cha�nes C, le passage de &V et &U se base sur des d�tails d'impl�mentation sur l'alignement des variables. Ah non j'ai compris, c'est une lib FORTRAN, donc tous les param�tres sont pass�s par r�f�rence.

    Edit: Franchement, la premi�re chose que je ferais pour cet appel, c'est faire un wrapper de dsyev() pour "d�-pointeuriser" les arguments non-tableaux d�clar�s en entr�e seule. Et sans doute constifier les tableaux en entr�e seule, au passage.
    PS: Le lien post� par bacelar est d�sormais 404. Version du cache Google
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    >Attention, � moins que j'aie encore manqu� un truc sur C++11
    C'est mon poil dans la main, que ta manqu� ;-).

  7. #7
    Membre �clair�
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    354
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 354
    Par d�faut
    J'ai fait un wrapper mais maintenant j'ai une erreur dans l'ex�cution. EN fait, l'erreur concerne un dll manquante et j'ai pas trouv� une solution pour cette erreur car jai mis libblas.lib et libblas.dll; liblapack.lib et liblapack.dll; liblapacke.lib et liblapacke.dll avec l'ex�cutable mais toujours j'ai re�u le m�me message d'erreur

  8. #8
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Vous m�langez lib de dll, dll, path, dllpath, ....

    Arr�tez de jouer � l'apprenti sorcier et documentez vous un peu.

    Les lib c'est que pour l'�dition de lien, elles n'ont � faire � cot� de l'ex�cutable.

    Quand vous utilisez une librairie, il faut au moins prendre la peine de lire sa documentation qui doit indiquer la mise en �uvre de celle-ci en cas d'utilisation en dll.

    Vous �tes dans le brouillard et vous appuyez sur tous les boutons, vous allez vous crasher comme une merd..

    Donc vous interpr�tez un message d'erreur sans nous le donner pr�cis�ment, on va pouvoir vous contredire si vous avez mal compris le message.

    Utilisez Dependency Walker (http://www.dependencywalker.com/) pour avoir la liste des dll li�es "statiquement" � l'ex�cutable, de mani�re directe ou indirecte.

    Il est de plus en plus commun que les r�gles de s�curit� et la configuration par d�faut de la cr�ation d'un programme interdissent l'utilisation de Dll mis dans le foutoir d'un r�pertoire d'un ex�cutable qui n'est m�me pas pass� par un module d'installation type MSI. Donc si vous avez bien toutes les dll dans ce foutoir, utilisez ProcessMonitor (http://technet.microsoft.com/fr-fr/s.../bb896645.aspx) pour voir dans quels r�pertoires le chargeur de l'OS va chercher les dll pour ce programme. On a souvent des surprises (politiques de s�curit�, anti-virus, manifestes de l'ex�cutable, des dll ...)

Discussions similaires

  1. R�ponses: 7
    Dernier message: 19/01/2011, 21h07
  2. Impl�menter la fonction Scanf
    Par CPI_en_mousse dans le forum C
    R�ponses: 2
    Dernier message: 06/04/2006, 18h58
  3. [MySQL] Impl�menter une fonction de recherche approximative
    Par Chromatic dans le forum PHP & Base de donn�es
    R�ponses: 4
    Dernier message: 28/02/2006, 11h54
  4. Le linker ignore les fonctions non impl�ment�es
    Par Rodrigue dans le forum C++Builder
    R�ponses: 5
    Dernier message: 02/03/2005, 13h31
  5. Impl�mentation des fonctions math�matiques
    Par mat.M dans le forum Math�matiques
    R�ponses: 9
    Dernier message: 17/06/2002, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo