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 :

Simplification de mon code?


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut Simplification de mon code?
    Bonsoir,

    J'aurais besoin de simplifier mon code pour gagner en temps d'exécution, mais je ne sais pas si la méthode que j'ai choisi est la bonne.

    Voici la partie de code que j'ai a simplifier:

    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
     
        for y=1:yOrdinateMax
            for x=1:xAbscissaMax
                %perform the rotation by using the Rotation array
                ReslutMatrix=([a0 a1; b0 b1])*([x;y])+([a2;b2]);
                NewAbscissaX=ceil(ReslutMatrix(1));
                NewOrdinateY=ceil(ReslutMatrix(2)); 
     
                %Define the smallest Y and the Smallest X
                if ((NewAbscissaX<SmallestAbscissaX)&&(NewOrdinateY<SmallestOrdinateY))
                    SmallestAbscissaX=NewAbscissaX;
                elseif ((NewAbscissaX<SmallestAbscissaX))
                    SmallestAbscissaX=NewAbscissaX;
                elseif ((NewOrdinateY<SmallestOrdinateY))
                    SmallestOrdinateY=NewOrdinateY;
                end
            end
        end
    Je pensais utiliser la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    y=1:yOrdinateMax;
    x=1:xAbscissaMax;
    ReslutMatrix=([a0 a1; b0 b1]).*([x;y])+([a2;b2]);
    Et utiliser la fonction min pour trouver le smallest Ordinate Y et X.
    Mais déja la première partie ne fonctionne.
    Voici le message d'erreur que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Error using ==> vertcat
    All rows in the bracketed expression must have the same 
    number of columns.
    
    Error in ==> RotateImage12 at 44
    ReslutMatrix=([a0 a1; b0 b1])*([x;y]);%+([a2;b2]);
    Merci beaucoup pour votre aide.
    Thomas

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Bonjour,

    la solution devrait ressembler à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    y=1:yOrdinateMax;
    x=1:xAbscissaMax;
     
    [X,Y]=meshgrid(x,y);
     
    ResultMatrix=[a(1) a(2); b(1) b(2)]*[X(:) Y(:)]';
    ResultMatrix(1,:)=ResultMatrix(1,:)+a(3);
    ResultMatrix(2,:)=ResultMatrix(2,:)+b(3);
     
    SmallestAbscissaX=min(ceil(ResultMatrix(1,:)))
    SmallestOrdinateY=min(ceil(ResultMatrix(2,:)))
    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)

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Ca fonctionne nickel merci.
    Mais il y a des trucs que j'ai pas bien compris. Par exemple, pourquoi tu fais comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        ResultMatrix=[a0 a1; b0 b1]*[X( : ) Y( : )]';
        ResultMatrix(1,:)=ResultMatrix(1,: )+a2;
        ResultMatrix(2,:)=ResultMatrix(2,: )+b2;
    Pourquoi est-ce que tu fais la transposée de [X( : ) Y( : )]'?
    J'ai aussi un peu de mal a comprendre les notations comme ResultMatrix(1,: ) ou Y( : ), pourrais-tu me les expliquer?

    Désolé pour ces questions de base, mais je suis en train d'apprendre a programmer seul a partir du C, et j'ai bcp de mal a comprendre cette logique.
    Et comme j'ai une dizaine de loop dans mon programme, je pense qu'avec cette méthode, ca devrait etre possible de simplifier grandement mon programmer et donc de gagner en execution time.

    J'espère etre capable d'appliquer cette méthode pour le reste de mon soft.

    Est ce qu'il est aussi possible avec cette méthode d'enlever les loop contenant des conditions, comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        for x=1:AbscissaSecondImage
            for y=1:OrdinateSecondImage
                if (Image(y,x)>0)
                    NewRotatedImage(y+YRotationCenter,x+XRotationCenter)=Image(y,x);
                end
            end
        end
    Dans ce cas la je pense pas que ce soit faisable non?

    Merci beaucoup et désolé pour toutes ces questions, mais c'est très important.
    Thomas

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, totoc 1001 je trouve un peu contradictoire ce que tu dis : tu veux diminuer les temps de calcul et tu réécris ton code de C en Matlab. Même si tout le monde ne partage pas mon avis, je trouve que le C est bien plus rapide que matlab donc reste en C.

    Pour revenir à ta question :

    Est ce qu'il est aussi possible avec cette méthode d'enlever les loop contenant des conditions, comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for x=1:AbscissaSecondImage
      for y=1:OrdinateSecondImage
       if (Image(y,x)>0)
        NewRotatedImage(y+YRotationCenter,x+XRotationCenter)=Image(y,x); end end end
    oui c'est possible. utilise la fonction find. ==> help find Essaye qqch du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x=1:AbscissaSecondImage;
    y=1:OrdinateSecondImage;
    [r,c,v]=find(Image(x,y)>0);

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Non en fait j'ai du écrire un soft en matlab dans un délai assez court, et ne connaissant pas matlab du tout, j'ai utilisé la syntaxe du C avec beaucoup de loop. Mais en Matlab, les boucles sont extrèmement lentes, donc maintenant que le soft fonctionne j'essaye de l'updater en améliorant le temps d'exécution.

    Je vias essayer avec la fonction find, si ca marche c'est super cool.

    MErci en tout cas;
    Thomas

  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 304
    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 304
    Points : 52 886
    Points
    52 886
    Par défaut
    Citation Envoyé par salseropom
    Même si tout le monde ne partage pas mon avis, je trouve que le C est bien plus rapide que matlab donc reste en C.
    Bonjour,

    à lire à ce sujet :

    http://newsreader.mathworks.com/WebX...sA0N3@.ef4bf6b
    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
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 99
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par salseropom
    for x=1:AbscissaSecondImage
    for y=1:OrdinateSecondImage
    if (Image(y,x)>0)
    NewRotatedImage(y+YRotationCenter,x+XRotationCenter)=Image(y,x); end end end

    oui c'est possible. utilise la fonction find. ==> help find Essaye qqch du genre

    x=1:AbscissaSecondImage;
    y=1:OrdinateSecondImage;
    [r,c,v]=find(Image(x,y)>0);
    Salut, désolé de revenir a la charge, mais impossible de copier l'image dans la nouvelle image.
    avec la fonction find, je trouve bien les intensités positives de mon image, mais je n'arrive pas a ne copier que ces valeur dans ma nouvelle image de façon a ce que celle-ci ne contienne uniquement que les intensités positives.

    J'aurais encore besoin d'aide.
    Please.
    Merci d'avance

Discussions similaires

  1. [HTML/PHP] Simplification de mon code
    Par Calvein dans le forum Langage
    Réponses: 2
    Dernier message: 20/10/2008, 17h56
  2. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  3. [VBA-E] Aide pour simplification de mon code.
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/05/2006, 11h34
  4. Réponses: 1
    Dernier message: 21/02/2005, 12h40
  5. [langage] algo de bissection dans mon code
    Par killy dans le forum Langage
    Réponses: 5
    Dernier message: 19/01/2004, 18h35

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