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 :

Remplacer des boucles for par cellfun


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Remplacer des boucles for par cellfun
    Bonjour chère communauté,
    Je veux remplacer des boucles 'for' dans une fonction par la fonction 'cellfun' dans Matlab:
    Voici ma fonction avec des boucles 'for':
    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
     
    function data_cell = convert_to_cell_for(stacked_data)
        % la fonction recoit un double array de taille [m,n,p] et le transforme
        % en cell array de taille [m,1]. Chaque cell contenant un cell array de
        % taille [p,n]
        [m,~,p]=size(stacked_data);
        % inti output
        data_cell=cell(m,1);
        % iterate over m
        for i=1:m
            mat=[];
            % iterate over p
            for j=1:p
                mat=[mat;stacked_data(i,:,j)];       
            end
            % allocate matrix converted to cell array to each cell in the
            % output
            data_cell{i}=num2cell(mat);
        end
    end


    la fonction reçoit par exemple un double array de taille 2600x128x9 et le convertit en cell array de taille 2600x1. Chaque cell dans la sortie est un cell array contenant une matrice de taille 9x128 (en gros je réorganise selon cette figure)
    La fonction en haut produit la sorite souhaitée mais je voudrais réaliser la même sortie avec 'cellfun' sans utiliser de for loops:


    Merci beaucoup

  2. #2
    Rédacteur/Modérateur

    Essaie ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    s = size(stacked_data);
    data_cell = mat2cell(stacked_data, s(1), s(2), ones(1,s(3)));
    data_cell = squeeze(data_cell);
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et 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
    Futur Membre du Club
    Citation Envoyé par Jerome Briot Voir le message
    Essaie ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    s = size(stacked_data);
    data_cell = mat2cell(stacked_data, s(1), s(2), ones(1,s(3)));
    data_cell = squeeze(data_cell);
    Merci Jérôme pour votre réponse. Je ne veux pas prendre encore de votre temps mais je vous serais reconnaissant si vous m'expliquer votre démarche (je veux comprendre ce que je prends comme code).
    La fonction est-elle par ailleurs réalisable avec cellfun a votre avis ou seulement avec les fonctions que vous avez utilise ci-dessus?
    Merci

  4. #4
    Rédacteur/Modérateur

    Je ne suis pas sûr de bien comprendre ta question.

    Comme ceci ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function data_cell = convert_to_cell(stacked_data)
     
    s = size(stacked_data);
     
    data_cell = mat2cell(stacked_data, s(1), s(2), ones(1,s(3)));
     
    data_cell = squeeze(data_cell);


    La fonction cellfun est inutile ici car elle sert à appliquer une même fonction à toutes les cellules d'un tableau de cellules (cell array)
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et 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
    Futur Membre du Club
    Merci Jérôme. Non je voulais juste savoir comment vous en êtes venu a cette solution. mais j'ai pu lire la documentation et j'ai compris je considère ce post résolu. Merci beaucoup