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++Builder Discussion :

Cr�er un Fichier . mat (Matlab) en C++ Builder


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par d�faut Cr�er un Fichier . mat (Matlab) en C++ Builder
    Bonjour au forum C++

    Je d�veloppe actuellement un logiciel permettant de convertir un fichier produit par un mat�riel d'acquisition de signal en fichier .mat pour pouvoir faire du traitement dessus sous Matlab.

    Ce n'est pas la partie r�cup�ration des donn�es dans le fichier qui me pose probl�me car j'ai la structure binaire de ce fichier (fournit par l'�diteur) et la r�cup�ration se passe bien.

    J'avais commenc� � d�velopper directement sous matlab, mais il s'av�re que la r�cup�ration est tr�s longue, j'ai donc opt� pour un programme compil� en C++ qui doit normalement aller plus vite.

    Or, j'essaye depuis C++ Builder de cr�er un fichier .mat pour mettre dedans ce que je r�cup�re.

    J'ai vu que Matlab fournissait un API pour les entr�es sorties en Matlab, j'essaye donc de m'en servir mais cela ne fonctionne pas.

    J'ai donc reconstruit les .lib fournit � la base pour Visual Studio pour qu'elles soient compatible avec C++ builder (implib)

    J'ai ajout� les chemins d'inclusion des .h et des .lib dans mon projet.

    Pour l'instant mon code est simple, c'est juste ouvrir le fichier .mat et le fermer

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "mat.h"
    .........
    // Ouverture du fichier MAT
    MATFile *pmat = matOpen(AnsiString(CheminFichierMat).c_str(), "w");
     
    // On ferme le fichier
    matClose(pmat);
    Lorsque je compile, j'ai ces erreurs :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    [ilink32 Erreur] Error: '_matOpen' externe non résolu, référencé depuis C:\.......Projet.OBJ
    [ilink32 Erreur] Error: '_matClose' externe non résolu, référencé depuis C:\.......Projet.OBJ
    [ilink32 Erreur] Error: Impossible d'effectuer le lien
    Sachant que je me base sur le fichier exemple de matlab suivant :

    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
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    /*
     * matcreat.cpp - MAT-file creation program
     *
     * See the MATLAB External Interfaces/API Guide for compiling information.
     *
     * Calling syntax:
     *
     *   matcreat
     *
     * Create a MAT-file which can be loaded into MATLAB.
     *
     * This program demonstrates the use of the following functions:
     *
     *  matClose
     *  matGetVariable
     *  matOpen
     *  matPutVariable
     *  matPutVariableAsGlobal
     *
     * Copyright 1984-2007 The MathWorks, Inc.
     */
    #include <stdio.h>
    #include <string.h> /* For strcmp() */
    #include <stdlib.h> /* For EXIT_FAILURE, EXIT_SUCCESS */
    #include <vector> /* For STL */
    #include "mat.h"
     
    #define BUFSIZE 256
     
    int main() {
      MATFile *pmat;
      mxArray *pa1, *pa2, *pa3;
      std::vector<int> myInts;
      myInts.push_back(1);
      myInts.push_back(2);
      printf("Accessing a STL vector: %d\n", myInts[1]);
     
      double data[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 };
      const char *file = "mattest.mat";
      char str[BUFSIZE];
      int status; 
     
      printf("Creating file %s...\n\n", file);
      pmat = matOpen(file, "w");
      if (pmat == NULL) {
        printf("Error creating file %s\n", file);
        printf("(Do you have write permission in this directory?)\n");
        return(EXIT_FAILURE);
      }
     
      pa1 = mxCreateDoubleMatrix(3,3,mxREAL);
      if (pa1 == NULL) {
          printf("%s : Out of memory on line %d\n", __FILE__, __LINE__); 
          printf("Unable to create mxArray.\n");
          return(EXIT_FAILURE);
      }
     
      pa2 = mxCreateDoubleMatrix(3,3,mxREAL);
      if (pa2 == NULL) {
          printf("%s : Out of memory on line %d\n", __FILE__, __LINE__);
          printf("Unable to create mxArray.\n");
          return(EXIT_FAILURE);
      }
      memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));
     
      pa3 = mxCreateString("MATLAB: the language of technical computing");
      if (pa3 == NULL) {
          printf("%s :  Out of memory on line %d\n", __FILE__, __LINE__);
          printf("Unable to create string mxArray.\n");
          return(EXIT_FAILURE);
      }
     
      status = matPutVariable(pmat, "LocalDouble", pa1);
      if (status != 0) {
          printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
          return(EXIT_FAILURE);
      }  
     
      status = matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);
      if (status != 0) {
          printf("Error using matPutVariableAsGlobal\n");
          return(EXIT_FAILURE);
      } 
     
      status = matPutVariable(pmat, "LocalString", pa3);
      if (status != 0) {
          printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
          return(EXIT_FAILURE);
      } 
     
      /*
       * Ooops! we need to copy data before writing the array.  (Well,
       * ok, this was really intentional.) This demonstrates that
       * matPutVariable will overwrite an existing array in a MAT-file.
       */
      memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));
      status = matPutVariable(pmat, "LocalDouble", pa1);
      if (status != 0) {
          printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
          return(EXIT_FAILURE);
      } 
     
      /* clean up */
      mxDestroyArray(pa1);
      mxDestroyArray(pa2);
      mxDestroyArray(pa3);
     
      if (matClose(pmat) != 0) {
        printf("Error closing file %s\n",file);
        return(EXIT_FAILURE);
      }
     
      /*
       * Re-open file and verify its contents with matGetVariable
       */
      pmat = matOpen(file, "r");
      if (pmat == NULL) {
        printf("Error reopening file %s\n", file);
        return(EXIT_FAILURE);
      }
     
      /*
       * Read in each array we just wrote
       */
      pa1 = matGetVariable(pmat, "LocalDouble");
      if (pa1 == NULL) {
        printf("Error reading existing matrix LocalDouble\n");
        return(EXIT_FAILURE);
      }
      if (mxGetNumberOfDimensions(pa1) != 2) {
        printf("Error saving matrix: result does not have two dimensions\n");
        return(EXIT_FAILURE);
      }
     
      pa2 = matGetVariable(pmat, "GlobalDouble");
      if (pa2 == NULL) {
        printf("Error reading existing matrix GlobalDouble\n");
        return(EXIT_FAILURE);
      }
      if (!(mxIsFromGlobalWS(pa2))) {
        printf("Error saving global matrix: result is not global\n");
        return(EXIT_FAILURE);
      }
     
      pa3 = matGetVariable(pmat, "LocalString");
      if (pa3 == NULL) {
        printf("Error reading existing matrix LocalString\n");
        return(EXIT_FAILURE);
      }
     
      status = mxGetString(pa3, str, sizeof(str));
      if(status != 0) {
          printf("Not enough space. String is truncated.");
          return(EXIT_FAILURE);
      }
      if (strcmp(str, "MATLAB: the language of technical computing")) {
        printf("Error saving string: result has incorrect contents\n");
        return(EXIT_FAILURE);
      }
     
      /* clean up before exit */
      mxDestroyArray(pa1);
      mxDestroyArray(pa2);
      mxDestroyArray(pa3);
     
      if (matClose(pmat) != 0) {
        printf("Error closing file %s\n",file);
        return(EXIT_FAILURE);
      }
      printf("Done\n");
      return(EXIT_SUCCESS);
    }
    J'utilise C++ Builder XE10 Seatle et Matlab 2016a

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    salut
    tu a simplement oubli� de d�clarer dans ton ton <.h> la d�claration de ces 2 fonctions
    du genre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    extern "C" __declspec(dllimport) __stdcall HANDLE matOpen(char*,int);
    extern "C" __declspec(dllimport) __stdcall void matClose(HANDLE);

    cdlt
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  3. #3
    R�dacteur/Mod�rateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance m�catronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Freelance m�catronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par d�faut
    Es-tu oblig� de g�n�rer des fichiers .mat ?
    MATLAB peut lire n'importe quel type de fichier (texte ou binaire)

    Sinon, tu peux aussi regarder du cot� de la biblioth�que matio �crite en C : MAT File I/O Library

  4. #4
    Membre �clair� Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par d�faut
    Merci pour vos r�ponses.

    Je m'�tais rabattu sur �crire moi m�me les fonctions d'�critures car j'ai trouver le format binaire d'un fichier MAT.
    Je vais regarder la librairie que tu me conseilles Jerome Briot

  5. #5
    Membre �clair� Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par d�faut
    Je reviens vers vous apr�s une longue pause pour m'occuper d'un autre programme.

    J'essaye donc gr�ce � la documentation Matlab qui fournit le format des fichiers mat d'en recr�er un.
    J'arrive bien � r�cup�rer et donc � recr�er l�ent�te mais lorsqu'il s'agit de r�cup�rer ou d'�crire des variables, cela se complique.

    A un moment, matlab compresse les donn�es � l'int�rieur du fichier mat pour un gain de place.
    Ils conseillent d'utiliser la libraire zlib pour la d�compression.

    Je recherche d�sesp�r�ment un exemple d'utilisation des fonctions ZCompress et ZDecompresse en C++ mais je n'en trouve pas.

    Est-ce que quelqu'un aurait cela dans ses cartons s'il vous plait ?

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    Salut
    Jette un coup d'oeil ici http://zlib.net/zlib_how.html
    cdlt
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

Discussions similaires

  1. Lire un fichier .mat sans MATLAB
    Par pedrosanchau dans le forum Scilab
    R�ponses: 5
    Dernier message: 15/04/2011, 09h45
  2. R�ponses: 6
    Dernier message: 26/10/2010, 08h54
  3. R�ponses: 15
    Dernier message: 11/07/2008, 15h21
  4. R�ponses: 3
    Dernier message: 06/06/2007, 07h46

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