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 :

Création d'une matrice spéciale


Sujet :

MATLAB

  1. #1
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut Création d'une matrice spéciale
    Bonjour,
    J'ai du mal pour construire, de façon évolutive, les matrices de dimension n suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M=[1 2;2 3]; % pour n=2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M=[1 2 4;2 3 5;4 5 6]; % pour n=3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M=[1 2 4 6;2 3 5 8;4 5 7 9;6 8 9 10]; % pour n=4
    ...
    indication : j'ai voulu utiliser la matrice suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    n=1:N;
    for m=1:N
        M(m,n) = sqrt((n-1).^2 + (m-1)^2);
     
    end
    M
    J'obtiens le même ordre mais pas les mêmes valeurs pour les éléments de la matrice.... je ne sais pas comment faire !!
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    J'avoue ne pas bien voir l'objectif.

    Pars-tu d'une formule mathématique au départ ?
    Comment se construisent tes matrices ?

    Ca n'a pas l'air d'un problème MATLAB mais plutôt d'un problème mathématique.

    Et je n'ai pas MATLAB sous la main mais la formule que tu utilises me parait bizarre => que te donne-t-elle exactement ?

  3. #3
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    en fait, imaginons une grille rectangulaire de points. La fonction calcule la distance séparant chaque élément de cette grille a un point de référence.
    Comme tu peux le remarquer dans les trois premier cas (n=2, 3 et 4), si deux élément de la matrice sont égaux ca veut dire que ces élément sont à égale distance de l'origine (premier élément de la matrice M(1,1))

  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 305
    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 305
    Points : 52 884
    Points
    52 884
    Par défaut
    Pourrais-tu développer le calcul pour n=2 et n=3 ?

    Parce que je suis comme Caro, je vois mal comment tu obtiens chaque élément de la matrice

  5. #5
    Membre du Club Avatar de legreg2
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 61
    Points : 68
    Points
    68
    Par défaut Coucou
    Je crois avoir compris sa matrice,
    j'ai écris un bout de code :

    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
    45
    46
    47
     
    function res=ma(n)
     
    %n : taille de ta matrice
     
     
    res=zeros(n);
     
    co=linspace(1,(n^2-n)/2+n,(n^2-n)/2+n);
     
    k=1;
     
    n1=n;
    if n1/2==ceil(n1/2)
        com1=[linspace(0,floor(n1/2)-1,floor(n1/2)),linspace(floor(n1/2)-1,0,floor(n1/2))]
    else
        com1=[linspace(0,floor(n1/2)-1,floor(n1/2)),floor(n1/2),linspace(floor(n1/2)-1,0,floor(n1/2))]
    end
     
    n2=n-1;
    if n2/2==ceil(n2/2)
        com2=[linspace(0,floor(n2/2)-1,floor(n2/2)),linspace(floor(n2/2)-1,0,floor(n2/2))]
    else
        com2=[linspace(0,floor(n2/2)-1,floor(n2/2)),floor(n2/2),linspace(floor(n2/2)-1,0,floor(n2/2))]
    end
     
     
    for l=1:n-1
        res(l,l)=co(k);
        k=k+1;
        for cot=1:com1(l)
            res(l-cot,l+cot)=co(k);
            res(l+cot,l-cot)=co(k);
            k=k+1;
        end
        res(l+1,l)=co(k);
        res(l,l+1)=co(k);
        k=k+1;
        for cot=1:com2(l)
            res(l+1+cot,l-cot)=co(k);
            res(l-cot,l+1+cot)=co(k);
            k=k+1;
        end
    end
     
     
    res(n,n)=co(end);

    Bon, je sais, c'est un peu bourrin, mais ça marche...

    Ca vous aidera peut-être à comprendre...

    Greg

  6. #6
    Membre du Club Avatar de legreg2
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 61
    Points : 68
    Points
    68
    Par défaut
    En fait, il faut remplir diagonale par diagonale en commençant par le (ou les ) termes du milieu, si j'ai bien compris...

    Désolé pour le code, il n'y a pas beaucoup de commentaires...

    Ce truc m'a intrigué car j'ai développé quelque chose de semblable, il n'y a pas longtemps (mais plutôt style matrice Toeplitz)...

    Greg

  7. #7
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    merci legreg2 pour ta reponse.
    Tu n'es pas loin de la solution, en fait si tu regarde la matrice M = ma(5) tu va constater la contradiction suivante :
    [M(3,3)=7et M(1,3)=M(3,1)=6] alors qu'on doit avoir l'inverse [M(3,3)=6 et M(1,3)=M(3,1)=7]

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Chapeau à legreg2 pour avoir compris mais ceci dit il n'y a toujours pas d'énoncé clair du problème...
    ça faisait longtemps (la prépa que c'est loin...) que je n'avais pas fait travailler mes neurones comme ça, mais je ne vois toujours pas la logique de la chose.
    J'ai bien compris l'histoire des distances mais si tu ne donnes pas la façon dont est calculée cette distance je ne vois pas comment faire.

    C'est bien de dire qu'il y a une contradiction mais il faut expliquer pourquoi.

    Donc ce que moi j'aimerais bien savoir c'est : quel est l'énoncé exact du problème ?
    Parce que quand même ça m'intrigue.

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 305
    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 305
    Points : 52 884
    Points
    52 884
    Par défaut
    Voila ce que je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function x=mama(n)
     
    [x,y]=meshgrid(1:n);
     
    x=sqrt(x.^2+y.^2);
     
    [inutile,inutile,x(:)]=unique(x(:));
    La solution que je donne semble correcte pour n=2,3,4. Maintenant comme l'a dit Caro, sans énoncé clair, on peut difficilement donner plus d'aide.

    Au fait, elle porte un nom cette matrice ? ça nous mettrait peut être sur la piste

  10. #10
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    la matrice de distance est donnée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    n=1:N;
    for m=1:N
        M(m,n) = sqrt((n-1).^2 + (m-1)^2);
     
    end
    M
    ce qui donne pour N=5,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    M =
              0    1.0000    2.0000    3.0000    4.0000
        1.0000    1.4142    2.2361    3.1623    4.1231
        2.0000    2.2361    2.8284    3.6056    4.4721
        3.0000    3.1623    3.6056    4.2426    5.0000
        4.0000    4.1231    4.4721    5.0000    5.6569
    l'objectif c'est de construire une matrice "d'indice par ordre croissant" cad :
    0<1.0000<1.4142<2.0000<2.2361<2.8284<....<5.0000<5.6569 donc je veux un 1 à la place de 0 et et 2 a la place des 1.0000 et un 2 a la place de 1.4142 .... et c'est pour que le M(2,2) qui doit prendre la valeur 6
    Je pense que c'est clair mnt ?
    merci pour votre contributions

  11. #11
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut [Résolu] Création d'une matrice spéciale
    Bonjour à tous,
    Enfin j'ai réussi à résoudre mon problème.
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Dout = distance_index(N)
    n=1:N;
    for m=1:N
        Din(m,n) = sqrt((n-1).^2 + (m-1)^2);
    end
    [ind1,in2,ind3] = unique(Din(1:N*N));
    Dout = reshape(ind3,N,N);
    Merci à vous tous, et j'espère que ce code sera utile pour les autres.
    P.S. - merci à Dut, la fonction unique que tu as utilisé dans ton code m'a bcp aidé (je ne la connaissais pas).
    - Désolé je ne sais pas comment faire pour indiquer que ce problème est résolu

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par nant44 Voir le message
    Désolé je ne sais pas comment faire pour indiquer que ce problème est résolu
    Utilise le bouton en bas de cette page

  13. #13
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 305
    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 305
    Points : 52 884
    Points
    52 884
    Par défaut
    Citation Envoyé par nant44 Voir le message
    Enfin j'ai réussi à résoudre mon problème.
    Sauf que ton code ne donne pas la même matrice pour n=4 que celle que tu as donnée dans ton premier message.

    Dans ton premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M=[1 2 4 6
       2 3 5 8
       4 5 7 9
       6 8 9 10]
    Avec ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    M=[1 2 4 7
       2 3 5 8
       4 5 6 9
       7 8 9 10]

  14. #14
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    Oui c'est vrai, désole c'était une erreur de saisie.

  15. #15
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 305
    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 305
    Points : 52 884
    Points
    52 884
    Par défaut
    OK, donc la solution que j'ai donnée était presque la bonne (à x-1 près).

    Pas besoin de boucle FOR-END :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function x=distance_index(n)
     
    [x,y]=meshgrid(1:n);
     
    x=sqrt((x-1).^2+(y-1).^2);
     
    [inutile,inutile,x(:)]=unique(x(:));

  16. #16
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 142
    Points : 94
    Points
    94
    Par défaut
    oui tu as raison

  17. #17
    Membre du Club Avatar de legreg2
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 61
    Points : 68
    Points
    68
    Par défaut Bravo
    Bravo à Dut, finalement, j'avais rien compris...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/06/2007, 12h22
  2. [Débutant] Création d'une matrice de confusion
    Par Alucard9800XT dans le forum MATLAB
    Réponses: 4
    Dernier message: 15/05/2007, 09h19
  3. [TP] Création d'une matrice
    Par amine6441 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 03/03/2007, 16h20
  4. Réponses: 6
    Dernier message: 07/02/2007, 15h03
  5. Création d'une matrice d'entiers
    Par fleur de nostalgie dans le forum C
    Réponses: 6
    Dernier message: 21/12/2006, 14h17

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