2 pièce(s) jointe(s)
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:
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:
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:
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:
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.
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:
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:
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 |
--------------------------------------------------------------------------
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 :king:
:merci: encore infiniment à toi!
PrinceJACK