Bonjour à tous !
Pour rappel je suis débutant en MatLab (depuis 1 semaine)
J'ai donc concu un script qui va chercher des images, les convertit en matrice puis appelle une fonction.
Celle-ci réalise une opération de fitting sur les pixels sélectionnés.
Ca marche à merveille.. SAUF QUE ca me prend presque une heure pour une série de 48 images de 128x128 pixels..... (3200 secondes...)
Alors j'imagine que mon code est hautement optimisable et que je peux gagner des minutes mais je ne vois pas trop ou...
Donc pour être pragmatique :
- est ce que quelqu'un voit une/des ligne(s) que je peux raccourcir d'une façon ou d'une autre ?
- est il judicieux d'aller chercher des fonctions de multi-threading ?
- ai-je un intérêt à "compiler" le prog ou autre ?
MERCI A TOUS !!!
Mon script :
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 % % Algorithme d'extraction compartimentale par fitting % % Vide toute la mémoire pour plus de clareté clear all; close all; clc ; % Initialise le timer tic; %% Place les images en mémoire diff01 = dicomread('diff01.dcm'); diff02 = dicomread('diff02.dcm'); diff03 = dicomread('diff03.dcm'); diff04 = dicomread('diff04.dcm'); diff05 = dicomread('diff05.dcm'); diff06 = dicomread('diff06.dcm'); diff07 = dicomread('diff07.dcm'); diff08 = dicomread('diff08.dcm'); diff09 = dicomread('diff09.dcm'); diff10 = dicomread('diff10.dcm'); diff11 = dicomread('diff11.dcm'); diff12 = dicomread('diff12.dcm'); diff13 = dicomread('diff13.dcm'); diff14 = dicomread('diff14.dcm'); diff15 = dicomread('diff15.dcm'); diff16 = dicomread('diff16.dcm'); diff17 = dicomread('diff17.dcm'); diff18 = dicomread('diff18.dcm'); diff19 = dicomread('diff19.dcm'); diff20 = dicomread('diff20.dcm'); diff21 = dicomread('diff21.dcm'); diff22 = dicomread('diff22.dcm'); diff23 = dicomread('diff23.dcm'); diff24 = dicomread('diff24.dcm'); diff25 = dicomread('diff25.dcm'); diff26 = dicomread('diff26.dcm'); diff27 = dicomread('diff27.dcm'); diff28 = dicomread('diff28.dcm'); diff29 = dicomread('diff29.dcm'); diff30 = dicomread('diff30.dcm'); diff31 = dicomread('diff31.dcm'); diff32 = dicomread('diff32.dcm'); diff33 = dicomread('diff33.dcm'); diff34 = dicomread('diff34.dcm'); diff35 = dicomread('diff35.dcm'); diff36 = dicomread('diff36.dcm'); diff37 = dicomread('diff37.dcm'); diff38 = dicomread('diff38.dcm'); diff39 = dicomread('diff39.dcm'); diff40 = dicomread('diff40.dcm'); diff41 = dicomread('diff41.dcm'); diff42 = dicomread('diff42.dcm'); diff43 = dicomread('diff43.dcm'); diff44 = dicomread('diff44.dcm'); diff45 = dicomread('diff45.dcm'); diff46 = dicomread('diff46.dcm'); diff47 = dicomread('diff47.dcm'); diff48 = dicomread('diff48.dcm'); % Prépare les 6 images paramétriques imageA1(128,128) = 0; imageA2(128,128) = 0; imageA3(128,128) = 0; imageB1(128,128) = 0; imageB2(128,128) = 0; imageB3(128,128) = 0; % Déclare les valeurs de b XVAL = 0 : 100: 4700 ; XVAL = XVAL(:); % Compteur i=0;x0=24;xinc=2;xmax=104;y0=10;yinc=2;ymax=119; ndata=((xmax-x0)/xinc)*((ymax-y0)/yinc)/100; % Pour Chaque pixel for x= [x0:xinc:xmax] %;for x=[27:103]; for y= [y0:yinc:ymax] %for y=[12:120] i = i + 1; % Crée un tableau contenant les différentes valeur du signal en (x,y) experimentalValue = [diff01(x,y) diff02(x,y) diff03(x,y) diff04(x,y)... diff05(x,y) diff06(x,y) diff07(x,y) diff08(x,y) diff09(x,y)... diff10(x,y) diff11(x,y) diff12(x,y) diff13(x,y) diff14(x,y)... diff15(x,y) diff16(x,y) diff17(x,y) diff18(x,y) diff19(x,y)... diff20(x,y) diff21(x,y) diff22(x,y) diff23(x,y) diff24(x,y)... diff25(x,y) diff26(x,y) diff27(x,y) diff28(x,y) diff29(x,y)... diff30(x,y) diff31(x,y) diff32(x,y) diff33(x,y) diff34(x,y)... diff35(x,y) diff36(x,y) diff37(x,y) diff38(x,y) diff39(x,y)... diff40(x,y) diff41(x,y) diff42(x,y) diff43(x,y) diff44(x,y)... diff45(x,y) diff46(x,y) diff47(x,y) diff48(x,y) ]; % Convertit ce tableau en doulbe YVAL = double(experimentalValue) ; % Fit les données contenues dans le tableau experimentalValue paramValue = createFit(XVAL,YVAL); % Insère les valeurs des paramètres retournés dans les matrices image imageA1(x,y) = paramValue(1); imageA2(x,y) = paramValue(2); imageA3(x,y) = paramValue(3); imageB1(x,y) = paramValue(4); imageB2(x,y) = paramValue(5); imageB3(x,y) = paramValue(6); clc; i/ndata end end imageA1 = uint16(imageA1); imageA2 = uint16(imageA2); imageA3 = uint16(imageA3); % Créé 6 fichiers DICOM paramétriques dicomwrite(imageA1, '#imageA1.dcm'); dicomwrite(imageA2, '#imageA2.dcm'); dicomwrite(imageA3, '#imageA3.dcm'); dicomwrite(imageB1, '#imageB1.dcm'); dicomwrite(imageB2, '#imageB2.dcm'); dicomwrite(imageB3, '#imageB3.dcm'); % retourne le timer toc
Ma fonction de fitting
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
73
74
75
76
77
78
79
80
81
82 function [paramVAL] = createFit(XVAL,YVAL) % Ligne -> colonne YVAL = YVAL(:); % CONDITIONS POUR GAGNER PLEIN DE TEMPS if YVAL(1) < 50; % Le bruit retourne du bruit paramVAL = [0 0 0 0 0 0 0]; elseif YVAL(1) > 200 ; fo_ = fitoptions('method','NonlinearLeastSquares',... 'MaxFunEvals',600,'MaxIter',400,... 'Lower',[ 8 8 128 0.0001 0.0001 0.0001 10],... 'Upper',[inf inf inf 0.01 0.01 0.01 14]); ok_ = isfinite(XVAL) & isfinite(YVAL); if ~all( ok_ ) warning( 'GenerateMFile:IgnoringNansAndInfs', ... 'Ignoring NaNs and Infs in data' ); end st_ = [8 8 300 0.0001 0.0002 0.003 12]; set(fo_,'Startpoint',st_); ft_ = fittype('a1*exp(-b1*x)+a2*exp(-b2*x)+a3*exp(-b3*x)+noise',... 'dependent',{'y'},'independent',{'x'},... 'coefficients',{'a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'noise'}); % Fit this model using new data cf_ = fit(XVAL(ok_),YVAL(ok_),ft_,fo_); % Or use coefficients from the original fit: if 0 cv_ = {9,9,300,0.0001,0.0001,0.003,12}; cf_ = cfit(ft_,cv_{:}); end paramVAL = coeffvalues (cf_); else A1 = 0.6 * YVAL(1); A2 = 0.3 * YVAL(1); A3 = 0.05 * YVAL(1); B1 = 1 * log(YVAL(1)/YVAL(48))/4700; B2 = 2 * log(YVAL(1)/YVAL(48))/4700; B3 = 3 * log(YVAL(1)/YVAL(48))/4700; NOISE = 0.05 * YVAL(1); MIN = 0.1 * YVAL(1); MAX = YVAL(1); fo_ = fitoptions('method','NonlinearLeastSquares',... 'DiffMinChange',1.0e-08,... 'DiffMaxChange',0.1,... 'MaxFunEvals',600,'MaxIter',400,... 'TolFun',1.0e-06,'TolX',1.0e-06,... 'Lower',[MIN MIN MIN 0.0001 0.0001 0.0001 10],... 'Upper',[MAX MAX MAX 0.01 0.01 0.01 14]); % Valeur min des paramètres ok_ = isfinite(XVAL) & isfinite(YVAL); if ~all( ok_ ) warning( 'GenerateMFile:IgnoringNansAndInfs', ... 'Ignoring NaNs and Infs in data' ); end st_ = [A1 A2 A3 B1 B2 B3 NOISE]; % Valeur d'initialisation des paramètres set(fo_,'Startpoint',st_); ft_ = fittype('a1*exp(-b1*x)+a2*exp(-b2*x)+a3*exp(-b3*x)+noise',... 'dependent',{'y'},'independent',{'x'},... 'coefficients',{'a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'noise'}); % Fit this model using new data cf_ = fit(XVAL(ok_),YVAL(ok_),ft_,fo_); % opération de fitting % Or use coefficients from the original fit: % if 0 % cv_ = {110,35,6,0.001,0.002,0.003,10}; % cf_ = cfit(ft_,cv_{:}); % end paramVAL = coeffvalues (cf_); end
Partager