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 :

Travailler sur 2 matrices de tailles différentes


Sujet :

MATLAB

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut Travailler sur 2 matrices de tailles différentes
    Bonjour,
    Je bloque à nouveau sur un problème, c'est la suite de cette discussion http://www.developpez.net/forums/d10...-matrice-base/

    J'ai mon vecteur time2, de longueur z.
    J'aimerais récupérer dans ma boucle for i=1:z la distance de sortie de tunnel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    deltaD = diff(d1);
    dentrees = find(deltaD>1);
    dsorties = [1; entrees+1];
    dentrees = [entrees; length(d1)];
    dentrees1 = [d1(entrees)];
    dsorties1 = [d1(sorties)];
    Donc dsorties1 est de dimension identique au nombre de sorties de tunnels.

    J'ai bien les valeurs que je veux, mais comment lui dire dans la boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dstunnel(i)=dsorties(??)
    pour qu'à la 1ère sortie de tunnel il me récupère la 1ère valeur, à la 2e sortie, la 2e valeur...

    J'en ai besoin, car dstunnel(i) est utilisé après dans la boucle for pour d'autres calculs.

    Je vous remercie

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ça devient une habitude, mais je n'ai pas compris ce que tu veux obtenir dans ton vecteur dstunnel.
    Ne serai-ce pas simplement dstunnel = dsorties1(i) ?
    dsorties1 qui contient les valeurs de d1 correspondant aux indices des sortie..

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    dstunnel serait un vecteur de la longueur de time2.
    Au final dstunnel sera la longueur totale de l'ensemble de ma structure.
    J'ai oublié de mettre le "1" dans mon message mais je l'avais bien mis dans mon .m
    dsorties 1 contient bien les valeurs de d1 qui correspondent aux sorties de tunnels.

    Par exemple, à la ligne i = 12 478, j'ai ma première sortie de tunnel, et j'aimerais obtenir d3(i)=dsorties(1). Et ce pour toutes mes sorties

  4. #4
    Invité
    Invité(e)
    Par défaut
    Donc si j'ai bien compris, tu veux obtenir le même vecteur dsorties, mais pour times2. Dans ce cas, tu peux le calculer dans la même boucle qui crée time2 avec un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dsorties2(i) = length(times2)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Pas forcement, j'aimerais savoir si c'est possible d'être dans une boucle (par exemple), que mon vecteur qui possède les distances de sorties de tunnel ait une longueur de 7 (7 tunnels par exemple), donc qu'il ait 7composantes uniquement.

    Mes tunnels (par rapport au vecteur time2), sont positionnés aux lignes :
    1-  ligne 769 ---> aller chercher dsorties1(1)
    2- ligne 2574 ---> aller chercher dsorties1(2)
    3- ligne 2987 ---> aller chercher dsorties1(3)
    4- ligne 3684 ---> aller chercher dsorties1(4)
    5- ligne 4258 ---> aller chercher dsorties1(5)
    6- ligne 5004 ---> aller chercher dsorties1(6)
    7- ligne 6214 ---> aller chercher dsorties1(7)
    , et qu'aux lignes où il n'y a pas tunnel, mon programme fasse d'autres calcul indépendant de dsortie1 (donc la boucle for est indispensable ici).

    Merci

    EDIT : quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dsorties1(i)=length(time2);
    il me rajoute uniquement la longueur de time2 en dernière position (donc mon vecteur dsorties1 passe à 8 valeurs...)

  6. #6
    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
    Salut,

    pas sûr d'avoir tout compris, mais il suffit de mettre une condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i=1:65420
        if i==769
            dstunnel(1) = dsorties1(1);
        elsif i==2574
            dstunnel(2) = dsorties1(2);
        elseif ...
                ...
        else
        ... % ici faire d'autres calculs
        end
    end
    non?
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Oui, c'est ça!!
    J'ai déjà une boucle qui a comme condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if deltatemps > 0.1 %présence de tunnel
    .
    Et comme le nombre de tunnels peut varier, leur emplacement également, j'aimerais coder avec des indices, le tout dans une seule boucle if (pour les sorties de tunnels, après j'ai un else pour que Matlab fasse les calculs quand je ne suis pas dans un tunnel

  8. #8
    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
    Et donc quel est le problème? C'est pour l'indice avec dstunnel?

    Tu peux mettre un compteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cpt = 1;
    ...
    if deltatemps > 0.1 %présence de tunnel
    dstunnel(cpt) = dsorties1(cpt);
    cpt = cpt+1;
    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.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Ca n'a pas l'air de fonctionner .
    Nulle part je retrouve les valeurs de dsorties1...
    Quand je ne suis pas dans un tunnel, pour calculer la distance parcourue, j'utilise la formule classique d=d0 + (v0*deltaT)+ (A/2 * deltaT²).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i=1:65...
     
    if deltatemps > 0.1 %présence de tunnel
    dstunnel(cpt) = dsorties1(cpt);
    cpt = cpt+1;
     
     else
    dstunnel(i)=dstunnel(i-1)+v(i-1)*deltaT
    Je ne sais plus où chercher...

  10. #10
    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
    Il faut adapter les indices dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i=1:65...
     
    if deltatemps > 0.1 %présence de tunnel
    dstunnel(i) = dsorties1(cpt);
    cpt = cpt+1;
     
     else
    dstunnel(i)=dstunnel(i-1)+v(i-1)*deltaT
    (dans mon précédent message je croyais à tort que dstunnel n'était modifié que dans la première condition du if)
    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.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Oui c'est ce que j'ai fait.
    En fait, dans l'exemple que je suis en train de simuler, le 1er tunnel est placé à la ligne 1676 (entrée) et 1677 (sorties).
    La distance jusqu'a l'entrée est de 232m (par le calcul je Matlab me donne 220m-erreur de formule possible), et la sortie est à 396m. Là par contre Matlab devrait me donner 396, mais il me donne 644m...

  12. #12
    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
    Quel est le rapport entre les indices et les longueurs que tu évoques?
    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.

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 177
    Points : 46
    Points
    46
    Par défaut
    Je ne sais pas si ça peut aider. Je cherche juste à obtenir les valeurs sortiesA,h et Dist à chaque sortie de tunnel.

    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
    for i=1:length(time2)
     
        deltaT(i)=time2(i)-time2(i-1);
        cpt = 1;
        if deltaT(i)>0.1 %Sortie tunnel
            A2(i)=sortiesA(cpt);
            h2(i)=sortiesh(cpt);
            B2(i)=(A2(i))^2;
            C2(i)=((A2(i)/cste/h2(i));
            Ac(i)=C2(i)*F2(i);
            d3(i)=sortiesDist(cpt);
            cpt = cpt+1;
     
        else %pas tunnel
            A2(i)=A2(i-1)+(deltaT*Ac(i-1));
            B2(i)=(A2(i))^2);
            C2(i)=((A2(i)/cste/h2(i));
            Ac(i)=C2(i)*F2(i);
            d3(i)=d3(i-1)+A2(i-1)*deltaT(i)+1/2*Ac(i-1)*deltaT(i)^2;
     
            if  (C2(i)<=12500) %si C2<=12500, on incrémente pas h2
                A2(i)=A2(i-1)+(pas*Ac(i-1));
                h2(i)=h2(i-1);
                h2(i+1)=h2(i);
                Ac(i)=C2(i)*F2(i);
                d3(i)=d3(i-1)+A2(i-1)*deltaT(i)+1/2*Ac(i-1)*deltaT(i)^2;
     
            elseif  (C2(i)>=12500)&&(h2(i)~=6)
                A2(i)=A2(i-1)+(pas*Ac(i-1));
                h2(i)=h2(i)+1; %incrémentation de h2
                h2(i+1)=h2(i);
                Ac(i)=C2(i)*F2(i);
                d3(i)=d3(i-1)+A2(i-1)*deltaT(i)+1/2*Ac(i-1)*deltaT(i)^2;
     
            elseif (C2(i)>=12500)&&(h2(i)==6)
                h2(i)=h2(i-1);
                h2(i+1)=h2(i);
                A2(i)=A2(i-1); %A n'augmente pas
                A2(i+1)=A2(i);
                Ac(i)=C2(i)*F2(i);
                d3(i)=d3(i-1)+A2(i-1)*deltaT(i)+1/2*Ac(i-1)*deltaT(i)^2;
            end
        end
    end

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

Discussions similaires

  1. Fusionner des matrices de tailles différentes
    Par Marciane dans le forum R
    Réponses: 2
    Dernier message: 23/04/2012, 14h19
  2. Réponses: 3
    Dernier message: 08/12/2009, 19h44
  3. Réponses: 2
    Dernier message: 28/10/2008, 16h18
  4. Réponses: 6
    Dernier message: 15/05/2008, 12h13
  5. Alignement d'un texte sur des écrans de taille différent
    Par Kuchiki Byakuya dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 05/02/2007, 19h07

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