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

MATLAB Discussion :

[vistaX32][matlab7.5] fonction matlab dans un projet C++


Sujet :

MATLAB

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut [vistaX32][matlab7.5] fonction matlab dans un projet C++
    Bonjour,

    j'essaie d'utiliser des fonctions matlab dans mon projet C++ (pour un stage).

    J'ai créer un .h et un .cpp pour ma fonction à l'aide de mcc.
    J'ai codé un main utilisant incluant le .h et utilisant la fonction.

    j'ai d'abord essayé de compilé le tout (peut-être un peu hasardeux, mais je suis qd même toujours en terrain très inconnu pour moi), en ajoutant au path le répertoire extern/include de matlab.
    Cela me donne des erreurs dus style: "redeclaration of long int int_32... "
    Problème de compatibilité?

    J'ai ensuite essayé de compiler le tout avec mbuild de matlab, mais en fait, là c'est un autre problème, matlab ne détecte pas d'autre compilateurs que lcc.
    J'ai essayé d'installé visual C++ express (2008 et 2005) aucun des deux n'est reconnu.

    Que faire?

    Merci beaucoup d'avance pour un coup de pouce!

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Tout d'abord MCC ne crée pas du "vrai" code C ou C++
    ( Le MATLAB Compiler convertit-il mon M-file en langage C ?

    et How can I use the MATLAB Compiler to convert my M-code into a...)

    Pour l'utilisation d'un compilateur style Visual C++ il y a déjà des sujets sur ce Forum.
    ex : Problème config compilation

    Fait une recherche avec Visual Studio.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    Bon, j'ai l'impression que j'ai réussi à utiliser visual studio 2005 express comme compiler...

    Voilà le main du code que j'essaie de compiler:
    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    // Include the library specific header file as generated by the
    // MATLAB Compiler
    #include "raytracing.h"
     
    int run_main(int argc, char **argv)
    {
        // Call application and library initialization.
        // Perform init before calling any API functions or
        // Compiler-generated libraries.
        if (!mclInitializeApplication(NULL,0))
        {
            std::cerr << "could not initialize the application properly" << std::endl;
        	return -1;
        }
        if( !raytracingInitialize() )
        {
            std::cerr << "could not initialize the library properly" << std::endl;
            return -1;
        }
        else
        {
            try
            {
                // Create input datas
                mwArray par_input;
                par_input = struct_func("delta_r", 0.1000,"opt_ang", 0,
                    "any_pl", 516,
                    "delta_z", 0.1000,
                    "delta_nz", 0.0100,
                    "z_raw_str", "0:300"
                    "z_raw", 0,//[1x301 double]
                    "c_raw_str", 0,//'1500+(0:300)*0.1'
                    "c_raw", 0,//[1x301 double]
                    "SSP_z",0, //[1x3001 double]
                    "SSP_c", 0,//[1x3001 double]
                    "theta_min", -10,
                    "theta_max", 10,
                    "angle_max", 10,
                    "angle_min", -10,
                    "N_angles", 20,
                    "theta_initial",0, //[1x18 double]
                    "c_botm", 1700,
                    "rho_bottom", 2000,
                    "alpha_bottom", 1,
                    "wind_speed", 2,
                    "sigma_bottom", 0.1000,
                    "z_source", 200,
                    "z_receiver", 200,
                    "R_b_str", "0:10000"
                    "R_b", 0,//[1x10001 double]
                    "Z_b_str", "300"
                    "Z_b", 0,//[1x10001 double]
                    "SED_r",0, //[1x100001 double]
                    "SED_z", 0,//[1x100001 double]
                    "r_source", 10,
                    "r_receiver", 10000,
                    "signal_length", 512,
                    "ctr_freq", 100,
                    "message_f", 50,
                    "delta_phone", 500,
                    "botm_stop", 0,
                    "intp_SSP", "linear",
                    "intp_Bottom", "linear",
                    "intp_angle", "exponential",
                    "dir_receiver", 0,
                    "if_opt_ang", 0,
                    "describe", "Software default parameters",
                    "z_max", 300,
                    "r_max", 10000,
                    "fs", 500,
                    "s_fs", 250,
                    "signal", 0,//[1x512 double]
                    "sigma_surface", 0.0204,
                    "c_red", 1530,
                    "c_source", 1520,
                    "phone", 0//[1x20 double]
                );
                mwArray new_thetas;//theta);
                mwArray new_delta_z;//z_step);
                //SetData(data, 9);
     
                // Create output array
                mwArray rays;
                rays = struct_func(
                        "delta_z", 0.1000,
                        "X", 0,//[1x12724 double]
                        "Z", 0,//[-200 2000 -4999 7999 -10998 12724]
                        "DIR_X", 0,//[1x9991 double]
                        "DIR_Z", 0//[1x9991 double]
                        );
                mwArray count;
                count = struct_func(
                            "TURNING_ANGLE", 0,
                            "BOTTOM",0,//[0 1 1 2]
                            "SURFACE", 0,//[1 1 2 2]
                            "TURNING_ABOVE",0, //[0 0 0 0]
                            "TURNING_BELOW",0 //[0 0 0 0]
                            );
                mwArray eig;
                eig = struct_func(
                        "TIME", 0,//[1.6221 3.1514 4.7735 6.3028],
                        "RANGE", 0,//[2.4271e+003 4.7492e+003 7.1663e+003 9.4884e+003],
                        "THETA", -0.1239,
                        "ANGLE",0, //[0.1239 -0.1240 0.1239 -0.1240],
                        "AL",0, //[0.9997 0.9993 0.9990 0.9987],
                        "REFCOEF_BOTM", 0,//[1 -0.9004 - 0.4171i -0.9004 - 0.4171i 0.6368 + 0.7511i],
                        "REFCOEF_SURF",0, //[1.0000 1.0000 1.0000 1.0000],
                        "Doppler", 0,//[0.0032 0.0032 0.0065 0.0065],
                        "DIREIG",0 //tryjrty
                        );
     
                mwArray OK(0);
     
                // Call the library function
                ray_tracing(4, rays,count,eig,OK, par_input, new_thetas,new_delta_z);
     
            }
            catch (const mwException& e)
            {
              std::cerr << e.what() << std::endl;
              return -2;
            }
            catch (...)
            {
              std::cerr << "Unexpected error thrown" << std::endl;
              return -3;
            }
            // Call the application and library termination routine
            raytracingTerminate();
        }
    /* You should call mclTerminate application at the end of
     * your application.
     */
        mclTerminateApplication();
        return 0;
    }
     
    int main()
    {
        mclmcrInitialize();
        return mclRunMain((mclMainFcnType)run_main,0,NULL);
    }
    Evidemment il est grande partie pas de moi, j'ai juste essayé de l'adapter à ma fonction qui s'appelle raytracing.

    Je tape mbuild main.cpp dans le prompteur matlab,
    j'obtiens comme seul erreur:

    >> mbuild main.cpp
    main.cpp
    main.cpp(26) : error C3861: 'struct_func'ÿ: identificateur introuvable
    main.cpp(84) : error C3861: 'struct_func'ÿ: identificateur introuvable
    main.cpp(92) : error C3861: 'struct_func'ÿ: identificateur introuvable
    main.cpp(100) : error C3861: 'struct_func'ÿ: identificateur introuvable

    C:\PROGRA~1\MATLAB\BIN\MEX.PL: Error: Compile of 'main.cpp' failed.

    ??? Error using ==> mbuild at 183
    Unable to complete successfully
    Est-ce que c'est le moment de se pencher sur la matlab math library, ou ce qui l'a remplacée? ...

    Et au fait, pourquoi il me parle en français? C'est pas que ça me gêne, mais beaucoup de caractère ne passe pas (accents..) et c'est un peu sale.

    Merci

  4. #4
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par norskbzh Voir le message
    Et au fait, pourquoi il me parle en français?
    S'il parle en français c'est que ce n'est pas MATLAB qui parle (il ne connait que le ricain et le japonais... pour ça qu'il ne connait pas les accents).
    C'est donc que le message vient du compilateur.

    Donc je n'y connais rien, mais bon au vu du message d'erreur la question à te poser : c'est quoi struct_func ?

    Tu dis que ce code ce n'est pas toi qui l'a fais, j'espère que ce n'est pas celui généré par le MATLAB Compiler ?

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    C'est un code que j'ai pris sur le site de mathworks : http://www.mathworks.com/access/help...pp+lib&spell=1

    J'ai ajouté l'objet struct_func, il n'y était pas dans le code de départ. C'est un objet appartenant à la matlab C++ math library...
    Donc je pense que c'est cette library qui pose problème. Je ne sais pas comment l'obtenir, j'ai lu sur un post qu'elle n'existait pas pour la release 14 de matlab, mais moi c'est release 13 il me semble: matlab R2007b ie 7.5

    Merci

    [edit]
    Je me doutais bien que cela venait du compilateur, j'ai du télécharger la version fr de visual studio. !! :-)

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Pour les correspondances des versions :
    Quelles sont les différentes versions de MATLAB ?

    En général c'est facile, avant qu'il ne sorte les Rannée<a/b> la release c'etait 2 le 1er numéro de la version donc la R14 c'est à partir de la 7.0.

    Donc a priori, elle n'existe pas dans ta version.
    Après je ne sais pas ce que c'est (une fonction pour créer une structure en C++ ?), et c'est difficile à trouver car une recherche sur le site de The Mathworks ne renvoie que sur des articles sur struct...

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    OK pour les release, je n'ai donc aucune chance de trouver par là.

    Le struct_func joue le même rôle que le struct matlab mais en C++.

    En fait, la fonction raytracing matlab prend en argument un struct constitué d'une vingtaine de champs... Des champs de types différents, donc le struct_func me paraissait cool, mais là je ne sais pas comment faire..

    Je veux juste donner les bons arguments à la fonction? mais cela ne me parait pas évident.

    merci

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut passer des arguments à une fonction matlab wrappée dans un code C++
    Rebonjour!

    Si quelqu'un à une idée, il s'agit de remplacer l'objet struct_func présent dans le main que j'ai mis dans un de mes messages précédents, afin de passer les bons arguments à la fonction raytracing.

    Dans le code matlab originel, il s'agissait d'un struct contenant une vingtaine de membres.

    Merci

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Par défaut
    Je passe le message en résolu, même si mon programme n'est pas vraiment réglé, mais ma question initiale est, elle, résolue.

    Merci

    "Je reviendrai!!"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] MATLAB dans un projet Delphi
    Par RahmaniS dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/03/2013, 13h09
  2. Appeler une fonction matlab dans un programme C++
    Par samiaarch dans le forum C++
    Réponses: 1
    Dernier message: 15/10/2012, 22h22
  3. [Débutant] Appeler une fonction MATLAB dans du C
    Par titone971 dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/12/2010, 08h59
  4. Fonction dsolve dans MATLAB 7.3
    Par mutwit dans le forum MATLAB
    Réponses: 3
    Dernier message: 23/04/2007, 11h35
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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