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 :

Lecture "circulaire" fichier Excel


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut Lecture "circulaire" fichier Excel
    Bonjour !

    J'ai un problème de taille des matrices dans mon petit programme, dont en voici les matrices :

    matrice1=59999
    matrice2=59998
    matrice3=59998

    Ces matrices sont obtenues en utilisant un fichier Excel de 60'000 lignes et en faisant des opérations du style :

    ligne3-ligne2
    ligne4-ligne3
    ...

    Ce que je voudrais savoir si est-ce qu'il est possible de dire à Matlab que dès qu'il a atteint la ligne 60'000 du fichier Excel, qu'il fasse ensuite cela :

    ligne60000-ligne59999
    ligne00001-ligne60000

    Est-ce possible simplement ou bien faut-il créer un système de boucle if ?

    Merci d'avance !

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

    Une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    M = 1:60000;
    diff([M M(1)])

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Merci pour l'intérêt à ma question !

    Je sèche pas mal sur ce problème. Concrètement qu'est-ce que votre fonction fait-elle ?

    Voici mon code modifié en ajoutant votre méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    range = 'A1:C60000';
     
    positions = xlsread('test1.xlsx', 'Feuil1', range);
     
    xpos = positions(:, 1);
    ypos = positions(:, 2);
    zpos = positions(:, 3);
     
    distance0=sqrt((diff([xpos xpos(1)]).^2)+(diff([ypos ypos(1)]).^2)+(diff([zpos zpos(1)]).^2));
    Mais il y a un problème de concaténation. En revanche, effectuer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    M = 1:60000;
    dd=diff([M M(1)]);
    length(dd)
    sort bien 60'000 comme longueur de matrice. Comme faire pour appliquer ce principe à la fonction distance0 ? En l'état actuel des chose elle possède 59'999 lignes.

    Merci en tout cas parce que je n'ai personne autour de moi qui aurait la réponse à mon problème

  4. #4
    Invité
    Invité(e)
    Par défaut
    Selon que Variable soit un vecteur colonne ou ligne :
    • [Variable Variable(1)] ou [Variable , Variable(1)] concaténation horizontale.
    • [Variable ; Variable(1)] concaténation verticale

    Voir concaténation.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Magnifique, merci beaucoup !

    Si j'ose abuser j'ai un autre type de formule à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance1=sqrt( ((xpos(3:end)-xpos(2:end-1)).^2) + ((ypos(3:end)-ypos(2:end-1)).^2) + ((zpos(3:end)-ypos(2:end-1)).^2) );
    Ici c'est une sorte de "diff manuel" qui va soustraire la 3ème ligne de la 2ème ligne pour chacune des 3 colonnes (X, Y, Z), mais comment pourrais-je y appliquer le même prinicipe ?

    Après promis ça devrait jouer (j'avais posté le cas le plus simple ici). En fait Matlab est tellement grand que je ne sais pas comment vous faites pour en connaitre la plupart des fonctions. D'accord je ne l'utilise que depuis quelques mois (3environ) mais il y a tellement de fonctions, c'est à s'y perdre...

    Ca m'embête de poster sur un forum parce que j'ai l'impression de "tricher" mais je n'ai jamais eu d'enseignement sur ce logiciel et malgré les 1-2 livres que j'ai lu, j'ai pas tout retenu !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je ne suis pas sûr de saisir ce que tu cherches à faire ici
    Tu parles de soustraction entre la 2ème , et 3ème ligne, ce qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance1=sqrt( ((xpos(3)-xpos(2)).^2) + ((ypos(3)-ypos(2)).^2) + ((zpos(3)-ypos(2)).^2) );
    mais cela ne correspond pas vraiment au code que tu présentes

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Je viens de tester votre code et effectivement le résultat est le même que celui que j'ai obtenu. Effectivement mon but est de soustraire dans le tableau de 60'000lignes que j'ai :

    ligne3-ligne2
    ligne4-ligne3
    ...
    ligne60'000-ligne59'999

    Mais cela va sortir une matrice de résultat de 59'998 lignes et j'aimerais que pour les lignes manquante pour atteindre 60'000, qu'il fasse ceci :

    ligne1-ligne60'000
    ligne2-ligne1

    Comme ça la boucle est bouclée !

    Je ne sais pas si c'est plus clair ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu as déjà donné la ligne qui faisait cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance0=sqrt((diff([xpos xpos(1)]).^2)+(diff([ypos ypos(1)]).^2)+(diff([zpos zpos(1)]).^2));
    il suffit d'introduire un ; puisque comme tu me l'as dit, ce sont des vecteurs lignes.

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Oui ça j'avais réussi, mais cette formule "distance0" fonctionne quand j'ai besoin de faire par exemple :

    ligne2-ligne1
    ligne3-ligne2
    ligne4-ligne3
    ...

    Et la formule que j'ai posté ayant le nom "distance1" s'occupe de faire :

    ligne3-ligne2
    ligne4-ligne3
    ligne5-ligne4
    ...

    J'ai encore une autre formule "distance2" fonctionnant sur le même principe que "distance1" qui fait :

    ligne3-ligne1
    ligne4-ligne2
    ligne5-ligne3
    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance2=sqrt(((xpos(3:end)-xpos(1:end-2)).^2)+((ypos(3:end)-ypos(1:end-2)).^2)+((zpos(3:end)-ypos(1:end-2)).^2));
    Je m'excuse d'être lent à comprendre, mais pour ces formules "distance1" et "distance2", comment appliquer le principe utilisé pour la formule "distance0" (qui maintenant fonctionne, bien sûr en ajoutant ; car ce sont des vecteurs verticaux).

    Il faut que ces 3 matrices (distance0, distance1 et distance2) aient le même nombre de lignes (actuellement c'est 59'999, 59'998, 59'998) et avec votre aide j'ai pu passer la première à 60'000, reste les 2 autres !


  10. #10
    Invité
    Invité(e)
    Par défaut
    Et tu mets quoi à la fin de
    ligne3-ligne2
    ligne4-ligne3
    ligne5-ligne4
    ...
    ???
    pour rester à 60 000 lignes ?
    Tu sais que le résultat sera le même ? À ceci près que les résultats seront décalés

    De même
    ligne3-ligne1
    ligne4-ligne2
    ligne5-ligne3
    ...
    ???
    De toute façon le principe reste le même : tu concatènes les valeurs à rajouter.

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Alors si je laisse faire mon code tel quel, il va faire (pour "distance1) :

    ligne3-ligne2
    ligne4-ligne3
    ligne5-ligne4
    ...
    ligne59999-ligne59998
    ligne60000-ligne59999

    Du coup il va manquer 2 lignes par rapport à mon fichier de base de 60'000lignes. J'aimerais faire en sorte que "distance1" utilise les 2 lignes supplémentaires suivantes pour arriver à 60'000 lignes aussi :

    ligne1-ligne60000
    ligne2-ligne1

    Du coup la boucle est bouclée !

    Pour "distance2" :

    ligne3-ligne1
    ligne4-ligne2
    ligne5-ligne3
    ...
    ligne59999-ligne59997
    ligne60000-ligne59998

    Pareil, il va manquer 2 lignes qui sont :

    ligne1-ligne59999
    ligne2-ligne60000

    Comment faire pour rajouter ces lignes à ces 2 codes afin de faire en sorte que "distance0", "distance1" et "distance2" aient le même nombre de lignes ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'est donc bien ce que je disais : distance1 a le même résultat que distance0 décalé de 1 :
    distance0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    distance0=sqrt(diff([xpos ; xpos(1)]).^2 + diff([ypos ; ypos(1)]).^2 + diff([zpos ; zpos(1)]).^2);
    ligne2-ligne1
    ligne3-ligne2
    ligne4-ligne3
    ligne5-ligne4
    ...
    ligne60000-ligne59999
    ligne1-ligne60000
    distance1 : distance1 = [distance0(2:end) ; distance0(1)];
    ligne3-ligne2
    ligne4-ligne3
    ligne5-ligne4
    ...
    ligne60000-ligne59999
    ligne1-ligne60000
    ligne2-ligne1
    distance2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    distance2=sqrt(...
        ([xpos(3:end) ; xpos(1:2)] - xpos).^2 + ...
        ([ypos(3:end) ; ypos(1:2)] - ypos).^2 + ...
        ([zpos(3:end) ; zpos(1:2)] - zpos).^2 ...
    );
    ligne3-ligne1
    ligne4-ligne2
    ligne5-ligne3
    ...
    ligne59999-ligne59997
    ligne60000-ligne59998
    ligne1-ligne59999
    ligne2-ligne60000
    Dernière modification par Invité ; 13/06/2012 à 15h14.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Merci bien cela a l'air de fonctionner ! Malheureusement lorsque je veux appliquer la formule suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alpha=acos(((distance1.^2)+(distance0.^2)-(distance2.^2))/(2*distance1.*distance0));
    j'ai une autre erreur, qui va impliquer que je fasse autrement je pense :

    Error using \
    Out of memory. Type HELP MEMORY for your options.
    
    Error in test_v2 (line 34)
    alpha=acos(((distance1.^2)+(distance0.^2)-(distance2.^2))/(2*distance1.*distance0));
    Même sur un PC avec 8GB de RAM j'ai cette erreur donc je pense que je vais devoir prendre moins de points en considération (30'000 par exemple ?)

  14. #14
    Invité
    Invité(e)
    Par défaut
    Et si tu cherchais à obtenir un vecteur 60000x1 et non une matrice 60000x60000 ?

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Je ne comprends pas bien où je peux avoir cette matrice 60'000x60'000 qui effectivement poserait problème pour la mémoire. "distance0", "distance1" et "distance2" sont des matrices de la forme 60000x1. C'est au niveau de la division que se pose le problème il me semble.

    J'ai remplacé "/" par "\" mais du coup j'obtiens une matrice 1x1 ce qui est bien sûr faux ! Encore une fois, navré pour ces questions et problèmes qui semblent élémentaires, mais j'apprends !

  16. #16
    Invité
    Invité(e)
    Par défaut
    Selon toi quelle partie de cette ligne pourrait engendrer une matrice au lieu d'un vecteur ?
    Pense à l'appliquer sur un plus petit exemple.
    Pour t'aider : Matrix dimensions must agree.

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 21
    Points
    21
    Par défaut
    Ca joue j'ai pu résoudre mon problème, merci !

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

Discussions similaires

  1. lecture/ecriture dans un fichier excel
    Par developpeur82 dans le forum Documents
    Réponses: 13
    Dernier message: 02/12/2008, 14h44
  2. [Lazarus] Lecture et écriture de fichier Excel
    Par Vazily dans le forum Lazarus
    Réponses: 3
    Dernier message: 19/04/2008, 16h10

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