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 :

Undefined function or method 'eq' for input arguments of type 'cell'.


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Undefined function or method 'eq' for input arguments of type 'cell'.
    Bonjour
    j'ai un problème avec une fonction dans matlab.
    Voici ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i_research_sensor = 1 : length(s.Connection_1)
     
    step3_Con1 =find(arrayfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1,'UniformOut put',false)==1); 
     
    for i_step_Con1 = 1 : length(step3_Con1)
     
     
    fprintf(fid_save,[s.EMS{step3_Con1(i_step_Con1)} char(9) s.Name{step3_Con1(i_step_Con1) } char(9) s.Connection_1{step3_Con1(i_st ep_Con1)} char(9) s.Connection_2{step3_Con1(i_st ep_Con1)} char(9) s.Connection_3{step3_Con1(i_st ep_Con1)} char(9) s.Connection_4{step3_Con1(i_st ep_Con1)} char(10)]);
     
    end
    end
    Je voudrais transformer step3_Con1 en cell pour que je puisse l'ecrire dans un fichier.

    Lorsque j'utilise ce code j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Undefined function or method 'eq' for input arguments of type 'cell'.
    Je ne comprends pas ou est mon erreur pouvez vous m'aider svp?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    un grand nombre d'erreur sont listé et expliqué dans la , je t'invite à y faire un tour pour essayer de comprendre l'erreur et de corriger.

    Si tu bloques toujours, il faut que tu nous donnes le code complet et le message d'erreur complet car la variable eq énoncé dans le message d'erreur n'apparait pas dans ton code...
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut
    bizarre, tu n'as mis nul part de fonction 'eq' ...
    quoiqu'il en soit, le problème est l'utilisation de cell. donc dans la fonction qui merdouille, rajoute juste {1} après le nom de ta variable qui contient la cell.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par magelan Voir le message
    un grand nombre d'erreur sont listé et expliqué dans la , je t'invite à y faire un tour pour essayer de comprendre l'erreur et de corriger.
    Sauf que cette erreur n'y est pas (encore ) répertoriée
    Citation Envoyé par sellamelie Voir le message
    bizarre, tu n'as mis nul part de fonction 'eq' ...
    La ligne qui pose problème est celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    step3_Con1 =find(arrayfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1,'UniformOut put',false)==1);
    Notre fonction 'eq' (ou equal) qui n'est autre que ==, n'accepte pas de tableau de cellule (cell) comme arguments.
    Or d'après 'UniformOutput',false) la sortie de la fonction arrayfun est de type cell, et ne peut donc pas être comparé à 1.
    Suivant ce que tu veux obtenir, la fonction cellfun (équivalent de arrayfun pour les tableau de cellules) pourrait se révéler utile.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    En effet Winjerome a raison c'est un cellfun a la place du arrayfun mais cela me genere la même erreur c'est-à-dire
    ??? Undefined function or method 'eq' for input arguments of type 'cell'.
    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
    % % Openness and creation of Output's file
    fid_txt=fopen(fullfile(pwd,[f_excel '.txt']),'w+');
     
    % % Creation of analysis Report
    fid_report= fopen(fullfile(pwd,[f_excel '_Report.txt']),'w+');
     
    % % Verification and Test file
    fid_test = fopen(fullfile(pwd,[f_excel '_Test.txt']),'w+');
    fid_ongoing = fopen(fullfile(pwd,[f_excel '_Ongoing.txt']),'w+');
    fid_save= fopen(fullfile(pwd,[f_excel '_Save.txt']),'w+');
     
     
     
    % % Init output matrix
    fprintf(fid_txt,['EMS' char(9) 'Name' char(9) 'Connection_1' char(9) 'Connection_2' char(9) 'Connection_3' char(9) 'Connection_4' char(10)]);
    fprintf(fid_report,['\nSensors which are present :' char(9) char(9) char(9) 'Sensors which are missing\n' ]);
    fprintf(fid_ongoing,['StartNode' char(9) 'StartCav' char(9) 'EndNode' char(9) 'EndCav' char(10)]);
    fprintf(fid_test,['StartNode' char(9) 'Cav1' char(9) 'EndNode' char(9) 'Cav2' char(10)]);
    fprintf(fid_save,['EMS' char(9) 'Name' char(9) 'Connection_1' char(9) 'Connection_2' char(9) 'Connection_3' char(9) 'Connection_4' char(10)]);
     
    % % comparaison between EMS Dictionary and Project Dictionary & copy line
    % % which have the same sensor
     
    for i_capteur = 1:length(Dico.EMS.capteur)
        % Search in Dico if the capteur is available
        idx = find(strncmp(Dico.Project.Name,Dico.EMS.capteur{i_capteur},length(Dico.EMS.capteur{i_capteur})));
        if ~isempty(idx)
     
            for i_idx = 1 : length(idx);
     
                fprintf(fid_txt,[Dico.Project.EMS{idx(i_idx)} char(9) Dico.Project.Name{idx(i_idx)} char(9) Dico.Project.Connection_1{idx(i_idx)} char(9) Dico.Project.Connection_2{idx(i_idx)} char(9) Dico.Project.Connection_3{idx(i_idx)} char(9) Dico.Project.Connection_4{idx(i_idx)} char(10)]);
     
     
                fprintf(fid_report, [char(9) Dico.Project.EMS{idx(i_idx)} char(9) Dico.Project.Name{idx(i_idx)} char(10)])
            end
     
        else
            % Inform user that sensor wasn't found
            fprintf(fid_report,[char(9) char(9) char(9) char(9)  'missing' char(10)]);
        end
     
    end
     
    % On enregistre le Dico généré
    fid_txt=fopen('DicoControl.txt');
    DicoControl = textscan(fid_txt,'%q %q %q %q %q %q' ,'delimiter', '\t');
    fclose(fid_txt);
     
    %On le convertit en struct pour pouvoir l'utiliser
    fid_txt=fopen('DicoControl.txt');
    c= {DicoControl{1,1},DicoControl{1,2},DicoControl{1,3},DicoControl{1,4},DicoControl{1,5},DicoControl{1,6}};
    f={DicoControl{1,1}{1,1},DicoControl{1,2}{1,1},DicoControl{1,3}{1,1},DicoControl{1,4}{1,1},DicoControl{1,5}{1,1},DicoControl{1,6}{1,1}};
    s = cell2struct(c,f,2); %s est le DicoControl convertit, c'est s qu'on utilisera a partir de maintenant
     
     
     
    %Reseach of sensor in EMS Dictionary and DSI dictionary
    for i_research_Node = 1:length(Dico.EMS.Node)
     
        % I search all Node(sensor's name in DSI) in StartNode
     
        step1 = find(strncmp(Dico.DSI.StartNode,Dico.EMS.Node{i_research_Node},length(Dico.EMS.Node{i_research_Node})));
     
        for i_step11 = 1 : length(step1)
            fprintf(fid_ongoing,[Dico.DSI.StartNode{step1(i_step11)} char(9) Dico.DSI.Cav1{step1(i_step11)} char(9) Dico.DSI.EndNode{step1(i_step11)} char(9) Dico.DSI.Cav2{step1(i_step11)} char(10)]);
        end
    end
     
    % On enregistre le Dico généré
    fid_ongoing=fopen('DicoControl_Ongoing.txt');
    DicoControl_Ongoing = textscan(fid_ongoing,'%q %q %q %q','delimiter', '\t');
    fclose(fid_ongoing);
     
    %On le convertit en struct pour pouvoir l'utiliser
    fid_ongoing = fopen('DicoControl_Ongoing.txt');
    b = {DicoControl_Ongoing{1,1},DicoControl_Ongoing{1,2},DicoControl_Ongoing{1,3},DicoControl_Ongoing{1,4}};
    g ={DicoControl_Ongoing{1,1}{1,1},DicoControl_Ongoing{1,2}{1,1},DicoControl_Ongoing{1,3}{1,1},DicoControl_Ongoing{1,4}{1,1}};
    result = cell2struct(b,g,2); %result est le DicoControl_Ongoing convertit, c'est result qu'on utilisera a partir de maintenant
     
    %Je cherche tous les EndNode de la forme 'A14.EA'
    %for i_step1 = 1 : length(result.EndNode)
        step2 = find(cellfun(@(data) strcmp(data,'A14.EA'),result.EndNode)==1);%regexp(result.EndNode,'A14.EA','match');
        for i_step2 = 1 : length (step2)
            if ~isempty(step2)
                fprintf(fid_test,[result.StartNode{step2(i_step2)} char(9) result.StartCav{step2(i_step2)} char(9) result.EndNode{step2(i_step2)} char(9) result.EndCav{step2(i_step2)} char(10)]);
            end
        end
    %end
     
     
    % On enregistre le Dico généré
    fid_test=fopen('DicoControl_Test.txt');
    DicoControl_Test = textscan(fid_test,'%q %q %q %q','delimiter', '\t');
    fclose(fid_test);
     
    %On le convertit en struct pour pouvoir l'utiliser
    fid_test = fopen('DicoControl_Test.txt');
    b = {DicoControl_Test{1,1},DicoControl_Test{1,2},DicoControl_Test{1,3},DicoControl_Test{1,4}};
    g ={DicoControl_Test{1,1}{1,1},DicoControl_Test{1,2}{1,1},DicoControl_Test{1,3}{1,1},DicoControl_Test{1,4}{1,1}};
    result_test = cell2struct(b,g,2); %result_test est le DicoControl_Test convertit, c'est result qu'on utilisera a partir de maintenant
     
     
    for i_research_sensor = 1 : length(s.Connection_1)
     
    step3_Con1 =find(cellfun(@(data() regexp(data{1},'A[0-9]*'),s.Connection_1,'UniformOutput',false)==1);        
     
            fprintf(fid_save,[s.EMS{step3_Con1(i_step_Con1)} char(9) s.Name{step3_Con1(i_step_Con1)} char(9) s.Connection_1{step3_Con1(i_step_Con1)} char(9) s.Connection_2{step3_Con1(i_step_Con1)} char(9) s.Connection_3{step3_Con1(i_step_Con1)} char(9) s.Connection_4{step3_Con1(i_step_Con1)} char(10)]);
     
        end
    end
    Voici mon code en entier,
    j'ai essayé la solution sellemalie si je rajoute un 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    step3_Con1 =find(cellfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1{1},'UniformOutput',false)==1);
    Cela me créer une erreur
     ??? Error using ==> cellfun
    Input #2 expected to be a cell array, was char instead. 

  6. #6
    Invité
    Invité(e)
    Par défaut
    Non, je voulais dire pour faire la comparaison avec le 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a_comparer = arrayfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1,'UniformOutput',false)
    step3_Con1 = cellfun(@(data) find(data==1),a_comparer,'UniformOutput',false);
    a_comparer est un tableau de cellules non comparable à 1.
    Après pour le premier arrayfun, ne connaissant pas le contenu, c'est à toi de voir celui qui est le plus adapté...

    [EDIT] À vérifier, mais selon mes souvenirs, regexp accepte les tableaux de cellules en entrée. Ainsi s.Connection_1 pourrait être directement passé dedans sans passer par arrayfun

  7. #7
    Membre habitué
    Inscrit en
    Août 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 129
    Points : 131
    Points
    131
    Par défaut
    parcequ'il considère que c'est du texte et pas des chiffres. fait un str2num(variable{1})==1

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Non, je voulais dire pour faire la comparaison avec le 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a_comparer = arrayfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1,'UniformOutput',false)
    step3_Con1 = cellfun(@(data) find(data==1),a_comparer,'UniformOutput',false);
    a_comparer est un tableau de cellules non comparable à 1.
    Après pour le premier arrayfun, ne connaissant pas le contenu, c'est à toi de voir celui qui est le plus adapté...

    [EDIT] À vérifier, mais selon mes souvenirs, regexp accepte les tableaux de cellules en entrée. Ainsi s.Connection_1 pourrait être directement passé dedans sans passer par arrayfun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    K>> a_comparer = arrayfun(@(data) regexp(data,'A[0-9]*'),s.Connection_1{1},'UniformOutput',false)
     
    a_comparer = 
     
         []     []     []     []     []     []     []     []     []     []     []     []
     
    K>> step3_Con1 = cellfun(@(data) find(data==1),a_comparer,'UniformOutput',false);
    Matlab ne fait plus rien après, je ne trouve pas step3_Con1 dans mon workspace

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    s_Connection1 est de type cell 23 *1

    J'ai regardé cette discussion, comment ferait-on si on remplacait le regexp par un strcmp?

  10. #10
    Invité
    Invité(e)
    Par défaut
    De la même façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idx = find(regexp(T(:,2), 'm'));
    cf: Mon edit du message précédent (qui est confirmé)
    Dernière modification par Invité ; 06/08/2011 à 01h56.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    step4_Con1 = find(regexp(s.Connection_1(:,1),'A[0-9]*'));
    ??? Undefined function or method 'find' for input arguments of type
    'cell'.

    je commence a désesperer

  12. #12
    Invité
    Invité(e)
    Par défaut
    Sauf que contrairement à strcmp, regexp renvoie un tableau de cellules car il peut y avoir plusieurs valeurs de sortie pour chaque chaine de caractères rentrée.
    Donc comme aussi déjà dit dans le même message , il te faut utiliser cellfun par dessus.
    Dernière modification par Invité ; 06/08/2011 à 01h57.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    step4_Con1 = cellfun(@(x) find(regexp(s.Connection_1,'(\d+)')), s.Connection_1, 'UniformOutput',false)
    ??? Undefined function or method 'find' for input arguments of type
    'cell'.
    Je suis perdu, je ne comprend plus

  14. #14
    Invité
    Invité(e)
    Par défaut
    C'est pourtant pas compliqué de suivre l'exemple que je t'ai donné (toujours dans le même message )
    Ici tu n'utilises même plus le x de la fonction anonyme.
    Un exemple concret avec s.Connection_1 = {'1comment2';'marche3 4 regexp5';'6avec7';'8find'}; :
    Premier pas: repérer les indices des expressions voulues avec regexp (sortie = tableau de cellules)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a_comparer = regexp(s.Connection_1,'(\d+)')
    a_comparer = 
     
        [1x2 double] % [ 1     9]
        [1x3 double] % [ 7     9    17]
        [1x2 double] % [1     6]
        [         1]
    Deuxième pas repérer celles qui contiennent un 1. Ne sachant pas trop ce que tu veux, je t'en propose 2:
    Dernière modification par Invité ; 13/04/2013 à 14h35. Motif: correction

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Oui ça marche ça ^^, mais cela me met à quelle place se situe mon resultat de find, je voulais qu'il m'affiche directement ce qu'il trouve moi.
    C'est-à-dire
    '1'  '2'
    '3'  '4'   '5'
    '6'    '7'
    '8'
    Merci pour votre aide et votre patience

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pour cela ce sont les arguments de la fonction regexp qu'il te faut regarder.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/06/2015, 13h59
  2. feval Undefined function or method
    Par statdidos dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/05/2011, 16h56
  3. Réponses: 0
    Dernier message: 31/01/2011, 16h06
  4. [Débutant] Undefined function or method 'plotcontour' for input arguments of type
    Par marionba dans le forum MATLAB
    Réponses: 4
    Dernier message: 28/10/2009, 21h41
  5. Undefined function or method 'syms' for input
    Par hg Georges dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/03/2008, 14h14

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