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

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    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

  2. #2
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Ne connaissant rien en C je ne peux malheureusement pas t'aider sur ce point-là.
    Par contre avant de faire des choses compliquées (enfin tout du moins pour moi) tu pourrais peut-être essayer d'optimiser ton code MATLAB.

    Par exemple ta 1ère fonction peut s'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function pulse = pulsation(Data)
    n=size(Data,1);%pas forcement plus rapide mais plus propre
    %Initialisation de pulse :
    pulse = zeros(1,n);
    %Il n'y a plus qu'a trouver les indices ou on va mettre les 1
    idx = Data(1:n-1,2)<=2 & Data(2:n,2)>2;
    pulse(idx)=1;
    Il serait intéressant que tu nous donne un ordre d'idée de la taille de Data, et aussi les fonctions addition et difference pour voir s'il y a d'autres voies d'optimisation.

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Envoi des fonctions MATLAB addition et difference
    Merci Caro-Line pour l optimisation d une de mes fonctions MATLAB.
    Je t envoie les fonctions addition et difference telles que je les ai écrites.


    Au sujet de Data, c est une donnee de format.CSV que le programme lit. Cette donnee contient 4 colonnes. la première colonne correspond au temps, la deuxième à la lecture de voltage, la troisième à la pression enregistrée et la dernière aux valeurs de fréquences enregistrées.
    Chaque colonne peut contenir parfois au-delà de 500000 valeurs. J espère avoir donné une idée de grandeur de Data.
    Merci encore pour tes conseils.

    PrinceJACK

    Pièces jointes:

    Fonctions MATLAB
    --------------------------------------------------------------------------
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function summe = addition(pulse,value)
    summe=0;
    value_end=value+196;
    if value_end<=length(pulse)
        summe=sum(pulse(value:value_end));
    else
        summe=0;
    end
    end
    --------------------------------------------------------------------------
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function diff = difference(Data,value)
    value_end=value+196;
        if value_end<length(Data(:,1))
            diff=Data(value_end)-Data(value);
        else
            diff=1;
        end
    end
    --------------------------------------------------------------------------

  4. #4
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Avant de chercher à faire quoi que ce soit, as-tu regardé si les modifications que j'ai faites ont apporté un gain de temps significatif ?
    (à tester peut-être sur des données plus petites dans un 1er temps)

    Et as-tu essayé de comprendre ce que j'avais fait pour essayer d'optimiser ton code par toi-même ?

    Tu peux aussi essayer d'utiliser le Profiler pour voir quelles lignes de code sont les plus gourmandes en temps.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui j ai bien compris et aussi testé le code que tu as optimisé et il marche aussi bien que celui j avais écrit.
    Je trouve le gain de temps par rapport à celui que j avais écris nettement considérable.
    À ce sujet, je tiens une fois de plus à t en remercier très sincèrement pour l optimisation de ma fonction pulsation.
    Si j arrive à optimiser la fonction frequence telle que la fonction pulsation a été optimisée, je pense que je pourrais sans doute bien me passer des fonctions CMEX (déjà compliquées à écrire quoiqu ils sont efficaces considérant ce qu on en dit sur eux).
    Merci encore pour tout et notamment pour m avoir appris une nouvelle facon d optimisation des codes de MATLAB.

    PrinceJACK

  6. #6
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    En fait ton code est vraiment bizarrement fait.
    Personnellement je supprimerais les fonctions addition et difference.
    Tu les appelle length(Data(:,1)) fois alors que finalement cela se résume à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %Pour addition :
    %Pour value+196<=length(pulse) summe=sum(pulse(value:value_end))
    %Sinon summe=0
     
    %Pour difference :
    %Pour value+196<=length(Data(:,1)) diff=Data(value_end)-Data(value)
    %Sinon diff=1
    C'est plus un problème de conception dans ta façon de voir les choses.

    Puisque finalement dès que k+196 sera supérieur à length(pulse) (qui est identique à length(Data(:,1)) addition sera toujours égal à 0, donc frequency aussi...

    Donc finalement on aurait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    n=size(Data,1);
    frequency=zeros(1,n)
    for k=1:n-196
        frequency(k)=sum(pulse(k:k+196))/(Data(k+196)-Data(k))
    end
    Enfin il me semble...

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut CARO-LINE tu es une GENIE!
    Merci infiniment Caro-Line pour tous tes conseils et apports de solution.
    Merci pour tout. À force de voir et revoir le code de la meme facon je ne pouvais guère voir la lourdeur du code qui augmentait son temps d exécution.
    Merci d avoir consacré de ton temps à lire mon code, le comprendre et m aider à l optimiser. Finalement j ai pas eu besoin de CMEX
    Je voudrais te prier de croire en ma sincère gratitude.
    Je pense que mon problème est bien resolu
    MERCI INFINIMENT A TOI. Tu es
    encore infiniment à toi!

    PrinceJACK

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

Discussions similaires

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

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