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; } } }NOTE: Au cas où vous avez des questions, n hésitez pas à me les poser et merci encore d avance de votre aide.
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); } }
Partager