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 :

Dimensions de matrices et pas [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Dimensions de matrices et pas
    Bonjour,

    Je suis novice sur Matlab et j'ai quelques soucis de calculs.

    j'ai un calcul du type
    x=a*(k/w)*(cos(k(u+i))/cos(ki))*sin(kj-wt)

    Toutes mes lettres représentent des matrices d'une colonne et pleins de lignes (aux alentours de 10^6) sauf u et t qui sont deux variables.
    J'ai attribué un pas de temps à t et un pas de distance à u. Ces deux variables sont donc représentées par des matrices d'une ligne et plusieurs colonnes.

    Tout d'abord je suis obligée de décomposer mon calcul car out of memory (en même temps vu le nombre de données...).

    Mais mon plus gros problème c'est que du coup, mes variables appliques des dimensions de matrices différentes ce qui m'empeche d'appliqué mon calcul.

    Je voudrais faire ce calcul pour chaque temps et distance données.

    J'ai tenté les boucles for mais je ne sais pas si j'utilise la bonne fonction ou si je l'ai mal faite, en tout cas ça n'a pas marché.

    Je ne sais pas si j'ai été assez claire, mais auriez-vous des idées?

    Merci

  2. #2
    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
    Bonjour

    - Remplace tous tes produits et division * et / par les produits /division termes à termes .* et ./
    - Mets tous tes vecteurs avec la même orientation, en transposant les lignes en colonnes ou le contraire (transposé de x <=> x' ; x.' si x est complexe)

    Cela suffit en général à éviter les boucles simples (c'est le principe de calcul vectorisé en matlab). Pour des formules plus ardues, on peut préférer une boucle.

    NB: cela suppose que les valeurs u(n) t(n) x(n) etc coincident. Si tu cherches à croiser tes variables ([u(1) x(1), u(1) x(2), u(2) x(1)...]), utilise meshgrid, comme indiqué par FLB, et fais toutes les opérations vectorialisées sur des matrices plutôt que des vecteurs

  3. #3
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Pour chaque couple (u,t) x est un tableau de 10^6 valeurs?
    Ce petit lien explique comment va évoluer la mémoire de matlab :
    http://matlab.developpez.com/faq/?pa...mation_memoire
    Chaque couple (u,t) prendra 1e6*8/1024/1024 = 7.6Mo de mémoire -> tu as vraiment besoin de tout stocker au préalable?

    Si tu veux parcourir u pour chaque valeur de t (et vice versa), regarde ce que fait la méthode meshgrid.

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour vos réponses,
    VV33D j'ai déjà fait ce que tu me suggères et ça m'a super bien dépanné pour la gestion de la mémoire. Mais cela ne fonctionne pas pour ce problème ci.


    FLB je vais tenter de voir avec meshgrid. Je n'y avais pas pensé merci. Je ne suis pas obligée de tout stocker, je peux très bien regarder chaque ligne indépendament des autres mais in fine il va falloir que je les visualise ensemble. Et comme j'ai des tas de fichier à traiter je me suis dis que c'était peut être la meilleur solution.

    Je vous tiens au courant!

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Alors après quelques vérifications j'ai remarqué que j'avais en effet "oublié" quelques points à mes opérations.
    Du coup je les ai rajouté et tout est nickel, ça marche avec une boucle et pas besoin de faire un meshgrid, à une exception. Il me fixe les variables sur une valeur (alors que je les avais défini avec des pas).

    Par exemple j'ai défini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t=(0:5:40)
    u=(0:1:31)
    for u=u
            for t=t
                 x=a.*(k./w).*(cos(k(u+i))./cos(ki)).*sin(kj-wt)
            end
    end
    et quand mon calcul se termine j'ai une valeur unique:
    t=15
    u=30
    alors que je voudrais voir la variation de chaque ligne de mes tableaux (10^6) avec chaque pas de t et u.

    Est-ce que je me suis trompée quelque part ou bien je fais totalement fausse route?

  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 163
    Points
    53 163
    Par défaut
    Essaie ceci :

    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
    ku = 0;
     
    for u = 0:1:31
     
        ku = ku+1;
        kt = 1;
     
        for t = 0:5:40
     
            x(ku,kt) = a.*(k./w).*(cos(k(u+i))./cos(ki)).*sin(kj-wt);
            kt = kt+1;
     
        end
     
    end
    Par curiosité, tu pourrais nous montrer ce que renvoie ceci à la fin de l'exécution 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)

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Bon je vais remettre mon calcul avec les bons termes car ça commence à devenir difficile de suivre ^^
    Donc je pense avec tes conseils Dut que ça doit donner ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ky=0;
    for x=0
        kx=0;
        for y=0:1:h
            ky=ky+1;
            kt=1;
            for t=0:(Tm/10):Tm
                kt=kt+1;
                u(kx,ky,kt)=a.*((9.81.*k)./omega).*((cosh(k.*(y+h)))./(cosh(k.*h))).*cos((k.*x)-(omega.*t));
            end
        end
    end
    J'ai rajouter kx car je dois le représenter suivant un axe (x,y).
    Mais quand je le lance j'ai un message sur le calcul en lui même:
    Subscript indices must either be real positive integers or logicals.
    Pour ce qui est de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    whos a k omega h kh kx omegat
    ça renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Name            Size              Bytes  Class     Attributes
     
      a          207451x1             1659608  double              
      h               1x1                   8  double              
      k          207451x1             1659608  double              
      kx              1x1                   8  double              
      omega      207451x1             1659608  double

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    matlab te demande des "positive integers" en index, or kx=0, donc demande l'accès à l'index (0,1,2) au premier passage dans la boucle. Remplaces kx = 0 par kx = 1 pour résoudre l'erreur.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui ça règle l'erreur mais le problème de dimension reste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Subscripted assignement dimension mismatch
    J'ai tenté de remplacer directement h par sa valeur mais ça ne fonctionne pas non plus.

  10. #10
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    u(kx,ky,kt)=a.*((9.81.*k)./omega).*((cosh(k.*(y+h)))./(cosh(k.*h))).*cos((k.*x)-(omega.*t));
    Le terme de gauche est de taille 1, tandis que le terme de droit est de taille 207451x1, il n'arrive donc pas à mettre l'un dans l'autre. Si tu veux que chaque u(kx,ky,kt) représente un vecteur de taille 207451x1, écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    u(kx,ky,kt,:)=a.*((9.81.*k)./omega).*((cosh(k.*(y+h)))./(cosh(k.*h))).*cos((k.*x)-(omega.*t));
    Tu obtiens ainsi un tableau à 4 dimensions, dont la 4ème est de taille 207451, et tu accèdes aux données en faisant

  11. #11
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui merci, pas de message d'erreur cette fois-ci.
    Il n'y a que ma mémoire qui explose ^^ du coup ça ne fonctionne pas

  12. #12
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Si tu nous expliques ce que tu comptes faire avec toutes ces données, on trouvera peut être un moyen d'optimiser le code?
    Généralement il est possible de réduire l'utilisation de la mémoire en ne générant que les données utiles à chaque étape d'un traitement - on ne stocke ainsi que le résultat final.
    D'autres solutions sont données dans la faq.

  13. #13
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Oui bien sur
    J'ai des données du type
    Temps
    1
    2
    3
    ...
    200000

    Période
    1
    2
    3
    ...
    200000

    etc...

    J'ai extrait ces données d'un gros fichier de 10 colonnes et 200000lignes.
    J'ai fais des calculs avec ces données ce qui me donne d'autre données du même gabarit.

    Du coup mon gros calcul reprend toutes ces données pour me donner une vitesse orbitale.
    Ce que je vaux faire c'est représenter cette vitesse dans une colonne d'eau (donc à plusieurs profondeurs y) dans un premier temps (donc peut être pour une ligne).
    Mais je veux également les représenter pour chaque instant t (donc pour toutes les lignes) de manière à pouvoir les comparer pour voir les épisodes de tempêtes...

    Je ne sais pas si c'est suffisamment clair...

  14. #14
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'ai trouvé une solution finalement (on m'a BEAUCOUP aidé).
    Ca donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    y=0:1:h
    t=0:(T/10):T
    u=zeros(size(y,2),size(t,2))
    for m=1:size(y,2)
    
    for n=1:size(t,2)
    u(m,n)=a*((9.81.*k)/omega).*((cos(k.*(y(m)+h)))./(cos(k.*h))).*cos((k.*x)-(omega.*t(n))
    end
    end
    L'astuce était de réaliser une matrice à la taille de y et t.

    Merci à tous et bonne continuation!

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

Discussions similaires

  1. Matrice 2 dimensions qui n'est pas accessible
    Par bpascal123 dans le forum Débuter
    Réponses: 3
    Dernier message: 27/03/2010, 12h42
  2. Problème de dimension de matrice après extrapolation
    Par mathylde dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/07/2008, 16h33
  3. Ajouter une dimension à une matrice 2D
    Par AIDA DIANE dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/05/2008, 11h33
  4. problême de dimensions qui ne suivent pas
    Par Plomeg dans le forum OpenGL
    Réponses: 7
    Dernier message: 24/02/2008, 19h22
  5. Réponses: 2
    Dernier message: 24/01/2008, 16h08

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