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 :

Copies temporaires de tableaux


Sujet :

MATLAB

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Copies temporaires de tableaux
    Bonjour,

    je me pose une question à propos de matlab concernant le passage des tableaux en paramètre de fonctions : des copies temporaires sont-elles faites?

    Par exemple, si j'ai une fonction toto prenant en argument un tableau et que je fais l'appelle toto(array(1:2)), est-ce qu'une copie de array(1:2) est stockée localement quelque part?

    Merci pour votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 69
    Points
    69
    Par défaut
    Je pense que la réponse est oui.

    Dans ta fonction tu travailleras sur une copie locale du tableau. D'ailleurs si tu utilise le "débuggeur" tu verras que quand tu passes dans une fonction, tu as un workspace local composé seulement des variables utilisé par la fonction.

    D'ailleurs une simple fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [b]=addone(b);
    b=b+1;
    end
    Si tu l'apelles avec H2=addone(H), H ne changeras pas.

    Je sais pas si c'est ce que tu voulais savoir.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Merci pour ta réponse.
    Oui, c'est bien cela qui m'intéresse.
    En fait, je sais que si je modifie localement la variable, il y a copie locale mais je me demandais ce qui se passait lorsque je ne modifie rien... mais bon il ne faut pas trop rêver c'est du script.
    Est-ce qu'il y a une technique pour éviter ces copies parce que je dois manipuler des tableaux relativement volumineux et je ne pas me permettre de faire de telles copies?

  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 : 52 882
    Points
    52 882
    Par défaut
    Je me permets d'essayer de faire une réponse plus générale... en essayant de faire court quand même et sans dire trop de bêtises

    Prenons le cas d'une variable X de 100 Mo.

    Tout d'abord ce script :

    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
    clear all
     
    user = memory;
    M(1) = round(user.MemUsedMATLAB/1024/1024);
     
    X = rand(1,13107200);
     
    user = memory;
    M(2) = round(user.MemUsedMATLAB/1024/1024);
     
    Y = X;
     
    user = memory;
    M(3) = round(user.MemUsedMATLAB/1024/1024);
     
    Y(1) = 2;
     
    user = memory;
    M(4) = round(user.MemUsedMATLAB/1024/1024);
     
    clc
     
    fprintf('Memoire utilisee par MATLAB au depart : %d Mo\n',M(1));
    fprintf('Memoire utilisee par MATLAB en creant X de taille 100 Mo : %d Mo\n',M(2));
    fprintf('Memoire utilisee par MATLAB en creant Y ( Y = X) : %d Mo\n',M(3));
    fprintf('Memoire utilisee par MATLAB en modifiant Y ( Y(1) = 2) : %d Mo\n',M(4));
    renvoie sur ma machine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Memoire utilisee par MATLAB au depart : 345 Mo
    Memoire utilisee par MATLAB en creant X de taille 100 Mo : 445 Mo
    Memoire utilisee par MATLAB en creant Y ( Y = X) : 445 Mo
    Memoire utilisee par MATLAB en modifiant Y ( Y(1) = 2) : 545 Mo
    Tant que la copie n'est pas modifiée, la quantité de mémoire n'est pas augmentée

    En utilisant des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function m = test(Y)
     
    user = memory;
    m = round(user.MemUsedMATLAB/1024/1024);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function m = test2(Y)
     
    Y(1) = 2;
    user = memory;
    m = round(user.MemUsedMATLAB/1024/1024);
    On lance le script suivant :
    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
    clear all
     
    user = memory;
    M(1) = round(user.MemUsedMATLAB/1024/1024);
     
    X = rand(1,13107200);
     
    user = memory;
    M(2) = round(user.MemUsedMATLAB/1024/1024);
     
    M(3) = test(X);
     
    M(4) = test2(X);
     
    clc
     
    fprintf('Memoire utilisee par MATLAB au depart : %d Mo\n',M(1));
    fprintf('Memoire utilisee par MATLAB en creant X de taille 100 Mo : %d Mo\n',M(2));
    fprintf('Memoire utilisee par MATLAB en exécutant la fonction test : %d Mo\n',M(3));
    fprintf('Memoire utilisee par MATLAB en modifiant la fonction test2 : %d Mo\n',M(4));
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Memoire utilisee par MATLAB au depart : 345 Mo
    Memoire utilisee par MATLAB en creant X de taille 100 Mo : 445 Mo
    Memoire utilisee par MATLAB en exécutant la fonction test : 445 Mo
    Memoire utilisee par MATLAB en modifiant la fonction test2 : 545 Mo
    Pareil que précédemment

    Maintenant, si on passe une partie seulement de X :
    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
    clear all
     
    user = memory;
    M(1) = round(user.MemUsedMATLAB/1024/1024);
     
    X = rand(1,13107200);
     
    user = memory;
    M(2) = round(user.MemUsedMATLAB/1024/1024);
     
    M(3) = test(X(1:2:end));
     
    M(4) = test2(X(1:2:end));
     
    clc
     
    fprintf('Memoire utilisee par MATLAB au depart : %d Mo\n',M(1));
    fprintf('Memoire utilisee par MATLAB en creant X de taille 100 Mo : %d Mo\n',M(2));
    fprintf('Memoire utilisee par MATLAB en exécutant la fonction test : %d Mo\n',M(3));
    fprintf('Memoire utilisee par MATLAB en modifiant la fonction test2 : %d Mo\n',M(4));
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Memoire utilisee par MATLAB au depart : 345 Mo
    Memoire utilisee par MATLAB en creant X de taille 100 Mo : 445 Mo
    Memoire utilisee par MATLAB en exécutant la fonction test : 495 Mo
    Memoire utilisee par MATLAB en modifiant la fonction test2 : 545 Mo
    Il existe donc bien un tableau "temporaire" X(1:2:end)

    Donc si tu ne modifies pas le tableau, mieux vaut le passer en entier.

    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
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    merci beaucoup pour ta réponse et les codes qui vont me permettre de vérifier ce qui se passe en mémoire. Ca répond complètement à ma question donc je passe en résolu.

    Encore merci à vous deux!

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

Discussions similaires

  1. Surcharge operator+ sans copie temporaire
    Par ketchupi dans le forum Débuter
    Réponses: 3
    Dernier message: 19/07/2013, 17h41
  2. parcourir des tableaux pour faire des copies/renommages de fichiers
    Par Paloma dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 31/10/2006, 09h09
  3. [Tableaux] Probleme de copie de donnees entre 2 tables
    Par newbiestef dans le forum Langage
    Réponses: 8
    Dernier message: 25/10/2006, 15h06
  4. [Tableaux] Enregistrer des tableaux temporairement
    Par ALPAX dans le forum Langage
    Réponses: 3
    Dernier message: 21/09/2006, 15h27
  5. D7 - Copy et tableaux dynamiques
    Par RamDevTeam dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2005, 13h46

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