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 :

Lire cellules d'un fichier Excel


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut Lire cellules d'un fichier Excel
    Bonjour à tous,

    Je souhaiterais créer une fonction dans laquelle j'appelle des données d'une partie d'un fichier Excel. Maintenant, mon problème est que ce fichier Excel contient plusieurs feuilles. Ensuite, dans chacune de ces feuilles, le nombre de données varie mais elles commencent toutes à la cellule R7. J'ignore comment faire pour prendre le reste de la colonne sachant que la taille de cette colonne peut varier d'un fichier à l'autre... Faudrait-il créer genre une boucle qui vérifie que la cellule suivante contient quelque chose et dès qu'il n'y a plus rien, cela détermine la fin de la colonne?

    Voici le début de mon code qui est faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function [structure]=optim[file_temp, file_hardness, tab_hardness]
     
    load file_temp
     
    % Looking for the number of data, [line columns]
    nb_data=size(file_temp);
     
    ydata=xlsread('file_hardness', tab_hardness, 'R7:end');
    xdata=file_temp(:,2:nb_data(2)-2);
    Merci beaucoup pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Tu trouveras la solution dans ce tutoriel : Contrôle d'Excel par MATLAB via Automation

    Plus précisément dans ce chapitre Les plages de cellules - La propriété End
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Hello,

    Merci beaucoup pour cette info!
    Par contre j'ai un autre problème... je n'ai pas pu voir si cela fonctionnait car j'ai un problème avec mon code. En fait, je n'arrive pas créer ma fonction. Je veux comme argument des noms de fichiers ou un nom de feuille d'un classeur Excel. Mais du coup, cela ne fonctionne pas. J'ai essayé avec ou sans apostrophes pour les argments, mais ça ne marche quand même pas.

    Voici ce que je rentre avec l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >> optim2('.\Results\rechauffe_bs_274','Durete', 'Feuil1')
    Undefined function 'optim2' for input arguments of type 'char'.
    Voici mon code :
    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
     
    function [structure]=optim2('file_temp', 'file_hardness', 'tab_hardness')
     
     
    % Looking for the number of data, [line columns]
    nb_data=size(file_temp);
     
    % Get values of the hardness
    Excel = actxserver('Excel.Application');
    set(Excel, 'Visible', false);
    xlspath = '.\' ;
    xlsfile = 'file_hardness' ;
     
    Workbook = Excel.Workbooks.Open(fullfile(xlspath,xlsfile));
    ActiveSheet = Excel.Worksheets.Item('tab_hardness');
     
    r(1) = ActiveSheet.Range('R7');
    r(2) = ActiveSheet.Range('R7').End('xlDown');
    ydata = ActiveSheet.get('Range',r(1),r(2)).Value;
     
    Workbook.Close(false);
    Quit(Excel);
     
    % Get values of temperature, etc...
    fichier=dlmread('file_temp');
    xdata=fichier(:,3:nb_data(2));
     
    %% OPTIM
     
    % script to optimise ki values in classical QFA (eq. 3 and not 4 in Shuhui
    % Ma et al.) with Sigma_min=0 and Avrami exponent n = 1
     
    % upper bound
    ku = [30.0 10.0 10.0 20.00];
    % lower bound
    kl = [1 1 1 1];
    % initial guess
    k0 = [7.0000    7.9800    7.7800   13.0056];
     
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku); 
     
    %% Creation of the structure
     
    structure.HV = HV_pred;
    structure.k = k;
    structure.Q = Q;
     
     
    %% Graphics
     
     
    figure(2)
    for i=1:30
    x(i) =i;
    end
    % Superposition points expérimentaux et fittés. 
    plot (x, ydata, '*r', x, fun(k, xdata), '+b')
    xlabel('Position');
    ylabel('HV');
    title('Strength in function of the position');
     
    figure(3)
    plot(x, fun(k,xdata))
     
    figure(4)
    plot(fun(k,xdata),ydata)
    xlabel('HV predicted');
    ylabel('HV measured');
    title('HV predicted VS HV measured');
     
    end
    Merci d'avance!

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Dans la fonction optim2, il ne faut pas mettre de guillemet autour du nom des variables définies en entête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function structure = optim2(file_temp, file_hardness, tab_hardness)
    De même dans le reste du code...
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Merci pour ton aide!

    J'avais déjà essayé sans les guillemets dans l'entête, et j'ai corrigé les guillemets dans le code. Merci.

    Par contre ça ne marche toujours pas. Voici les erreurs que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >> optim2(.\Results\rechauffe_bs_274,Durete, Feuil1)
     optim2(.\Results\rechauffe_bs_274,Durete, Feuil1)
           |
    Error: Unexpected MATLAB operator.
     
    >> optim2('.\Results\rechauffe_bs_274','Durete', 'Feuil1')
    Undefined function 'optim2' for input arguments of type 'char'.
    Une idée du problème?

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Voir la FAQ : Undefined function or method *** for input arguments of type ***.

    Le dossier courant de MATLAB est-il bien celui qui contient le fichier optim2.m ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    oh le boulet!!! Je suis vraiment désolé pour ma stupidité.

    En fait je navigue entre le répertoire parent et le sous répertoire et j'ai oublié de changer.

    J'aurais encore 2 petites questions :
    1) avec le code ci-dessous, j'enregistre un colonne du fichier excel dans ydata. Ensuite, ydata est utilisé plus loin, mais il me marque comme erreur qu'il manque justement ydata comme input argument pour la fonction fun. Avez-vous une idée d'où ça peut venir? Est-ce qu'en fermant l'application, ça ne sauvegarde pas les variables?
    Si maintenant, je mets delete(Excel) et clear Excel pour supprimer la variable Excel, est-ce que cela aura une influence sur ydata?

    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
     
    Excel = actxserver('Excel.Application');
    set(Excel, 'Visible', false);
    xlspath = '..\' ;
    xlsfile = file_hardness ;
     
    Workbook = Excel.Workbooks.Open(fullfile(xlspath,xlsfile));
    ActiveSheet = Excel.Worksheets.Item(tab_hardness);
     
    r(1) = ActiveSheet.Range('R7');
    r(2) = ActiveSheet.Range('R7').End('xlDown');
    ydata = ActiveSheet.get('Range',r(1),r(2)).Value;
     
    Workbook.Close(false);
    Quit(Excel);
    2) Avec le xlspath = '..\', il me met l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Error using Interface.Microsoft_Excel_12.0_Object_Library.Workbooks/Open
    Invoke Error, Dispatch Exception:
    Source: Microsoft Office Excel
    Description: '..\Durete.xlsx' introuvable. Vérifiez l'orthographe du nom du classeur et la validité de l'emplacement.
    Alors j'ai contrôlé 5 fois le nom et l'emplacement du fichier et il n'y a pas d'erreur de ce côté là...

    Merci beaucoup pour votre aide!

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Il faut mettre le chemin absolu et non pas relatif vers le fichier xlsx.

    Donc par ../../../ mais D:\...\...\...\

    J'ai ajouté cette remarque dans le tutoriel : Connexion - Ouvrir un fichier existant
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Très bien merci. Mais en fait ça ne répond pas à ma première question, car j'avais déjà essayé de le mettre en chemin absolu et il m'affiche l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Error using lsqcurvefit (line 178)
    LSQCURVEFIT requires the following inputs to be of data type double: 'YDATA'.
     
    Error in optim2 (line 59)
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku);
    En fait, dans mon code, il ne voit pas ydata, je ne sais pourquoi. Que je ne ferme pas le workbook et ne quitte pas Excel ne change rien. Ce qui est également étrange est que le workspace est vide, alors que la définition des variables se fait avant l'appel de la fonction.

    Je remets une fois le code actuel au cas où.

    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 [structure]=optim2(file_temp, file_hardness, tab_hardness, file_created)
     
     
    %% Utilisation
    % Pour utiliser ce code, il faut avoir un fichier Excel avec les duretés en R7. Il faut donner le nom exact de la feuille. 
    % Le fichier de température doit avoir le temps dans la colonne 2, et les températures suivant la position dans les colonnes 3 et suivantes.
     
     
    %% DATA
     
    % Get values of the hardness
    Excel = actxserver('Excel.Application');
    set(Excel, 'Visible', false);
    xlspath = 'H:\Projet' ;
    xlsfile = file_hardness ;
     
    Workbook = Excel.Workbooks.Open(fullfile(xlspath,xlsfile));
    ActiveSheet = Excel.Worksheets.Item(tab_hardness);
     
    r(1) = ActiveSheet.Range('R7');
    r(2) = ActiveSheet.Range('R7').End('xlDown');
    ydata = ActiveSheet.get('Range',r(1),r(2)).Value;
     
    % Workbook.Close(false);
    % Quit(Excel);
    % delete(Excel)
    % clear Excel
     
    % Get values of temperature, etc...
    fichier=dlmread(file_temp);
    % Looking for the number of data, [line columns]
    nb_data=size(fichier);
    xdata=fichier(:,3:nb_data(2));
     
     
    %% OPTIM
     
    % script to optimise ki values in classical QFA (eq. 3 and not 4 in Shuhui
    % Ma et al.) with Sigma_min=0 and Avrami exponent n = 1
     
    % upper bound
    ku = [30.0 10.0 10.0 20.00];
    % lower bound
    kl = [1 1 1 1];
    % initial guess
    k0 = [7.0000    7.9800    7.7800   13.0056];
     
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku); 
     
    %% Creation of the structure
     
    structure.HV = HV_pred;
    structure.k = k;
    structure.Q = Q;
     
    %% Creation of the file with the data
     
    dlmwrite(file_created,structure.HV); 
    dlmwrite(file_created,structure.Q,'-append'); 
    dlmwrite(file_created,structure.k,'-append'); 
     
    %% Graphics
     
    figure(2)
    for i=1:30
    x(i) =i;
    end
    % Superposition points expérimentaux et fittés. 
    plot (x, ydata, '*r', x, fun(k, xdata), '+b')
    xlabel('Position');
    ylabel('HV');
    title('Strength in function of the position');
     
    figure(3)
    plot(x, fun(k,xdata))
     
    figure(4)
    plot(fun(k,xdata),ydata)
    xlabel('HV predicted');
    ylabel('HV measured');
    title('HV predicted VS HV measured');
    Merci beaucoup pour votre aide, vraiment!

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Ajoute la ligne suivante :

    juste après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ydata = ActiveSheet.get('Range',r(1),r(2)).Value;
    dans ton code et montre nous ce que cela renvoi
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Voici l'erreur à présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     Name       Size            Bytes  Class    Attributes
     
      ydata      9x1               612  cell               
     
    Error using lsqcurvefit (line 178)
    LSQCURVEFIT requires the following inputs to be of data type double: 'YDATA'.
     
    Error in optim2 (line 60)
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku);
    J'ai vérifié, il y a bien 9 cellules avec des nombres. Je n'ai toujours aucune variable dans le workspace du coup.
    Maintenant, est-ce que l'erreur pourrait venir du fait que ces cellules sont le résultat d'un calcul et qu'il essaie de reprendre le calcul plutôt que le résultat affiché?

  12. #12
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    l'erreur parle d'elle même
    lsqcurve fit attend un tableau de double (matrice) et non un tableau de cellules

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    D'accord, mais comment je peux avoir un tableau de double à partir de l'automation, et non un tableau de cellules?

    Merci infiniment!

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    C'est écris dans une autre partie du tutoriel : Lecture de données - Lecture de valeurs numériques
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Je suis vraiment désolé, le pire c'est que je l'avais lue cette partie et elle m'est sortie de la tête. Encore désolé...

    Par contre le problème des variables n'est pas résolu. J'ai mis les variables en global (xdata, ydata et nb_data), mais aucune n'apparaît dans le workspace. De plus j'obtiens une erreur sur la fonction utilisant une variable de la fonction principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Undefined function 'nb_data' for input arguments of type 'double'.
     
    Error in fun (line 16)
    for j=1:1:nb_data(2)-3
     
    Error in lsqcurvefit (line 195)
                initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});
     
    Error in optim2 (line 65)
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku);
     
    Caused by:
        Failure in initial user-supplied objective function evaluation. LSQCURVEFIT cannot continue.
    J'ai contrôlé, il s'agit bien d'un type double et je ne comprends pas pourquoi ça ne marche pas...

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    As-tu pensé à la déclarer globale aussi dans ta fonction fun ? (Cf ce message)
    Sinon tu peux aussi utiliser la méthode 3) de la FAQ Que représente le symbole @ ?

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Bonjour!

    Merci beaucoup pour l'aide.

    En fait, le symbole @, je commence à comprendre son utilité, mais ne saurais l'appliquer pour des fonctions "aussi compliquées" incluant des boucles et autre...

    Finalement, ça a l'air de fonctionner, à part que dans la fonction fun, il souligne en rouge xdata et dit que : xdata might be used incompatibly or redefined. J'ai vu sur google que ça pouvait être car il n'était pas correctement initialisé mais en même temps, il est initialisé dans la fonction principal et n'est pas souligné. De plus, les autres variables globales, elles fonctionnent. Donc je ne sais pas d'où ça vient, mais je reçois toujours un avertissement quand je lance la fonction qui dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Warning: The value of local variables may have been changed to match the globals.  Future versions of MATLAB will require that you declare
    a variable to be global before you use that variable. 
    > In fun at 3
      In lsqcurvefit>objective at 261
      In C:\Program Files\MATLAB\R2013a\toolbox\shared\optimlib\finDiffEvalAndChkErr.p>finDiffEvalAndChkErr at 26
      In C:\Program Files\MATLAB\R2013a\toolbox\shared\optimlib\finitedifferences.p>finitedifferences at 128
      In sfdnls at 89
      In snls at 344
      In lsqncommon at 150
      In lsqcurvefit at 253
      In optim2 at 75
    Je suppose que ça vient à cause de xdata. Mais xdata est aussi défini en variable globale dans la fonction, donc je ne sais pas pourquoi il pense qu'elle est locale... Cependant, le code fonctionne quand même... Auriez-vous une suggestion?

    Sinon j'ai continué un bout du code et j'obtiens encore une erreur. Je souhaite écrire les données dans un fichier excel. Voici ce que je marque :

    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
     
    Excel = actxserver('Excel.Application');
    Excel.Visible = false;
    Workbook = Excel.Workbooks.Add;
    ActiveSheet = Excel.Worksheets.Item(1);
     
    ActiveSheet.Range('A1:C1').Value = {'Valeurs k' 'Q' 'HV_pred'};
     
    Range1=(['A2:A' int2str(length(structure.k)+1)]);
    Range2=(['B2:B' int2str(length(structure.Q)+1)]);
    Range3=(['C3:C' int2str(length(structure.HV)+1)]);
     
    ActiveSheet.Range1.Value = num2cell(structure.k);
    ActiveSheet.Range2.Value = num2cell(structure.Q);
    ActiveSheet.Range3.Value = num2cell(structure.HV);
     
    Workbook.SaveAs(fullfile(filepath,file_created));
    Workbook.Close;
    Excel.Quit;
    delete(Excel)
    clear Excel
    Ensuite, l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    No appropriate method, property, or field Range1 for class Interface.Microsoft_Excel_12.0_Object_Library._Worksheet.
     
    Error in optim2 (line 98)
    ActiveSheet.Range1.Value = num2cell(structure.k);
    J'ai pensé tout d'abord que le vecteur devait être en ligne, mais j'ai vérifié et il est bien en colonne. Avez-vous une idée?

    Merci beaucoup!

  18. #18
    Invité
    Invité(e)
    Par défaut
    À voir tes appels fun(k,xdata), n'est-elle pas aussi passée en paramètre ?

    Sinon tes lignes avec Range1,2 et 3 à remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveSheet.Range(Range1).Value = num2cell(structure.k);
    ActiveSheet.Range(Range2).Value = num2cell(structure.Q);
    ActiveSheet.Range(Range3).Value = num2cell(structure.HV);

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    C'est un paramètre de lsqcurvefit. Mais ce qui est étrange c'est que c'est uniquement cette variable globale qui pose problème. Voici la version du code actuel, peut-être que ça pourra aider :

    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
    109
    110
    111
     
    %% Global variables
    global xdata ydata nb_xdata nb_ydata
     
    %% Files
    file_temp = 'essai_cooling2.dat';
    file_hardness = 'essai_gunnar';
    tab_hardness ='feuil1';
     
    file_created= 'essai_creation_excel';
    filepath = 'E:\Projet Matériaux\Matlab\';
     
     
    %% DATA Hardness
     
    % Get values of the hardness
    Excel = actxserver('Excel.Application');
    set(Excel, 'Visible', false);
    xlspath = 'E:\Projet Matériaux\Matlab\' ;
    xlsfile = file_hardness ;
     
    Workbook = Excel.Workbooks.Open(fullfile(xlspath,xlsfile));
    ActiveSheet = Excel.Worksheets.Item(tab_hardness);
     
    r(1) = ActiveSheet.Range('R7');
    r(2) = ActiveSheet.Range('R7').End('xlDown');
    ydata = ActiveSheet.get('Range',r(1),r(2)).Value;
    ydata = cell2mat(ydata);
    nb_ydata = size(ydata);
     
    Workbook.Close(false);
    Quit(Excel);
    delete(Excel)
    clear Excel
     
    %% DATA Temp
     
    % Get values of temperature, etc...
    fichier=dlmread(file_temp);
    % Looking for the number of data, [line columns]
    nb_xdata=size(fichier);
    xdata=fichier(:,2:nb_xdata(2));
     
     
    %% OPTIM
     
    % script to optimise ki values in classical QFA (eq. 3 and not 4 in Shuhui
    % Ma et al.) with Sigma_min=0 and Avrami exponent n = 1
     
    % upper bound
    ku = [30.0 10.0 10.0 20.00];
    % lower bound
    kl = [1 1 1 1];
    % initial guess
    k0 = [7.0000    7.9800    7.7800   13.0056]; %13.0056
     
    [k,RESNORM,RESIDUAL,EXITFLAG,OUTPUT]= lsqcurvefit('fun', k0, xdata, ydata, kl, ku); 
     
    [HV_pred, Q] = fun2(k,xdata);
     
    %% Creation of the structure
     
    structure.HV = HV_pred;
    structure.k = k';
    structure.Q = Q;
     
    %% Creation of the file with the data
     
    Excel = actxserver('Excel.Application');
    Excel.Visible = false;
    Workbook = Excel.Workbooks.Add;
    ActiveSheet = Excel.Worksheets.Item(1);
     
    ActiveSheet.Range('A1:C1').Value = {'Valeurs k' 'Q' 'HV_pred'};
     
    Range1=(['A2:A' int2str(length(structure.k)+1)]);
    Range2=(['B2:B' int2str(length(structure.Q)+1)]);
    Range3=(['C2:C' int2str(length(structure.HV)+1)]);
     
    ActiveSheet.Range(Range1).Value = num2cell(structure.k);
    ActiveSheet.Range(Range2).Value = num2cell(structure.Q);
    ActiveSheet.Range(Range3).Value = num2cell(structure.HV);
     
    Workbook.SaveAs(fullfile(filepath,file_created));
    Workbook.Close;
    Excel.Quit;
    delete(Excel)
    clear Excel
     
     
    %% Graphics
     
    figure(2)
    x=zeros(nb_ydata,1);
    for i=1:nb_ydata(1)
    x(i) =i;
    end
    % Superposition points expérimentaux et fittés. 
    plot (x, ydata, '*r', x, fun(k, xdata), '+b')
    xlabel('Position');
    ylabel('HV');
    title('Strength in function of the position');
     
    figure(3)
    plot(x, fun(k,xdata))
     
    figure(4)
    plot(fun(k,xdata),ydata)
    xlabel('HV predicted');
    ylabel('HV measured');
    title('HV predicted VS HV measured');
    Pour la fonction fun :
    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
     
    function HV_pred = fun(k,xdata)
     
    global xdata ydata nb_xdata nb_ydata
     
    % Calculation of the theoritical HV for each step. hvi(1) is taken because it is
    % the maximal value of the experimental HV
    % All k are normalized :k1 to k4 are normalised to have them in the same order of magnitude
    % (preferentially 1): k1*10^12 ; k2/100 ; k3/100 ; k4/10000
    % indices have been shifted compared to the original definition of ki
     
     
    %Setting of the first parameter which corresponds to a C curve
    k_first=0.995;
    R=8.314;
     
    HV_pred = zeros(nb_ydata(1),1);
     
        for j=1:1:nb_xdata(2)-2 
        HV_pred(j,1) = ydata(1)*exp(log(k_first)*sum(xdata(:,1)./(-log(k_first).*(k(1)./10^12).*exp(((100.*k(2)).*(100.*k(3)).^2)./(R*(xdata(:,j+1)+273.15).*((100.*k(3))-273.15-xdata(:,j+1)).^2)).*exp(10000.*(k(4))./(R*(xdata(:,j+1)+273.15))))));
        end
     
    end
    La fonction fun2 est quasi identique à fun et pose le même problème...

    Merci beaucoup pour votre aide!

  20. #20
    Invité
    Invité(e)
    Par défaut
    C'est bien ce que je pensais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function HV_pred = fun(k,xdata)
    
    global xdata ydata nb_xdata nb_ydata
    Étant donné que la fonction lsqcurvefit fait passer ce paramètre, la déclarer globale est redondant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Lire une cellule dans un fichier excel
    Par Annihil dans le forum C#
    Réponses: 1
    Dernier message: 15/11/2011, 07h32
  2. Comment lire d'un un fichier excel
    Par orj30754 dans le forum C++
    Réponses: 3
    Dernier message: 09/10/2006, 15h06
  3. [EXCEL]Comment lire à partir d'un fichier Excel en java?
    Par BOUSHIH dans le forum Documents
    Réponses: 3
    Dernier message: 20/04/2006, 11h04
  4. lire / écrire dans un fichier excel au format xml
    Par crisflo dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 28/01/2006, 10h50

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