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 487
    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 487
    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 487
    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 487
    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 395
    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 395
    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 487
    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 487
    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 487
    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 487
    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