ça va être dur à battre quand même
mais bon, je ne m'avoue pas vaincu
ça va être dur à battre quand même
mais bon, je ne m'avoue pas vaincu
J'ai du mal compiler ta fonction mais je n'arrive pas à la faire fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 >> clear all >> V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9]; >> DR2 = Dutmex(V); DR2 = DR2(:,any(DR2)); >> DR2 DR2 = 1 9 1 0
Peux-tu essayer ton script avec ma fonction ?
J'ai compilé avec LCC/matlab 6.1 R12
Bizarre...
me retourne bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9]; DR2 = Dutmex(V); DR2 = DR2(:,any(DR2))
Y-a-t-il des warning à la compilation ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DR2 = 1 0 1 0 1 2 3 0 4 1 5 6 7 8 2 9 1 1 2 1 1 2 1 5 1 2 2 2 1 1 2 1
Vu ta version de MATLAB, tu peux essayer aussi avec le compilateur gratuit Borland C++ Compiler 5.5 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part mex -v Dutmex.c
Arf... il me faut le fichier C car je suis sous Linux et même si j'étais sous Windows, les fichiers MEX compilés ont changé depuis ta version (dll => mexw32)
OK, voilà, j'ai honteusement pompé une partie de ton code
Code C : 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 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { double *V, *R; short k; int m ; int n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL); R = mxGetPr(plhs[0]); R[0] = V[0]; n=1; u=0; while (n<m) { k = 1; while ((V[n]==V[n-1]) && (n<m)) { ++k; ++n; } R[2*u+1] = (double)k; R[2*(u+1)] = V[n]; ++n; ++u; } R[2*u+1] = (double)k; };
Un petit soucis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Vi = [1 0 1 1 0 1 1 9]; MR2 = langelotmex(Vi)alors que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MR2 = 1 0 1 0 1 9 0 0 1 1 2 1 2 2 0 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Vi = [1 0 1 1 0 1 1 9]; DR2 = Dutmex(Vi)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DR2 = 1 0 1 0 1 9 0 0 1 1 2 1 2 1 0 0
ah oui ^^
Code C : 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 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { double *V, *R; short k; int m ; int n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL); R = mxGetPr(plhs[0]); R[0] = V[0]; n=1; u=0; k = 1; while (n<m) { while ((V[n]==V[n-1]) && (n<m)) { ++k; ++n; } R[2*u+1] = (double)k; R[2*(u+1)] = V[n]; ++n; ++u; k = 1; } R[2*u+1] = (double)k; };
Je compile avec Visual C++ et ta fonction marche correctement maintenant.
A ce niveau, les différences sont infimes... il est même parfois difficile de dire lequel est vraiment le plus rapide
A moins de tester sur une machine moins performante que la mienne
@ mr_langelot : encore un petit problème avec ton code
Code C : 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 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { double *V, *R; short k; int m ; int n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); plhs[0] = mxCreateDoubleMatrix(2,m, mxREAL); R = mxGetPr(plhs[0]); R[0] = V[0]; n=1; u=0; k = 1; while (n<m) { while ((V[n]==V[n-1]) && (n<m)) { ++k; ++n; } R[2*u+1] = (double)k; R[2*(u+1)] = V[n]; ++n; ++u; k = 1; } R[2*u+1] = (double)k; };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Vi = [1 0 1 1 0 1 2 9 9 9]; MR2 = langelotmex(Vi); MR2 = MR2(:,any(MR2))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 MR2 = 1 0 1 0 1 2 9 0 1 1 2 1 1 1 3 1
Et comme on arrête pas le progrès
Je vous présente Dutmex2.c
Code C : 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 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *V, *R; int k; mwSize m ; mwIndex n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); k = 1; for (n=1;n<m;n++) if (V[n]!=V[n-1]) k = k++; plhs[0] = mxCreateDoubleMatrix(2,k, mxREAL); R = mxGetPr(plhs[0]); R[0] = V[0]; k = 1; u = 0; for (n=1;n<m;n++) { if (V[n]==V[n-1]) k = k++; else { R[2*u+1] = (double)k; R[2*(u+1)] = V[n]; u = u++; k = 1; } } R[2*u+1] = (double)k; }
Plus besoin de supprimer certaines colonnes de R à la sortie du MEX
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 V = [1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9 9 9]; R = Dutmex2(V)Les différents temps de comparaison entre les codes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 R = 1 0 1 0 1 2 3 0 4 1 5 6 7 8 2 9 1 1 2 1 1 2 1 5 1 2 2 2 1 1 2 3
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 0.1090 0.0627 0.0588 0.0451 0.1470 0.0943 0.0864 0.0555 0.1164 0.0805 0.0771 0.0442 0.1410 0.1031 0.1001 0.0524 0.1667 0.1223 0.1206 0.0608 0.1870 0.1443 0.1400 0.0695 0.2122 0.1626 0.1625 0.0768 0.2379 0.1842 0.1822 0.0867 0.2618 0.2091 0.2027 0.0869 0.2837 0.2267 0.2256 0.1040 0.3083 0.2487 0.2513 0.1089 0.3335 0.2694 0.2657 0.1122 0.3574 0.2926 0.2862 0.1251 0.3793 0.3114 0.3117 0.1382 0.4020 0.3319 0.3313 0.1464
Mais où s'arrêteront-ils ?
Dutmex3.c :
Code C : 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 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *V, *R; int k; mwSize m ; mwIndex n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); k = 1; for (n=1;n<m;n++) if (V[n]!=V[n-1]) k = k++; plhs[0] = mxCreateDoubleMatrix(2,k, mxREAL); R = mxGetPr(plhs[0]); R[0] = V[0]; k = 0; u = 0; for (n=1;n<m;n++) { k = k++; if (V[n]!=V[n-1]) { R[2*u+1] = (double)k; R[2*(u+1)] = V[n]; u = u++; k = 0; } } R[2*u+1] = (double)k+1; }
La condition est allégée dans la seconde boucle FOR
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 V = [1 1 1 0 1 1 0 1 2 2 3 0 0 0 0 0 4 1 1 5 5 6 6 7 8 2 2 9 9 9]; R = Dutmex3(V)=> c'est encore plus rapide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 R = 1 0 1 0 1 2 3 0 4 1 5 6 7 8 2 9 3 1 2 1 1 2 1 5 1 2 2 2 1 1 2 3
Bon, j'ai essayé d'optimiser tout ce que j'ai pu mais je crois que là...
Code C : 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 #include "mex.h" #include "string.h" void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *V, *res; register unsigned int k; mwSize m ; mwIndex n, u; V = mxGetPr(prhs[0]); m = mxGetNumberOfElements(prhs[0]); res = malloc(2*m*sizeof(double)); /*up = 2 * (m-u) - 1;*/ u = 2 * m; for (n=m;n--;) { k = 1; while ((V[n]==V[n-1]) && n) { ++k; --n; } res[--u] = (double)k; res[--u] = V[n]; } plhs[0] = mxCreateDoubleMatrix(2,(2*m-u)/2, mxREAL); memcpy(mxGetPr(plhs[0]), &res[u], ((2*m-u))*sizeof(double)); free(res); }
J'ai dû ajouter la ligne suivante au début de ton code :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part #include "string.h"
Pour les résultats... je crois qu'on a atteint nos limites...
Bizarre pour le header à ajouter mais OK,
et effectivement, je crois qu'on a épuisé le sujet
c'est quand même surprenant les différences entre les compilateurs C.
Avec LCC de matlab, je ne pouvais pas utiliserparce que ça faisait n'importe quoi!
Code : Sélectionner tout - Visualiser dans une fenêtre à part i++
Pour l'utilité, ça fera sûrement le bonheur d'étudiant de passage qui ne savent pas comment faire leur TP d'informatique ^^
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager