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éer une matrice k-diagonale


Sujet :

MATLAB

  1. #1
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut Créer une matrice k-diagonale
    Bonjour à tous !


    Je voudrais une fonction pour créer une matrice k-diagonale, avec les chiffres à mettre sur les diags en paramètre.

    j'en ai déjà une qui fonctionne, mais c'est très moche

    si vous savez comme faire ça entièrement matriciellement, je veux bien de votre aide

    function out = kDiag(taille,diags)
    % KDIAG - create a k-diagonal matrix
    %
    % Use :
    % - out = kDiag(taille,diags)
    %
    % Example :
    % >> kDiag(5,3)
    % >> kDiag(5,[1,2,3])
    % >> kDiag(5,[3,5,4,8,-1])

    if length(diags)==1
    diags = ones(diags,1);
    end

    nbdiag = length(diags);

    % création d'une suite de taille nbdiag + 1
    t = floor(nbdiag/2);
    t = -t:t;

    % première diagonale
    M = eye(taille,taille)*diags(find(t==0));

    % on efface de diags les infos sur la 1ère diag
    diags(find(t==0))=[];

    % on efface de la suite l'entrée = 0 pour ne pas planter diag plus bas.
    t = t(t~=0);

    % pour chaque diagonale demandée, on la calcule dans tmp et on la superpose à M
    for i=1:nbdiag-1
    tmp = diag(ones(taille,1),t(i))*diags(i);
    M = M + tmp(1:end-abs(t(i)),1:end-abs(t(i)));
    end

    out = M;

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On peut faire des ajouts directement dans la matrice aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M(1:n-1;2:n)=M(1:n-1;2:n) + diags(vecteur)
    Mais je ne sais pas si c'est plus rapide.

  3. #3
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    oui je vois, mais le problème reste le même si je n'arrive pas à générer mes diagonales non-principales d'un coup.

    Enfin, c'est plus pour le fun que pour la rapidité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> tic;kdiag(199,5);toc
    Elapsed time is 0.020777 seconds.
    je m'en sers pour faire glisser une "fenêtre" sur un vecteur de taille N afin d'avoir des découpes de taille k (le nombre de diagonales) j'en ai donc N-k sans boucle.

    Seul soucis avec ma méthode : je ne garanti rien quand k est pair...

  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
    je pense que la fonction spdiags peut t'aider

  5. #5
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par salseropom
    je pense que la fonction spdiags peut t'aider
    merci je vais regarder ça


    edit : à oui effectivement, on peut le faire directement avec cette fonction, merci bien !

    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
    B = repmat((1:6)',[1 7])
     
    B =
     
        1  1  1  1  1  1  1
        2  2  2  2  2  2  2
        3  3  3  3  3  3  3
        4  4  4  4  4  4  4
        5  5  5  5  5  5  5
        6  6  6  6  6  6  6
     
    d = [-4 -2 -1 0 3 4 5];
    A = spdiags(B,d,6,6);
    full(A)
     
    ans =
     
      1  0  0  4  5  6
      1  2  0  0  5  6
      1  2  3  0  0  6
      0  2  3  4  0  0
      1  0  3  4  5  0
      0  2  0  4  5  6

  6. #6
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    donc ça donne ça :

    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
    function out = kDiag2(tailles,diags)
    % KDIAG - create a k-diagonal matrix
    % 
    % Use :
    % - out = kDiag(size,diags)
    % 
    % Example :
    % >> kDiag([5,5],3)
    % >> kDiag([5,5],[1,2,3])
    % >> kDiag([5,5],[3,5,4,8,-1])
    % 
    % See also : spdiags
     
     
     
    B = repmat(diags,tailles);
     
    d = floor(length(diags)/2);
    d = -d:d;
     
     
    A = spdiags(B,d,tailles(1),tailles(2));
     
    out = full(A);
    et c'est nettement plus rapide :
    >> tic;kDiag(119,5);toc
    Elapsed time is 0.016714 seconds.
    >> tic;kDiag2([119,119],[1,1,1,1,1]);toc
    Elapsed time is 0.005073 seconds.
    Merci bien !

  7. #7
    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
    Pense à la balise RESOLU si c'est le cas.

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

Discussions similaires

  1. Créer une matrice diagonale avec la boucle "for'
    Par SOSO1 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/05/2012, 13h54
  2. Créer une matrice diagonale par blocs
    Par antonb dans le forum MATLAB
    Réponses: 5
    Dernier message: 08/12/2011, 20h10
  3. [Macro-Word] Créer une matrice d'exigences
    Par Matespace dans le forum VBA Word
    Réponses: 5
    Dernier message: 24/05/2007, 10h56
  4. Créer une matrice symétrique à partir de 3 colonnes
    Par vincent550 dans le forum MATLAB
    Réponses: 3
    Dernier message: 10/04/2007, 13h35
  5. Créer une matrice en manipulant un vecteur
    Par bernard6 dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/04/2007, 11h34

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