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 :

Utilisation de PARFOR


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut Utilisation de PARFOR
    Bonjour,

    J'ai un code matlab qui fait appel à une boucle for pour 150 970 itérations.
    Mon ordinateur met plus de 4 jours pour faire tourner le programme.
    Je me suis renseignée et j'ai vu qu'il était possible d'utiliser la fonction parfor à la place de for pour faire les calculs en parallèle et donc gagner du temps !
    Voici une partie de mon code (A_pp est une matrice de taille 150970 lignes et 7 colonnes) :

    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
    [m,n] = size(A_pp);
     
    parfor i=1:m;
        for j= 2:4;
            if A_pp(i,j) == 0;
                Xval = Xval;
                Xcal = Xcal;
                Xfb120 = Xfb120;
                Xpred = Xpred;
            elseif A_pp(i,j) == 1;
                [Xcal, ~, ~] = snv(Xcal); 
                [Xval, ~, ~] = snv(Xval);
                [Xfb120, ~, ~] = snv(Xfb120);
                [Xpred, ~, ~] = snv(Xpred);
            elseif A_pp(i,j) == 2;
                width = A_pp(i,7);
                order = A_pp(i,5);
                deriv = A_pp(i,6);
                [Xcal, ~] = savgol(Xcal,width,order,deriv);
                [Xval, ~] = savgol(Xval,width,order,deriv);
                [Xfb120, ~] = savgol(Xfb120,width,order,deriv);
                [Xpred, ~] = savgol(Xpred,width,order,deriv);
            elseif A_pp(i,j) == 3;
                [Xcal,~,~,~] = mscorr(Xcal);
                [Xval,~,~,~] = mscorr(Xval);
                [Xfb120,~,~,~] = mscorr(Xfb120);
                [Xpred,~,~,~] = mscorr(Xpred);
            end
            if j == 4;
     
                LV = A_pp(i,1);
                modl = pls(Xcal, Ycal, LV, options);
    %             pred  = pls(Xval,modl,options);
                valid = pls(Xval,Yval,modl,options);
     
                pred120 = pls(Xfb120,modl,options);
                Ypred120 = pred120.yhat;
                valid120 = pls(Xfb120,Yfb120,modl,options);
     
                erreur(i,1) = valid.rmsec(LV); %rmsec
                erreur(i,2) = valid.rmsep(LV); %rmsev
                erreur(i,3) = valid120.rmsep(LV); %rmsep
                erreur(i,4) = valid.r2c(LV); %r2c
                erreur(i,5) = valid.r2p(LV); %r2v
                erreur(i,6) = valid120.r2p(LV); %r2p
                erreur(i,7) = (max(Yval)-min(Yval))/erreur(i,2); %RER
     
                Xcal = X_ini;
                Xval = X_ini1;
                Xpred = X_ini2;
                Xfb120 = X_ini3;
            end
        end
    end
    Et il me dit : "Error: The variable erreur in a parfor cannot be classified."
    Je ne comprends pas pourquoi ... j'ai regardé la page matlab sur parfor et pour moi j'ai le droit d'utiliser parfor ...

    Est-ce que vous pouvez m'aider s'il vous plait ?

    Bonne journée !
    Aurelia

  2. #2
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Par défaut
    Bonjour,

    En ajoutant une initialisation c'est plus rapide, et en modifiant la gestion de la variable erreur ça répare le problème.
    https://de.mathworks.com/matlabcentr...-be-classified
    https://fr.mathworks.com/matlabcentr...-be-classified

    En bleu mes modifications.

    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
    [m,n] = size(A_pp);
    
    erreur = -ones(m, 8) ; % initialisation
    
    parfor i=1:m;
        for j= 2:4;
            if A_pp(i,j) == 0;
                Xval = Xval;
                Xcal = Xcal;
                Xfb120 = Xfb120;
                Xpred = Xpred;
            elseif A_pp(i,j) == 1;
                [Xcal, ~, ~] = snv(Xcal);
                [Xval, ~, ~] = snv(Xval);
                [Xfb120, ~, ~] = snv(Xfb120);
                [Xpred, ~, ~] = snv(Xpred);
            elseif A_pp(i,j) == 2;
                width = A_pp(i,7);
                order = A_pp(i,5);
                deriv = A_pp(i,6);
                [Xcal, ~] = savgol(Xcal,width,order,deriv);
                [Xval, ~] = savgol(Xval,width,order,deriv);
                [Xfb120, ~] = savgol(Xfb120,width,order,deriv);
                [Xpred, ~] = savgol(Xpred,width,order,deriv);
            elseif A_pp(i,j) == 3;
                [Xcal,~,~,~] = mscorr(Xcal);
                [Xval,~,~,~] = mscorr(Xval);
                [Xfb120,~,~,~] = mscorr(Xfb120);
                [Xpred,~,~,~] = mscorr(Xpred);
            end
            if j == 4;
                
                LV = A_pp(i,1);
                modl = pls(Xcal, Ycal, LV, options);
                % pred = pls(Xval,modl,options);
                valid = pls(Xval,Yval,modl,options);
                
                pred120 = pls(Xfb120,modl,options);
                Ypred120 = pred120.yhat;
                valid120 = pls(Xfb120,Yfb120,modl,options);
                
                erreur_temp = [valid.rmsec(LV),...
                	valid.rmsep(LV),...
                	valid120.rmsep(LV),...
                    alid.r2c(LV),...
                	valid.r2p(LV),...
                    valid120.r2p(LV),...
                    (max(Yval)-min(Yval))/valid.rmsep(LV)]
                erreur(i,:) = erreur_temp ; %RER
    
                Xcal = X_ini;
                Xval = X_ini1;
                Xpred = X_ini2;
                Xfb120 = X_ini3;
            end
        end
    end

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    Bonjour Antoane,

    Merci beaucoup pour ta réponse.
    J'ai relancé mon code avec tes modifications et ça fonctionne !

    Encore merci !
    Aurelia

  4. #4
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Par défaut
    Bonjour,

    Queleques détails additionnels pour simplifier et clarifier le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if A_pp(i,j) == 0;
        ....
    elseif A_pp(i,j) == 1;
        ...
    elseif A_pp(i,j) == 2;
        ...
    elseif A_pp(i,j) == 3;
        ...
    end
    Pourra être remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch A_pp(i,j)
        case 0
            ....
        case 1
            ...
        case 2
            ...
        case 3
            ...
        otherwise
        error('Unexpected A_pp(i,j) value')
    end
    De plus,
    [Xcal, ~, ~] = snv(Xcal); pourra être simplifié en : Xcal = snv(Xcal);
    Les tildes ne sont nécessaires que lorsqu'on veut récupérer un argument de sortie sans récupérer l'un des précédents, par exemple pour : [~, ~, x] = snv(Xcal);

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Juillet 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2020
    Messages : 5
    Par défaut
    Hello Antoane !

    Je rencontre un nouveau problème avec la boucle parfor.
    Il me dit :
    Error using pls (line 286)
    Transparency violation error.
    See Parallel Computing Toolbox documentation about Transparency
    Error in Citrouille (line 138)
    parfor i=1:m;


    Si je comprends bien, vu que pls crée des nouvelles variables (pred120 par exemple) il va en créer genre 10 en parallèle et donc 10 variables qui ont le même nom ...

    Voici mon code modifié avec tes conseils :
    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
    erreur = zeros(m,7);
    parfor i=1:m;
        Xcal = X_ini;
        Xval = X_ini1;
        Xpred = X_ini2;
        Xfb120 = X_ini3;
        for j= 2:4;       
            switch A_pp(i,j)
                case 0;
                    Xval = Xval;
                    Xcal = Xcal;
                    Xfb120 = Xfb120;
                    Xpred = Xpred;
                case 1;
                    Xcal = snv(Xcal); 
                    Xval = snv(Xval);
                    Xfb120 = snv(Xfb120);
                    Xpred = snv(Xpred);
                case 2;
                    width = A_pp(i,7);
                    order = A_pp(i,5);
                    deriv = A_pp(i,6);
                    Xcal = savgol(Xcal,width,order,deriv);
                    Xval = savgol(Xval,width,order,deriv);
                    Xfb120 = savgol(Xfb120,width,order,deriv);
                    Xpred = savgol(Xpred,width,order,deriv);
                case 3;
                    Xcal = mscorr(Xcal);
                    Xval = mscorr(Xval);
                    Xfb120 = mscorr(Xfb120);
                    Xpred = mscorr(Xpred);
                otherwise
                    error('Unexpected A_pp(i,j) value')
            end
        end
        LV = A_pp(i,1);
        modl = pls(Xcal, Ycal, LV, options);
        valid = pls(Xval,Yval,modl,options);
     
        pred120 = pls(Xfb120,modl,options);
        Ypred120 = pred120.yhat;
        valid120 = pls(Xfb120,Yfb120,modl,options);
     
        erreur_temp = [valid.rmsec(LV),...
        valid.rmsep(LV),...
        valid120.rmsep(LV),...
        valid.r2c(LV),...
        valid.r2p(LV),...
        valid120.r2p(LV),...
        (max(Yval)-min(Yval))/valid.rmsep(LV)]
        erreur(i,:) = erreur_temp ;
    end
    Est-ce que tu as une idée de ce que je peux faire ? Il faut que je crée de nouvelles variables temporaires ? mais lesquelles ?

    Bonne journée,
    Aurelia

  6. #6
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Par défaut
    Bonjour,

    Sans certitude : tu peux essayer de déclarer les variables avant d'entrer dans la boucle parfor.

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

Discussions similaires

  1. Utilisation d'une boucle parfor pour simulation parallele
    Par Khô-Zed dans le forum Simulink
    Réponses: 0
    Dernier message: 05/09/2017, 10h08
  2. Réponses: 30
    Dernier message: 05/12/2013, 17h48
  3. Réponses: 4
    Dernier message: 26/10/2009, 21h43
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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