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 :

Parcourir une matrice [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Bonjour,
    après pas mal de galères... qui précèdent (surement comme pour tout le monde) l'intégration d'un minimum de syntaxe permettant l'écriture de semblant de formules, j'ai réussi à créer une fonction qui ne fait qu'une partie de ce qu'elle devrait faire! J'ai une matrice de n lignes sur 65 colonnes, le but est d'effectuer n fois les mêmes opérations sur chaque ligne de la matrice.
    Mon problème est que tout se passe bien, mais uniquement sur la première ligne... je n'arrive pas à incrémenter! Je pense que cela ne doit pas aller au niveau de ma boucle, si quelqu'un pouvait m'enlever cette épine...! Merci par avance!

    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
    function q=sub(c)
    [m,n]=size(c);
     
    for m=1:size(:, c)
        m = 1;
     
      for k=2:n
     
           if k==2   % corner
              q(1,2)=0
     
           elseif k==65  % corner
              q(1,65)=0
     
           else q(1,k)=(((2*c(1,k)-c(1,k-1)-c(1,k+1))+(2*c(1,k)-c(1,k-8)-c(1,k+8)))/2);
     
        m=m+1;
    end
    end
    end

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

    Ton problème vient de ta première boucle for.
    for m=1:size(:, c)
    à remplacer par
    Ce qui m'etonne, c'est que tu as bien fais la seconde.
    ensuite tu as mis m = 1 juste après, normal que cela ne s'incrémente pas
    De plus tu n'as pas besoin du m=m+1 à la fin, la boucle for le fait automatiquement.

    Pour finir, tu as mis des q(1,k) et c(1,k) partout...
    Ne voudrais-tu pas plutôt q(i,k) et c(i,k)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [m,n]=size(c);
    q = zeros(size(c)); % Allocation
    for i=1:m
        for k=3:n-1
            q(i,k)=(((2*c(i,k)-c(i,k-1)-c(i,k+1))+(2*c(i,k)-c(i,k-8)-c(i,k+8)))/2);
        end
    end
    L'allocation te permet d'aller un peu plus vite dans tes boucles, si tes matrices sont grandes, de plus tu n'as plus à mettre q à 0 pour k = 2 et 65 vu que c'est déjà fait.

    Par contre, une dernière remarque: lorsque k<=8 et k+8>m, tu auras un problème car les indices dépasseront la taille de ta matrice c et seront négatifs, il te faudra donc introduire des sécurités ou faire for i=9:n-8, à toi de voir selon ce que tu vas en faire...

  3. #3
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Effectivement, tu as un problème au niveau de ta boucle:
    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
     
    function q=sub(c)
    [m,n]=size(c);
     
    for i=1:m
     
      for k=2:n
     
           if k==2   % corner
              q(1,2)=0
     
           elseif k==65  % corner
              q(1,65)=0
     
           else q(1,k)=(((2*c(1,k)-c(1,k-1)-c(1,k+1))+(2*c(1,k)-c(1,k-8)-c(1,k+8)))/2);
     
    end
    end
    end
    Ton m est une variable qui vaut le nombre de lignes de ta matrice (comme n vaut le nombre de colonnes), il ne s'agit donc pas d'une variable d'incrémentation.

    Sinon tu risques d'avoir un problème avec c(1,k+8) puisque ton n max (pour cette branche du IF) vaut 64 et c à 65 colonnes or dans ce cas, tu vas chercher la 72ème colonne (et la même chose avec c(1,k-8))

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Merci pour toutes ces préscisions, je vais plancher dessus et essayer de tout faire coller... Merci également pour cette dernière remarque, en fait cela fonctionne car j'ai ecrit plusieurs règles pour les différentes valeurs extrèmes... mais vu que ca fait beaucoup de code et que cela ne servait à rien; je les aient zapé, cela donnait ça en fait :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    function q=sub(c)
    [m,n]=size(c);
     
    for m=1:size(:, c)
        m = 1;
     
      for k=2:n
     
        if k==2   % corner
            q(1,2)=0
     
        elseif k==3
            q(1,3)=(((2*c(1,3)-c(1,4)-c(1,11))+(2*c(1,3)-c(1,10)-c(1,12)))/2);
     
        elseif k==4
            q(1,4)=(((2*c(1,4)-c(1,3)-c(1,5))+(2*c(1,4)-c(1,11)-c(1,13)))/2);      % bord
     
        elseif k==5
            q(1,5)=(((2*c(1,5)-c(1,4)-c(1,6))+(2*c(1,5)-c(1,12)-c(1,14)))/2);      % bord
     
        elseif k==6
            q(1,6)=(((2*c(1,6)-c(1,5)-c(1,7))+(2*c(1,6)-c(1,13)-c(1,15)))/2);      % bord
     
        elseif k==7
            q(1,7)=(((2*c(1,7)-c(1,6)-c(1,8))+(2*c(1,7)-c(1,14)-c(1,16)))/2);      % bord
     
        elseif k==8
            q(1,8)=(((2*c(1,8)-c(1,7)-c(1,16))+(2*c(1,8)-c(1,15)-c(1,17)))/2);
     
        elseif k==9  % corner
            q(1,9)=0
     
        elseif k==10
            q(1,10)=(((2*c(1,10)-c(1,11)-c(1,18))+(2*c(1,10)-c(1,3)-c(1,19)))/2);
     
        elseif k==17
            q(1,17)=(((2*c(1,17)-c(1,16)-c(1,25))+(2*c(1,17)-c(1,8)-c(1,24)))/2);
     
        elseif k==18
            q(1,18)=(((2*c(1,18)-c(1,10)-c(1,26))+(2*c(1,18)-c(1,11)-c(1,27)))/2);      % bord
     
        elseif k==25
            q(1,25)=(((2*c(1,25)-c(1,17)-c(1,33))+(2*c(1,25)-c(1,16)-c(1,32)))/2);      % bord
     
        elseif k==26
            q(1,26)=(((2*c(1,26)-c(1,19)-c(1,35))+(2*c(1,26)-c(1,10)-c(1,42)))/2);  
     
        elseif k==33
            q(1,33)=(((2*c(1,33)-c(1,25)-c(1,41))+(2*c(1,33)-c(1,24)-c(1,40)))/2);      % bord
     
        elseif k==41
            q(1,41)=(((2*c(1,41)-c(1,33)-c(1,49))+(2*c(1,41)-c(1,32)-c(1,48)))/2);      % bord
     
        elseif k==42
            q(1,42)=(((2*c(1,42)-c(1,35)-c(1,51))+(2*c(1,42)-c(1,27)-c(1,59)))/2);   
     
        elseif k==50
            q(1,50)=(((2*c(1,50)-c(1,51)-c(1,42))+(2*c(1,50)-c(1,43)-c(1,59)))/2);
     
        elseif k==49
            q(1,49)=(((2*c(1,49)-c(1,41)-c(1,57))+(2*c(1,49)-c(1,40)-c(1,56)))/2);      % bord
     
        elseif k==57
            q(1,57)=(((2*c(1,57)-c(1,56)-c(1,49))+(2*c(1,57)-c(1,48)-c(1,64)))/2);   
     
        elseif k==58  % corner
            q(1,58)=0     
     
        elseif k==59    
            q(1,59)=(((2*c(1,59)-c(1,60)-c(1,51))+(2*c(1,59)-c(1,50)-c(1,52)))/2);
     
        elseif k==60
            q(1,60)=(((2*c(1,60)-c(1,59)-c(1,61))+(2*c(1,60)-c(1,51)-c(1,53)))/2);      % bord
     
        elseif k==61
            q(1,61)=(((2*c(1,61)-c(1,60)-c(1,62))+(2*c(1,61)-c(1,52)-c(1,54)))/2);      % bord
     
        elseif k==62
            q(1,62)=(((2*c(1,62)-c(1,61)-c(1,63))+(2*c(1,62)-c(1,53)-c(1,55)))/2);      % bord
     
        elseif k==63
            q(1,63)=(((2*c(1,63)-c(1,62)-c(1,64))+(2*c(1,63)-c(1,54)-c(1,56)))/2);      % bord
     
        elseif k==64
            q(1,64)=(((2*c(1,64)-c(1,63)-c(1,56))+(2*c(1,64)-c(1,55)-c(1,57)))/2);   
     
        elseif k==65  % corner
            q(1,65)=0
     
        else q(1,k)=(((2*c(1,k)-c(1,k-1)-c(1,k+1))+(2*c(1,k)-c(1,k-8)-c(1,k+8)))/2); 
        m=m+1;
    end
    end
    end
    Merci pour tout!

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Donc oui effectivement, j'avais repiqué le k d'une autre boucle, mais ne savait pas totalement comment cela fonctionnait finalement..! Par contre maintenant j'ai un soucis, il ne veut plus de mes "elseif" qui fonctionnait bien jusqu'alors! Sauriez-vous pourquoi? Merci par avance

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    function q=sub(c)
    [m,n]=size(c);
    %  q = zeros(size(c);
    for i=1:m
     
      for k=2:n
     
        elseif k==2  % corner
            q(i,2)=0
     
        elseif k==3
            q(i,3)=(((2*c(i,3)-c(i,4)-c(i,11))+(2*c(i,3)-c(i,10)-c(i,12)))/2);
     
        elseif k==4
            q(i,4)=(((2*c(i,4)-c(i,3)-c(i,5))+(2*c(i,4)-c(i,11)-c(i,13)))/2);      % bord
     
        elseif k==5
            q(i,5)=(((2*c(i,5)-c(i,4)-c(i,6))+(2*c(i,5)-c(i,12)-c(i,14)))/2);      % bord
     
        elseif k==6
            q(i,6)=(((2*c(i,6)-c(i,5)-c(i,7))+(2*c(i,6)-c(i,13)-c(i,15)))/2);      % bord
     
        elseif k==7
            q(i,7)=(((2*c(i,7)-c(i,6)-c(i,8))+(2*c(i,7)-c(i,14)-c(i,16)))/2);      % bord
     
        elseif k==8
            q(i,8)=(((2*c(i,8)-c(i,7)-c(i,16))+(2*c(i,8)-c(i,15)-c(i,17)))/2);
     
        elseif k==9  % corner
            q(i,9)=0
     
        elseif k==10
            q(i,10)=(((2*c(i,10)-c(i,11)-c(i,18))+(2*c(i,10)-c(i,3)-c(i,19)))/2);
     
        elseif k==17
            q(i,17)=(((2*c(i,17)-c(i,16)-c(i,25))+(2*c(i,17)-c(i,8)-c(i,24)))/2);
     
        elseif k==18
            q(i,18)=(((2*c(i,18)-c(i,10)-c(i,26))+(2*c(i,18)-c(i,11)-c(i,27)))/2);      % bord
     
        elseif k==25
            q(i,25)=(((2*c(i,25)-c(i,17)-c(i,33))+(2*c(i,25)-c(i,16)-c(i,32)))/2);      % bord
     
        elseif k==26
            q(i,26)=(((2*c(i,26)-c(i,19)-c(i,35))+(2*c(i,26)-c(i,10)-c(i,42)))/2);  
     
        elseif k==33
            q(i,33)=(((2*c(i,33)-c(i,25)-c(i,41))+(2*c(i,33)-c(i,24)-c(i,40)))/2);      % bord
     
        elseif k==41
            q(i,41)=(((2*c(i,41)-c(i,33)-c(i,49))+(2*c(i,41)-c(i,32)-c(i,48)))/2);      % bord
     
        elseif k==42
            q(i,42)=(((2*c(i,42)-c(i,35)-c(i,51))+(2*c(i,42)-c(i,27)-c(i,59)))/2);   
     
        elseif k==50
            q(i,50)=(((2*c(i,50)-c(i,51)-c(i,42))+(2*c(i,50)-c(i,43)-c(i,59)))/2);
     
        elseif k==49
            q(i,49)=(((2*c(i,49)-c(i,41)-c(i,57))+(2*c(i,49)-c(i,40)-c(i,56)))/2);      % bord
     
        elseif k==57
            q(i,57)=(((2*c(i,57)-c(i,56)-c(i,49))+(2*c(i,57)-c(i,48)-c(i,64)))/2);   
     
        elseif k==58  % corner
            q(i,58)=0     
     
        elseif k==59    
            q(i,59)=(((2*c(i,59)-c(i,60)-c(i,51))+(2*c(i,59)-c(i,50)-c(i,52)))/2);
     
        elseif k==60
            q(i,60)=(((2*c(i,60)-c(i,59)-c(i,61))+(2*c(i,60)-c(i,51)-c(i,53)))/2);      % bord
     
        elseif k==61
            q(i,61)=(((2*c(i,61)-c(i,60)-c(i,62))+(2*c(i,61)-c(i,52)-c(i,54)))/2);      % bord
     
        elseif k==62
            q(i,62)=(((2*c(i,62)-c(i,61)-c(i,63))+(2*c(i,62)-c(i,53)-c(i,55)))/2);      % bord
     
        elseif k==63
            q(i,63)=(((2*c(i,63)-c(i,62)-c(i,64))+(2*c(i,63)-c(i,54)-c(i,56)))/2);      % bord
     
        elseif k==64
            q(i,64)=(((2*c(i,64)-c(i,63)-c(i,56))+(2*c(i,64)-c(i,55)-c(i,57)))/2);   
     
        elseif k==65  % corner
            q(i,65)=0
     
        else q(i,k)=(((2*c(i,k)-c(i,k-1)-c(i,k+1))+(2*c(i,k)-c(i,k-8)-c(i,k+8)))/2);
    end
    end
    end

  6. #6
    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
    Peut-être parce que tu commences direct par un ELSEIF et qu'il te manque donc le IF (ce que MATLAB doit te signaler).

    Par contre tu pourrais sortir de 2 à 10 de ta boucle puisque tu fais des opérations différentes.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    function q=sub(c)
    [m,n]=size(c);
    %  q = zeros(size(c)); %pourquoi le commenter ?
    for i=1:m
     
     
     
            q(i,2)=0 %inutile si tu inialises à zeros
     
     
            q(i,3)=(((2*c(i,3)-c(i,4)-c(i,11))+(2*c(i,3)-c(i,10)-c(i,12)))/2);
     
     
            q(i,4)=(((2*c(i,4)-c(i,3)-c(i,5))+(2*c(i,4)-c(i,11)-c(i,13)))/2);      % bord
     
     
            q(i,5)=(((2*c(i,5)-c(i,4)-c(i,6))+(2*c(i,5)-c(i,12)-c(i,14)))/2);      % bord
     
     
            q(i,6)=(((2*c(i,6)-c(i,5)-c(i,7))+(2*c(i,6)-c(i,13)-c(i,15)))/2);      % bord
     
     
            q(i,7)=(((2*c(i,7)-c(i,6)-c(i,8))+(2*c(i,7)-c(i,14)-c(i,16)))/2);      % bord
     
     
            q(i,8)=(((2*c(i,8)-c(i,7)-c(i,16))+(2*c(i,8)-c(i,15)-c(i,17)))/2);
     
     
            q(i,9)=0 %inutile si tu inialises à zeros
     
     
            q(i,10)=(((2*c(i,10)-c(i,11)-c(i,18))+(2*c(i,10)-c(i,3)-c(i,19)))/2);
     
    for k=11:n
     
        if k==17
            q(i,17)=(((2*c(i,17)-c(i,16)-c(i,25))+(2*c(i,17)-c(i,8)-c(i,24)))/2);
     
        elseif k==18
            q(i,18)=(((2*c(i,18)-c(i,10)-c(i,26))+(2*c(i,18)-c(i,11)-c(i,27)))/2);      % bord
     
        elseif k==25
            q(i,25)=(((2*c(i,25)-c(i,17)-c(i,33))+(2*c(i,25)-c(i,16)-c(i,32)))/2);      % bord
     
        elseif k==26
            q(i,26)=(((2*c(i,26)-c(i,19)-c(i,35))+(2*c(i,26)-c(i,10)-c(i,42)))/2);  
     
        elseif k==33
            q(i,33)=(((2*c(i,33)-c(i,25)-c(i,41))+(2*c(i,33)-c(i,24)-c(i,40)))/2);      % bord
     
        elseif k==41
            q(i,41)=(((2*c(i,41)-c(i,33)-c(i,49))+(2*c(i,41)-c(i,32)-c(i,48)))/2);      % bord
     
        elseif k==42
            q(i,42)=(((2*c(i,42)-c(i,35)-c(i,51))+(2*c(i,42)-c(i,27)-c(i,59)))/2);   
     
        elseif k==50
            q(i,50)=(((2*c(i,50)-c(i,51)-c(i,42))+(2*c(i,50)-c(i,43)-c(i,59)))/2);
     
        elseif k==49
            q(i,49)=(((2*c(i,49)-c(i,41)-c(i,57))+(2*c(i,49)-c(i,40)-c(i,56)))/2);      % bord
     
        elseif k==57
            q(i,57)=(((2*c(i,57)-c(i,56)-c(i,49))+(2*c(i,57)-c(i,48)-c(i,64)))/2);   
     
        elseif k==58  % corner
            q(i,58)=0     
     
        elseif k==59    
            q(i,59)=(((2*c(i,59)-c(i,60)-c(i,51))+(2*c(i,59)-c(i,50)-c(i,52)))/2);
     
        elseif k==60
            q(i,60)=(((2*c(i,60)-c(i,59)-c(i,61))+(2*c(i,60)-c(i,51)-c(i,53)))/2);      % bord
     
        elseif k==61
            q(i,61)=(((2*c(i,61)-c(i,60)-c(i,62))+(2*c(i,61)-c(i,52)-c(i,54)))/2);      % bord
     
        elseif k==62
            q(i,62)=(((2*c(i,62)-c(i,61)-c(i,63))+(2*c(i,62)-c(i,53)-c(i,55)))/2);      % bord
     
        elseif k==63
            q(i,63)=(((2*c(i,63)-c(i,62)-c(i,64))+(2*c(i,63)-c(i,54)-c(i,56)))/2);      % bord
     
        elseif k==64
            q(i,64)=(((2*c(i,64)-c(i,63)-c(i,56))+(2*c(i,64)-c(i,55)-c(i,57)))/2);   
     
        elseif k==65  % corner
            q(i,65)=0
     
        else
           q(i,k)=(((2*c(i,k)-c(i,k-1)-c(i,k+1))+(2*c(i,k)-c(i,k-8)-c(i,k+8)))/2);
        end
    end
    end


    Note : pense à indenter proprement ton code, ça te permettra de visualiser assez vite ce genre d'erreur : dans l'éditeur CTRL+A puis CTRL+I.
    (je n'ai moi-même pas MATLAB sous la main pour le faire)

    [EDIT]Et pour rendre plus lisible ton code tu pourrais aussi supprimer toutes ces parenthèses inutiles à chaque ligne :
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    q(i,59)=(((2*c(i,59)-c(i,60)-c(i,51))+(2*c(i,59)-c(i,50)-c(i,52)))/2);
    s'écrit :
    q(i,59)=(2*c(i,59)-c(i,60)-c(i,51)+2*c(i,59)-c(i,50)-c(i,52))/2;
    Règles du Forum

    Adepte de la maïeutique

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Merci! Oui effectivement le elseif... ça fonctionne maintenant! même si c'est extrêmement long!! j'ai 10000 lignes... et ça fait 10 min que ça tourne! Par contre je ne vois pas bien pourquoi je devrai sortir de ma boucle les exceptions 1 à 10...? Elle n'ont pas toutes le même intérêt mais sont toutes différentes et doivent toutes être effectuées avant de passer à la ligne suivante? j'ai peut être loupé un truc alors?

  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
    Je te dis juste de les sortir et de les faire linéairement ce qui te gagnera du temps.

    Exemple.

    Ce que tu fais toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i=1:5
       if i==1
           disp(i);
       elseif i==2
           disp(i*2);
       else
           disp(i*3);
       end
    end
    Ce qui revient à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    disp(1); %cas 1
    disp(2*2) %cas 2
    %Le reste
    for i=3:5
       disp(i*3);
    end
    Et compare les temps mis par ces 2 codes

    De plus j'ai mis des commentaires dans ton code, il y a des lignes à supprimer si tu initialises proprement ton tableau q.

    Après il y a peut-être moyen de trouver une formule générique mais pour l'instant ton code est un peu illisible et ne donne pas vraiment envie de mettre les mains dedans (désolée )
    Donc tu nettoies, tu indentes et tu nous le représentes


    [EDIT]Ah oui aussi pour éviter tous ces ELSEIF vilains tu devrais regarder l'aide de SWITCH, ce serait plus joli

    [EDIT2]Allez comme ça m'amuse un début de factorisation (à vérifier) (et puis j'ai trouvé un éditeur pour indenter ) :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    function q=sub(c)
    [m,n]=size(c);
    %Initialisation
    q = zeros(size(c));
    %factorisation :
    % pour colonnes 1 et 2 : zéro partout, fait par l'initialisation
    q(:,3) = (2*c(:,3)-c(:,4)-c(:,11)+2*c(:,3)-c(:,10)-c(:,12))/2;
    q(:,4) = (2*c(:,4)-c(:,3)-c(:,5)+2*c(:,4)-c(:,11)-c(:,13))/2;      % bord
    %on peut faire pareil pour toutes les colonnes
    for i=1:m 
     
     
    	q(i,5)=(((2*c(i,5)-c(i,4)-c(i,6))+(2*c(i,5)-c(i,12)-c(i,14)))/2);      % bord        
     
    	q(i,6)=(((2*c(i,6)-c(i,5)-c(i,7))+(2*c(i,6)-c(i,13)-c(i,15)))/2);      % bord        
     
    	q(i,7)=(((2*c(i,7)-c(i,6)-c(i,8))+(2*c(i,7)-c(i,14)-c(i,16)))/2);      % bord        
     
    	q(i,8)=(((2*c(i,8)-c(i,7)-c(i,16))+(2*c(i,8)-c(i,15)-c(i,17)))/2);       
    	%9 =0
    	q(i,10)=(((2*c(i,10)-c(i,11)-c(i,18))+(2*c(i,10)-c(i,3)-c(i,19)))/2);
     
    	for k=11:56
            switch k
    			case 17
    				q(i,17)=(((2*c(i,17)-c(i,16)-c(i,25))+(2*c(i,17)-c(i,8)-c(i,24)))/2);
     
    			case 18
    				q(i,18)=(((2*c(i,18)-c(i,10)-c(i,26))+(2*c(i,18)-c(i,11)-c(i,27)))/2);      % bord
     
    			case 25
    				q(i,25)=(((2*c(i,25)-c(i,17)-c(i,33))+(2*c(i,25)-c(i,16)-c(i,32)))/2);      % bord
     
    			case 26
    				q(i,26)=(((2*c(i,26)-c(i,19)-c(i,35))+(2*c(i,26)-c(i,10)-c(i,42)))/2);  
     
    			case 33
    				q(i,33)=(((2*c(i,33)-c(i,25)-c(i,41))+(2*c(i,33)-c(i,24)-c(i,40)))/2);      % bord
     
    			case 41
    				q(i,41)=(((2*c(i,41)-c(i,33)-c(i,49))+(2*c(i,41)-c(i,32)-c(i,48)))/2);      % bord
     
    			case 42
    				q(i,42)=(((2*c(i,42)-c(i,35)-c(i,51))+(2*c(i,42)-c(i,27)-c(i,59)))/2);   
     
    			case 49
    				q(i,49)=(((2*c(i,49)-c(i,41)-c(i,57))+(2*c(i,49)-c(i,40)-c(i,56)))/2);      % bord
    			case 50
    				q(i,50)=(((2*c(i,50)-c(i,51)-c(i,42))+(2*c(i,50)-c(i,43)-c(i,59)))/2);
    			otherwise
    				q(i,k)=(4*c(i,k)-c(i,k-1)-c(i,k+1)-c(i,k-8)-c(i,k+8))/2;
    		end
    	end		
     
    	q(i,57)=(((2*c(i,57)-c(i,56)-c(i,49))+(2*c(i,57)-c(i,48)-c(i,64)))/2);   
    	%58 = 0
    	q(i,59)=(((2*c(i,59)-c(i,60)-c(i,51))+(2*c(i,59)-c(i,50)-c(i,52)))/2);
     
    	q(i,60)=(((2*c(i,60)-c(i,59)-c(i,61))+(2*c(i,60)-c(i,51)-c(i,53)))/2);      % bord
     
    	q(i,61)=(((2*c(i,61)-c(i,60)-c(i,62))+(2*c(i,61)-c(i,52)-c(i,54)))/2);      % bord
     
    	q(i,62)=(((2*c(i,62)-c(i,61)-c(i,63))+(2*c(i,62)-c(i,53)-c(i,55)))/2);      % bord
     
    	q(i,63)=(((2*c(i,63)-c(i,62)-c(i,64))+(2*c(i,63)-c(i,54)-c(i,56)))/2);      % bord
     
    	q(i,64)=(((2*c(i,64)-c(i,63)-c(i,56))+(2*c(i,64)-c(i,55)-c(i,57)))/2);
    	%65 = 0
    end
    Règles du Forum

    Adepte de la maïeutique

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Bonjour à tous,
    Je reviens avec un code un peu plus "propre" mais pas totalement! Je m'explique : en fait, on m'a conseillé de retirer les premières lignes de ma boucles, or si je sort les lois pour les colonnes 2, 9,... de la boucle, elles rentrent dans le cadre de la règle générale (dernière ligne) et cela crée une erreur, car le calcul reviens à chercher un élément "numéroté négativement"...

    De plus j'ai un autre problème, lorsque je fait tourner mon script avec quelques lignes cela fonctionne jusque une centaine... cela met 5 secondes. Avec 200 ligne, cela ne met pas 10 secondes, cela ne s'arrête pas! (J'ai laissé une minute tourner) Pensez-vous que cela soit normal..?

    Et dernièrement je pense qu'il sera difficile voir impossible de trouver une règle générale car pour certaines colonnes c'est du cas par cas...

    Merci par avance

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    function q=sub(c)
    [m,n]=size(c);
    %q = zeros(size(c));
    for i=1:m
     
          for k=2:n 
     
                if k==2
                    q(i,2)=0   %corner
     
                elseif k==3 
                    q(i,3)=(2*c(i,3)-c(i,4)-c(i,11)+2*c(i,3)-c(i,10)-c(i,12))/2;
     
                elseif k==4        
                    q(i,4)=(2*c(i,4)-c(i,3)-c(i,5)+2*c(i,4)-c(i,11)-c(i,13))/2;      % bord
     
                elseif k==5      
                    q(i,5)=(2*c(i,5)-c(i,4)-c(i,6)+2*c(i,5)-c(i,12)-c(i,14))/2;      % bord
     
                elseif k==6      
                    q(i,6)=(2*c(i,6)-c(i,5)-c(i,7)+2*c(i,6)-c(i,13)-c(i,15))/2;      % bord
     
                elseif k==7     
                    q(i,7)=(2*c(i,7)-c(i,6)-c(i,8)+2*c(i,7)-c(i,14)-c(i,16))/2;      % bord
     
                elseif k==8      
                    q(i,8)=(2*c(i,8)-c(i,7)-c(i,16)+2*c(i,8)-c(i,15)-c(i,17))/2;
     
                elseif k==9     
                    q(i,9)=0   %corner
     
                elseif k==10    
                    q(i,10)=(2*c(i,10)-c(i,11)-c(i,18)+2*c(i,10)-c(i,3)-c(i,19))/2;
     
                elseif k==17
                    q(i,17)=(2*c(i,17)-c(i,16)-c(i,25)+2*c(i,17)-c(i,8)-c(i,24))/2;
     
                elseif k==18
                    q(i,18)=(2*c(i,18)-c(i,10)-c(i,26)+2*c(i,18)-c(i,11)-c(i,27))/2;      % bord
     
                elseif k==25
                    q(i,25)=(2*c(i,25)-c(i,17)-c(i,33)+2*c(i,25)-c(i,16)-c(i,32))/2;      % bord
     
                elseif k==26
                    q(i,26)=(2*c(i,26)-c(i,19)-c(i,35)+2*c(i,26)-c(i,10)-c(i,42))/2;  
     
                elseif k==33
                    q(i,33)=(2*c(i,33)-c(i,25)-c(i,41)+2*c(i,33)-c(i,24)-c(i,40))/2;      % bord
     
                elseif k==41
                    q(i,41)=(2*c(i,41)-c(i,33)-c(i,49)+2*c(i,41)-c(i,32)-c(i,48))/2;      % bord
     
                elseif k==42
                    q(i,42)=(2*c(i,42)-c(i,35)-c(i,51)+2*c(i,42)-c(i,27)-c(i,59))/2;   
     
                elseif k==50
                    q(i,50)=(2*c(i,50)-c(i,51)-c(i,42)+2*c(i,50)-c(i,43)-c(i,59))/2;
     
                elseif k==49
                    q(i,49)=(2*c(i,49)-c(i,41)-c(i,57)+2*c(i,49)-c(i,40)-c(i,56))/2;      % bord
     
                elseif k==57
                    q(i,57)=(2*c(i,57)-c(i,56)-c(i,49)+2*c(i,57)-c(i,48)-c(i,64))/2;       
     
                elseif k==58  % corner
                    q(i,58)=0     
     
                elseif k==59    
                    q(i,59)=(2*c(i,59)-c(i,60)-c(i,51)+2*c(i,59)-c(i,50)-c(i,52))/2;
     
                elseif k==60
                    q(i,60)=(2*c(i,60)-c(i,59)-c(i,61)+2*c(i,60)-c(i,51)-c(i,53))/2;      % bord
     
                elseif k==61
                    q(i,61)=(2*c(i,61)-c(i,60)-c(i,62)+2*c(i,61)-c(i,52)-c(i,54))/2;      % bord
     
                elseif k==62
                    q(i,62)=(2*c(i,62)-c(i,61)-c(i,63)+2*c(i,62)-c(i,53)-c(i,55))/2;      % bord
     
                elseif k==63
                    q(i,63)=(2*c(i,63)-c(i,62)-c(i,64)+2*c(i,63)-c(i,54)-c(i,56))/2;      % bord
     
                elseif k==64
                    q(i,64)=(2*c(i,64)-c(i,63)-c(i,56)+2*c(i,64)-c(i,55)-c(i,57))/2;   
     
                elseif k==65  % corner
                    q(i,65)=0
     
                else q(i,k)=(2*c(i,k)-c(i,k-1)-c(i,k+1)+2*c(i,k)-c(i,k-8)-c(i,k+8))/2; 
           end
    end
    end

  10. #10
    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
    on m'a conseillé de retirer les premières lignes de ma boucles
    Si c'est moi le "on" je pense que tu m'as mal comprise (j'avoue m'être mal exprimée mais le code lui était clair), je n'ai jamais dit de les retirer j'ai dit de les sortir de la boucle (et de modifier la boucle en conséquence).

    As-tu au moins regardé le code que je t'ai mis ? L'as-tu testé ?
    As-tu essayé de comprendre ?

    [EDIT]Je ne vois pas en quoi ton code a évolué
    Règles du Forum

    Adepte de la maïeutique

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

    De plus j'ai un autre problème, lorsque je fait tourner mon script avec quelques lignes cela fonctionne jusque une centaine... cela met 5 secondes. Avec 200 ligne, cela ne met pas 10 secondes, cela ne s'arrête pas! (J'ai laissé une minute tourner) Pensez-vous que cela soit normal..?
    Je te l'ai dit à mon premier post, mais tu n'a pas du retenir, vu que tu as commenté la ligne.
    Je te conseille d'aller faire un petit tour du côté de la
    Cela te permet entre autre d'éliminer les lignes telle que
    Comme je te l'avais aussi dit.

    [EDIT] Comme te l'a dit Caroline, ton code sera plus propre avec un switch, ainsi qu'indenté.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Ok..! Oui oui... effectivement le on c'était bien toi! J'avais du mal comprendre, par contre le code, j'avoue que cette histoire de disp, si c'est ça qui veut dire switch(...?) , je ne connaissais pas! Bref, en tout cas, switch est effectivement pratique et c'est beaucoup plus lisible comme ça, et extrêmement rapide (il devait y avoir un quelque chose, un problème dans ma boucle, car maintenant ça met 3 ou 4 secondes pour 10000 lignes!)
    Excusez ma lenteur par contre pour l'indentation, je pensait que le dernier n'était pas trop mal? ou alors j'ai pas compris du tout!
    Merci en tout cas!

    NB : Si j'ai une autre question (l'utilisation du résultat de ce script dans un autre script me pose problème) je la pose ici... ou je crée un nouveau post?

  13. #13
    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
    Non l'indentation est encore mauvaise (pourtant c'est simple CTRL+A et CTRL+I dans l'éditeur).

    Les DISP c'était juste pour l'exemple.

    Si tu as une autre question oui il faut ouvrir un autre post et si celui-ci est résolu il faut cliquer sur le bouton en bas.

    Ceci dit ton code étant largement améliorable, je pense que ce serait bien que tu nous montres la dernière version, voir si on peut encore faire quelque chose
    Règles du Forum

    Adepte de la maïeutique

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Bonsoir!
    Pour l'indentation, je viens d'essayer, effectivement cela modifie un peu ce que j'avais essayé de faire à la main... cela se voyait tant que ça...?!!

    Bon sinon j'ai essayer de rassembler un peu les expressions ayant la même logique. Par contre serait-il possible de savoir ce que factorisation veut dire dans ce cas? Les deux point doivent signifier "pour toutes les lignes"? Mais dans ce cas pourquoi cela ne fonctionne si j'enlève la boucle et que je remplace...
    Merci!

    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
    48
    49
    50
    51
    52
    53
    function q=substraction(c)
    [m,n]=size(c);
    %Initialisation
    q = zeros(size(c));
    %factorisation :
    q(:,3) = (2*c(:,3)-c(:,4)-c(:,11)+2*c(:,3)-c(:,10)-c(:,12))/2;
    q(:,4) = (2*c(:,4)-c(:,3)-c(:,5)+2*c(:,4)-c(:,11)-c(:,13))/2;      % bord
    q(:,5) = (2*c(:,5)-c(:,4)-c(:,6)+2*c(:,5)-c(:,12)-c(:,14))/2;      % bord
    q(:,6) = (2*c(:,6)-c(:,5)-c(:,7)+2*c(:,6)-c(:,13)-c(:,15))/2;      % bord
    q(:,7) = (2*c(:,7)-c(:,6)-c(:,8)+2*c(:,7)-c(:,14)-c(:,16))/2;      % bord
    q(:,8) = (2*c(:,8)-c(:,7)-c(:,16)+2*c(:,8)-c(:,15)-c(:,17))/2;
    q(:,10) = (2*c(:,10)-c(:,11)-c(:,18)+2*c(:,10)-c(:,3)-c(:,19))/2;
    q(:,57)=(((2*c(:,57)-c(:,56)-c(:,49))+(2*c(:,57)-c(:,48)-c(:,64)))/2);
    q(:,59)=(((2*c(:,59)-c(:,60)-c(:,51))+(2*c(:,59)-c(:,50)-c(:,52)))/2);
    q(:,60)=(((2*c(:,60)-c(:,59)-c(:,61))+(2*c(:,60)-c(:,51)-c(:,53)))/2);      % bord
    q(:,61)=(((2*c(:,61)-c(:,60)-c(:,62))+(2*c(:,61)-c(:,52)-c(:,54)))/2);      % bord
    q(:,62)=(((2*c(:,62)-c(:,61)-c(:,63))+(2*c(:,62)-c(:,53)-c(:,55)))/2);      % bord
    q(:,63)=(((2*c(:,63)-c(:,62)-c(:,64))+(2*c(:,63)-c(:,54)-c(:,56)))/2);      % bord
    q(:,64)=(((2*c(:,64)-c(:,63)-c(:,56))+(2*c(:,64)-c(:,55)-c(:,57)))/2);
     
    for i=1:m
        for k=11:56
            switch k
                case 17
                    q(i,17)=(((2*c(i,17)-c(i,16)-c(i,25))+(2*c(i,17)-c(i,8)-c(i,24)))/2);
     
                case 18
                    q(i,18)=(((2*c(i,18)-c(i,10)-c(i,26))+(2*c(i,18)-c(i,11)-c(i,27)))/2);      % bord
     
                case 25
                    q(i,25)=(((2*c(i,25)-c(i,17)-c(i,33))+(2*c(i,25)-c(i,16)-c(i,32)))/2);      % bord
     
                case 26
                    q(i,26)=(((2*c(i,26)-c(i,19)-c(i,35))+(2*c(i,26)-c(i,10)-c(i,42)))/2);
     
                case 33
                    q(i,33)=(((2*c(i,33)-c(i,25)-c(i,41))+(2*c(i,33)-c(i,24)-c(i,40)))/2);      % bord
     
                case 41
                    q(i,41)=(((2*c(i,41)-c(i,33)-c(i,49))+(2*c(i,41)-c(i,32)-c(i,48)))/2);      % bord
     
                case 42
                    q(i,42)=(((2*c(i,42)-c(i,35)-c(i,51))+(2*c(i,42)-c(i,27)-c(i,59)))/2);
     
                case 49
                    q(i,49)=(((2*c(i,49)-c(i,41)-c(i,57))+(2*c(i,49)-c(i,40)-c(i,56)))/2);      % bord
                case 50
                    q(i,50)=(((2*c(i,50)-c(i,51)-c(i,42))+(2*c(i,50)-c(i,43)-c(i,59)))/2);
                otherwise
                    q(i,k)=(4*c(i,k)-c(i,k-1)-c(i,k+1)-c(i,k-8)-c(i,k+8))/2;
            end
        end
    end

  15. #15
    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
    Les deux point doivent signifier "pour toutes les lignes"?
    oui.

    Exemple simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i=1:5
       a(i) = 2*i;
    end
    t=1:5;
    b = 2*t;
    isequal(a,b)
    Quand tu dis que "cela ne fonctionne pas" qu'est-ce que cela veut dire ?

    Si tu lances ce code-ci dessous :
    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
    function q=substraction(c)
    [m,n]=size(c);
    %Initialisat:on
    q = zeros(s:ze(c));
    %factor:sation :
    %Colonnes 1 à 10
    q(:,3) = (2*c(:,3)-c(:,4)-c(:,11)+2*c(:,3)-c(:,10)-c(:,12))/2;
    q(:,4) = (2*c(:,4)-c(:,3)-c(:,5) +2*c(:,4)-c(:,11)-c(:,13))/2;      % bord
    q(:,5) = (2*c(:,5)-c(:,4)-c(:,6) +2*c(:,5)-c(:,12)-c(:,14))/2;      % bord
    q(:,6) = (2*c(:,6)-c(:,5)-c(:,7) +2*c(:,6)-c(:,13)-c(:,15))/2;      % bord
    q(:,7) = (2*c(:,7)-c(:,6)-c(:,8) +2*c(:,7)-c(:,14)-c(:,16))/2;      % bord
    q(:,8) = (2*c(:,8)-c(:,7)-c(:,16)+2*c(:,8)-c(:,15)-c(:,17))/2;
    q(:,10) = (2*c(:,10)-c(:,11)-c(:,18)+2*c(:,10)-c(:,3)-c(:,19))/2;
    %Colonnes 56 à 65
    q(:,57)=(2*c(:,57)-c(:,56)-c(:,49)+2*c(:,57)-c(:,48)-c(:,64))/2;
    q(:,59)=(2*c(:,59)-c(:,60)-c(:,51)+2*c(:,59)-c(:,50)-c(:,52))/2;
    q(:,60)=(2*c(:,60)-c(:,59)-c(:,61)+2*c(:,60)-c(:,51)-c(:,53))/2;      % bord
    q(:,61)=(2*c(:,61)-c(:,60)-c(:,62)+2*c(:,61)-c(:,52)-c(:,54))/2;      % bord
    q(:,62)=(2*c(:,62)-c(:,61)-c(:,63)+2*c(:,62)-c(:,53)-c(:,55))/2;      % bord
    q(:,63)=(2*c(:,63)-c(:,62)-c(:,64)+2*c(:,63)-c(:,54)-c(:,56))/2;      % bord
    q(:,64)=(2*c(:,64)-c(:,63)-c(:,56)+2*c(:,64)-c(:,55)-c(:,57))/2;
     
    for k=11:56
    	switch k
    		case 17
    			q(:,17)=(2*c(:,17)-c(:,16)-c(:,25)+(2*c(:,17)-c(:,8)-c(:,24))/2;
    		case 18
    			q(:,18)=(2*c(:,18)-c(:,10)-c(:,26)+(2*c(:,18)-c(:,11)-c(:,27))/2;      % bord
    		case 25
    			q(:,25)=(2*c(:,25)-c(:,17)-c(:,33)+(2*c(:,25)-c(:,16)-c(:,32))/2;      % bord
    		case 26
    			q(:,26)=(2*c(:,26)-c(:,19)-c(:,35)+(2*c(:,26)-c(:,10)-c(:,42))/2;
    		case 33
    			q(:,33)=(2*c(:,33)-c(:,25)-c(:,41)+(2*c(:,33)-c(:,24)-c(:,40))/2;      % bord
    		case 41
    			q(:,41)=(2*c(:,41)-c(:,33)-c(:,49)+(2*c(:,41)-c(:,32)-c(:,48))/2;      % bord
    		case 42
    			q(:,42)=(2*c(:,42)-c(:,35)-c(:,51)+(2*c(:,42)-c(:,27)-c(:,59))/2;
    		case 49
    			q(:,49)=(2*c(:,49)-c(:,41)-c(:,57)+(2*c(:,49)-c(:,40)-c(:,56))/2;      % bord
    		case 50
    			q(:,50)=(2*c(:,50)-c(:,51)-c(:,42)+(2*c(:,50)-c(:,43)-c(:,59))/2;
    		otherwise
    			q(:,k)=(2*c(:,k)-c(:,k-1)-c(:,k+1)+2*c(:,k)-c(:,k-8)-c(:,k+8))/2;
    	end
    end
    Et le tien au départ qui fonctionnait et que tu compares les sorties obtenues avec ISEQUAL qu'obtiens-tu ?
    Règles du Forum

    Adepte de la maïeutique

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 55
    Points : 32
    Points
    32
    Par défaut Parcourir une matrice
    Bonjour, je répond tardivement à un post qui commence à avoir "de l'age", vacances oblige et donc pas de connexion au net...
    Oui effectivement, cela fonctionne en fait, j'avais "malencontreusement" oublié d'enlever "for i=..." ! Pour l'égalité des matrices, c'est bon cela fonctionne également...
    A moins qu'il y ait quelque chose de "pas top" dans mon code, est-il vraiment utile et possible d'ameliorer cette version car elle est rapide et fonctionne correctement...? Merci en tout cas!!

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/11/2013, 22h30
  2. Parcourir une matrice
    Par Johnny P. dans le forum Débuter
    Réponses: 3
    Dernier message: 14/12/2010, 03h44
  3. comment parcourir une matrice en cercle ?
    Par info3licen dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/05/2010, 18h38
  4. Réponses: 13
    Dernier message: 30/04/2010, 10h27
  5. Parcourir une matrice
    Par tiouba dans le forum MATLAB
    Réponses: 9
    Dernier message: 14/03/2008, 09h34

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