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 :

Sommation de matrice


Sujet :

MATLAB

  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut Sommation de matrice
    Bonjour à tous, j'ai une question très simple.

    J'effectue le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    superposition_seuillage = zeros(size(img_rad));
    for i = 1:length(seuillage_pondere)
        superposition_seuillage = superposition_seuillage + seuillage_pondere{i};
    end
    img_rad est une matrice de taille 500x215.
    Seuillage pondéré est une variable de type cellule, pouvant contenir entre 5 et 100 matrices. Je ne connais pas sa taille par avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    seuillage_pondere = 
     
        [500x215 double]
        [500x215 double]
        [500x215 double]
        [500x215 double]
        [500x215 double]
        [500x215 double]
        [500x215 double]
    Je me demandais simplement si je pouvais effectuer cette somme plus rapidement (en temps de calcul, pas en ligne de code) qu'en passant par une boucle et si oui, quelle est la méthode à utiliser?
    PS: quand je veux dire plus rapide, c'est au centième de seconde près, donc même si vous ne savez pas si telle méthode est plus rapide, voyez un autre moyen d'effectuer cette somme de matrice?

    En vous remerciant!
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Points : 242
    Points
    242
    Par défaut
    je sais pas si c'est plus rapide, mais tu peux tester ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    seuill = [seuillage_pondere{:}]
    seuill = reshape(seuill,500,215,length(seuillage_pondere))
    seuill_somme = sum(seuill,3);
    superposition_seuillage = superposition_seuillage + seuill_somme;

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour Dombrai,

    Merci pour la réponse, d'autant plus que c'est effectivement plus rapide qu'une boucle for. Pour ceux que cela intéresse je passe, pour une somme de 7 éléments, je passe de 0.011 secondes en moyenne avec ma boucle à 0.0065 avec la méthode de Dombrai. Je vais jeter un œil pour des sommes d'un plus grand nombres d'éléments, afin de voir si cette tendance s'accentue.

    Je ne mets pas le sujet comme résolu, car quelqu'un a peut-être une autre méthode à proposer!
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Vu que tu pars d'une matrice nulle, ceci devrait être un poil plus rapide, (c'est la même solution sans lignes superflues)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    superposition_seuillage = sum(reshape([seuillage_pondere{:}],500,215,length(seuillage_pondere)),3);
    Cela dit attention, ces méthodes vectorisés sont certes plus rapides, mais toucheront la limite mémoire plus vite que les boucles (car création du 3d-array)

    Peut etre le reshape sur chaque élément via cellfun, puis un cat( ...,3) serait plus rapide (à essayer mais je n'y crois pas trop) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    seuillage_pondere= cellfun(@(x) reshape(x,500,215,1),seuillage_pondere,'uni',0);
    seuillage_pondere= cat(seuillage_pondere{:},3);
    superposition_seuillage = superposition_seuillage  + squeeze(sum(seuillage_pondere,3));

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour VV33D,

    J'ai également essayé ta méthode et son temps d’exécution est sensiblement le même que la méthode proposé par Dombrai; c'est à dire plus rapide que ma boucle for. Je vous remercie pour ces alternatives, j'avais également pensé à utiliser la fonction sum mais je n'avais pas réussi à l'appliquer dans ce cas... ( matrices dans tableau de cellules).

    J'ai l'intuition qu'il n'existe pas de méthode plus rapide pour cette sommation, je laisse cependant le sujet ouvert car il se peut que je me trompe, et j'aurai peut être également bientôt une autre question similaire que celle posée dans ce sujet.

    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  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
    Pour ma part, je n'aurais pas utilisé un tableau de cellules, mais directement un tableau MxNxP.
    Un tableau de dimension 500x125 demande 0.8 Mo de mémoire (en Double). Il faut donc environ 80 Mo pour stocker 100 de ces tableaux. C'est ridicule sur les machines modernes où la quantité de RAM se compte en Go.

    Sinon, je préfère toujours faire un comparatif des méthodes proposées avant de me prononcer :

    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
    clc
    clear all
     
    u = 1;
     
    for N = 10:10:100;
     
        for n = 1:N
            tmp = rand(500, 215);
            seuillage_pondere{n} = tmp;
            seuillage_pondere_Dut(:,:,n) = tmp;
        end    
     
        whos seuillage_pondere seuillage_pondere_Dut
     
        for k = 1:10
     
            % Gooby
            tic
            superposition_seuillage = zeros(500, 215);
            for i = 1:numel(seuillage_pondere)
                superposition_seuillage = superposition_seuillage + seuillage_pondere{i};
            end
            t(k,1) = toc;
     
            S{1} = superposition_seuillage;
     
            clear superposition_seuillage
     
            % Dombrai
            tic
            seuill = [seuillage_pondere{:}];
            seuill = reshape(seuill,500,215,numel(seuillage_pondere));
            superposition_seuillage = sum(seuill,3);
            t(k,2) = toc;
     
            S{2} = superposition_seuillage;
     
            clear superposition_seuillage seuill        
     
            % VV33D
            tic
            superposition_seuillage = sum(reshape([seuillage_pondere{:}],500,215,numel(seuillage_pondere)),3);
            t(k,3) = toc;
     
            S{3} = superposition_seuillage;
     
            clear superposition_seuillage
     
            %Dut        
            tic
            superposition_seuillage = sum(seuillage_pondere_Dut, 3);
            t(k,4) = toc;
     
            S{4} = superposition_seuillage;
     
            clear superposition_seuillage
     
        end   
     
        flag = all(S{1}(:)==S{2}(:)) && all(S{1}(:)==S{3}(:)) && all(S{1}(:)==S{4}(:));
     
        if flag
            T(u,:) = mean(t);        
        else
            T(u,:) = NaN;
        end
     
        u = u+1;
     
        clear seuillage_pondere seuillage_pondere_Dut
        clear functions
     
    end
     
    figure
     
    p = plot(10:10:100,T);
     
    legend(p, {'Gooby (for)' 'Dombrai (cat+reshape)' 'VV33D (one-liner)', 'Dut (MxNxP)'}, ...
        'location', 'northwest')
     
    xlabel('Nombre de cellules [500,215]')
    ylabel('Temps (s)')
    J'espère ne pas avoir faire d'erreur…

    Ma machine est équipée d'un processeur Intel Core i7-3770K (3.50GHz) et de 16 Go de RAM. Code exécuté avec MATLAB R2014a

    N'hésitez pas à faire tourner ce code sur vos machines et à nous faire un retour. Postez juste les valeur de T si vous ne voulez pas vous embêter avec la capture du graphique. Pensez à nous donner les caractéristiques (CPU, RAM, version de MATLAB)
    Images attachées Images attachées  
    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
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Nom : comparaison_methodes.JPG
Affichages : 130
Taille : 38,5 Ko

    MATLAB R2013a

    IntelCore2 Quad CPU Q6950 3GHz
    3.25Go de RAM

    PS: j'avais comparé les méthodes directement dans mon script de base et en l’occurrence ma méthode était la plus lente.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

Discussions similaires

  1. Besoin d'aide table des sommations ( matrices sur python)
    Par younes789 dans le forum Général Python
    Réponses: 3
    Dernier message: 01/12/2014, 17h08
  2. [Débutant] sommation dans une matrice
    Par lFantasyz dans le forum MATLAB
    Réponses: 4
    Dernier message: 27/12/2013, 01h06
  3. sommation de n colonne d'une matrice
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/02/2013, 15h28
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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