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 :

segmentation violation error [MEX]


Sujet :

MATLAB

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Par défaut segmentation violation error
    Salut,

    Moi c est PrinceJack. J ai consulté quelques uns des messages sur ce forum au cours des semaines écoulées.
    J ai essayé de mon coté de suivre les recommandations et là j aimerais solliciter le coup de main d un expert en Matlab.
    En fait j ai ecris un programme Matlab dans le cadre de mon stage. Le programme a pour role de prendre des donnees en format.csv puis de les traiter et selon les procédures de calculs du programme, il trace des courbes, détermine certaines valeurs intéressantes puis engendre des documents souhaités.
    Là mon programme il marche bien et sans problème.
    Je reste tout de meme insatisfait car il me livre mes résultats non en 5 minutes ni 10 minutes mais après une (01) voire deux (02) heures selon la taille du document csv que je rentre à analyser.
    J ai essayé d écrire du code CMEX suite à une des recommandations de Dut faites dans le passé à un internaute sur ce forum.
    Je l ai fait juste pour deux fonctions différentes contenant tous les deux des boucles for qui prennent beaucoup de temps dans le traitement des analyses.
    Quand je compile mes codes CMEX, ils semblent fonctionner sans problèmes car ils ne produisent pas d erreurs mais quand je leur donne des valeurs ou que je l intègre dans mon code principal, il me présente l erreur SEGMENTATION VIOLATION.
    J envoie les codes matlab et ceux que j ai essayé d écrire en CMEX pour demander si mes codes CMEX sont corrects et comment je pourrais faire pour que ca fonctionne.
    Merci d avance pour votre coups d aide.

    Sincères salutations,

    PrinceJACK

    Pieces jointes:

    Fonctions MATLAB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function pulse = pulsation(Data)
    n=length(Data(:,1));
    for i=1:n-1
        if Data(i,2)<=2 & Data(i+1,2)>2
            pulse(i)=1;
        else
            pulse(i)=0;
        end    
    end
    pulse(n)=0;
    end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function frequency = frequence(pulse,Data)
    % Units in 1/s [Herz]
    % les fonctions addition et difference sont appelées
    % pour le calcul de la fréquence
    for k=1:length(Data(:,1))
        frequency(k)=addition(pulse,k)/difference(Data,k);
    end
    end

    Fonctions CMEX

    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
    #include "mex.h"
    #include "matrix.h"
    // ici la fonction pulsation
    void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
    int i, m;
    double data1, data2;
    double *data3;
    if (nrhs != nlhs)
    mexErrMsgTxt("The number of input and output arguments must be the same.");
    /*for (i = 0; i < nrhs; i++)
    /*{
    /* Find the dimensions of the data */
    m = mxGetM(prhs[0]);
    /*n = mxGetN(prhs[0]);
    /* Create an mxArray for the output data */
    data3 = mxCreateDoubleMatrix(m, 1, mxREAL);
    /* Put data in the output array */
    for (i = 0; i < m-1; i++)
     
    {
        /* Retrieve the input data */
        data1 = (double)*mxGetPr(prhs[i]);
        data2 = (double)*mxGetPr(prhs[i+1]);
        /* Create a pointer to the output data */
        if (data1 <=.45 & data2>.45){   
                    data3[i]=1.0;
            }else{
                    data3[i]=0.0;
            }
    }
    }
    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
    #include "mex.h"
    #include <math.h>
     
    // ici la sous-fonction d addition utilisee pour calcul 
    // de la frequence
    static double addition(double *pulse[], int value)
    {
        double summe; 
        int i, m, value_end;
     
        value_end=value+196;
        summe=0.0;
     
      /* Find the dimensions of the data */
        m = sizeof(pulse);
     
        for (i=value; i<=value_end; i++)
        {
            if (value_end<=m){
                summe=summe+((double)*pulse[i]);
                }
            else{
                summe=0.0;
                break;
                }
        }
        return summe;
    }
     
    // ici sous-fonction difference utilisée dans le calcul 
    // de la frequence
    static double difference(double *Temps[], int value)
    {
        double diff;
        int m, value_end;
     
        value_end=value+196;
        diff=1.0;
        m = sizeof(Temps);
     
        if (value_end<m){
            diff=(*Temps[value_end])-(*Temps[value]);
            }
        else{
            diff=1.0;
        }
        return diff;
    }
     
    // ici la fonction freuence
    void mexFunction(int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
    {
    int i, n;
    double data1, data2;
    double *data3;
     
    /* Find the dimensions of the data */
    n=(int)*mxGetPr(prhs[2]);
     
    /* Create an mxArray for the output data */
    plhs[i] = mxCreateDoubleMatrix(n, 1, mxREAL);
    /* Retrieve the input data */
    /* Create a pointer to the output data */
    data3 = mxGetPr(plhs[i]);
    /* Put data in the output array */
    for (i=0; i<n; i++){
            data1 = (addition(mxGetPr(prhs[0]),i));
            data2 = (difference(mxGetPr(prhs[1]),i));
            data3[i] = (data1/data2);
            }
    }
    NOTE: Au cas où vous avez des questions, n hésitez pas à me les poser et merci encore d avance de votre aide.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/07/2011, 11h42
  2. "Segmentation violation detected"
    Par jp_developpeur dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/05/2011, 14h53
  3. Réponses: 15
    Dernier message: 11/12/2010, 17h43
  4. [MEX] Segmentation violation occurred
    Par HAL-9000 dans le forum MATLAB
    Réponses: 4
    Dernier message: 08/03/2010, 10h10
  5. [MEX] Erreur Segmentation Violation
    Par rv29634 dans le forum MATLAB
    Réponses: 3
    Dernier message: 27/11/2007, 01h28

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