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 :

Erreur sur interp1


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Par défaut Erreur sur interp1
    j'ai fais un programme de correction d'erreurs sur des profils qui se trouvent dans des matrices de 300 lignes, avant de mettre mon programme dans une boucle i de 1 à 300 je l'ai testé sur certains profils et il marchait bien mais là en le testant sur toute la matrice il s'arrête (si je ne me trompe pas) sur la 239ème ligne et affiche ceci comme erreur
    ??? Attempted to access x(0); index must be a positive integer or logical.

    Error in ==> interp1 at 139
    h = (x(m)-x(1))/(m-1);

    Error in ==> erreur at 47
    vecteur_cor=interp1(idx,vecteur(idx),x,'linear','extrap');
    du coup je ne comprend pas pourquoi ça marche pour les autres lignes de profils et pas sur celle ci

    voici mon programme où je crois avoir traiter tous mes cas possibles de défauts
    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
    Erreur=[]; %matrice où je vais stocker mes erreurs que je détecte
    for i=1:300 % le nombre de lignes de la matrice, chaque ligne correspond à un profil à part
        vecteur=matrice(i,:);
        for j=1:1999 ;% nombre de colonne qui est 2000
            D=vecteur(j+1)-vecteur(j); %calculer la différence de hauteur entre deux point voisins
            if abs(D)>=15;% je teste s'il y a un saut de 10 pixel min, un seuil que j'ai fixé toute seule
                Erreur=[Erreur j];%la première ligne c'est pour stocker l'indice
                %             Erreur(2,)=[Erreur(2,) M_C(i,j)];% la deuxième ligne pour stocker la luminosité correspondante
                %             Erreur(3,)=[Erreur(3,) D];% la troisième ligne pour stocker la différence de gradient
            end
        end
        [lig,col]=size([Erreur]);
    if col==0;
        matrice_cor(i,:)=vecteur;
    else
        Tab_debut=[];
        Tab_fin=[];
        for j=1:(col-1); % je parcour mon tableau d'erreur
            if (Erreur(j+1)-Erreur(j))>10;% je teste la ou je trouve un saut de 10 pixel dans les indices je m'arrete et je definie touts ce qui est avant comme une seule erreur
                dernier=(Erreur(j))+1;%je met+2 juste pour etre sur que je prends une valeurs sans defaut
                premier=(Erreur(j+1))-1;
            end
            Tab_debut=[Tab_debut premier];
            Tab_fin=[Tab_fin dernier];
        end
        Tab_fin=[Tab_fin Erreur(col)];
        Tab_debut=[Erreur(1) Tab_debut];
     
        Tab_debut=unique(Tab_debut);
        Tab_fin=unique(Tab_fin);
     
        for compt=1:length(Tab_debut);
            for j=Tab_debut(compt):Tab_fin(compt);
                vecteur(j)=NaN;
            end
        end
     
        for j=1:2000;
            if vecteur(j)==639;
                vecteur(j)=NaN;
            end
        end
     
        x=1:2000;
        idx=find(~isnan(vecteur));% récupération des indices des valeurs ~= de nan
        vecteur_cor=interp1(idx,vecteur(idx),x,'linear','extrap');
        % transformation en mm
        vecteur_cor_mm=vecteur_cor/8.65;%1mm-->8.65pixels
        matrice_cor(i,:)=vecteur_cor_mm;
    end
    end
    matrice_cor

  2. #2
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Par défaut
    j'ai corrigé cette faute en mettant l'initialisation de la matrice Erreur dans la boucle i mais j'ai eu une autre erreur même pas pour la première matrice mais pour la deuxième car ce programme fait partie d'un autre qui lit plusieurs fichiers mat de matrices différentes

    et je comprends pas aussi il veut pas finir ce programme

    voici ma nouvelle erreur
    ??? Attempted to access Tab_fin(58); index out of bounds because numel(Tab_fin)=57.

    Error in ==> erreur at 36
    for j=Tab_debut(compt):Tab_fin(compt);

    Error in ==> correction_profil at 51
    [M_C_adjust_C]=erreur(M_C_adjust);

  3. #3
    Membre éclairé 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
    Par défaut
    Pour la deuxième erreur, elle provient du fait que tes vecteurs "Tab_debut" et "Tab_fin" n'ont pas la même longeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for compt=1:length(Tab_debut);
            for j=Tab_debut(compt):Tab_fin(compt);
                vecteur(j)=NaN;
            end
        end
    Ldebut = longeur de Tab_debut
    Lfin = longeur de Tab_fin

    Le bug arrive quand Lfin<Ldebut
    "compt" va de 1 à Ldebut, quand compt=Ldebut, le programme tente d'accéder à Tab_fin(Ldebut), qui n'existe pas, d'où bug...


    Ta première erreur est vraiment bizzare, elle semble provenir directement d'une erreur d'incrémentation ou de d'initialisation de la fonction "interp1".
    Et je ne voit pas pourquoi mettre l'initialisation de la matrice Erreur dans la boucle i corrige ce problème...
    Je n'ai pas vu de bug avec ma version (R2007b) (mais je n'ai pas les mêmes matrices que toi).
    Tu as quelle version ? Sinon, tape "edit interp1" pour rentrer dans le programme de "interp1".

    Bon courage...

  4. #4
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sri Lanka

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 191
    Par défaut
    oui merci, moi j'ai compris que ca provenait du fait qu'ils n'avait pas la même longueur mais d'après ce que je fais 'length(Tab_debut)' et 'length(Tab_fin)' doivent avoir être égaux car à chaque saut je détectent le dernier pixel avant le saut et le premier après donc c le même nombre dans les deux tableau normalement.

  5. #5
    Membre éclairé 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
    Par défaut Initalisation "Erreur"
    Je crois avoir trouvé ton problème.

    Il doit provenir de l'initialisation de la matrice "Erreur" où tu stockes temporairement tes erreurs.

    Normalement, pour chaque ligne de "matrice", tu cherches les erreurs pour reconstruire après "matrice_cor", "Erreur" n'est qu'une matrice qui te serts à stocker temporairement tes erreurs. Or tu l'initialises au début de ton programme. Donc à chaque ligne, ton programme va rajouter à "Erreur" les points d'erreurs.

    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Tab_debut=unique(Tab_debut);
        Tab_fin=unique(Tab_fin);
    va chercher les valeurs, non pas de la ligne considéré, mais de toutes les lignes depuis le début jusqu'à la ligne considéré.
    Ce qui cloche, c'est en fait les doublets qui peuvent exister entre les lignes.

    Donc :

    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
    for i=1:300 % le nombre de lignes de la matrice, chaque ligne correspond à un profil à part
        vecteur=matrice(i,:);
    Erreur=[]; %matrice où je vais stocker mes erreurs que je détecte
        for j=1:1999 ;% nombre de colonne qui est 2000
            D=vecteur(j+1)-vecteur(j); %calculer la différence de hauteur entre deux point voisins
            if abs(D)>=15;% je teste s'il y a un saut de 10 pixel min, un seuil que j'ai fixé toute seule
                Erreur=[Erreur j];%la première ligne c'est pour stocker l'indice
                %             Erreur(2,)=[Erreur(2,) M_C(i,j)];% la deuxième ligne pour stocker la luminosité correspondante
                %             Erreur(3,)=[Erreur(3,) D];% la troisième ligne pour stocker la différence de gradient
            end
        end
        [lig,col]=size([Erreur]);
    if col==0;
        matrice_cor(i,:)=vecteur;
    else
        Tab_debut=[];
        Tab_fin=[];
        for j=1:(col-1); % je parcour mon tableau d'erreur
            if (Erreur(j+1)-Erreur(j))>10;% je teste la ou je trouve un saut de 10 pixel dans les indices je m'arrete et je definie touts ce qui est avant comme une seule erreur
                dernier=(Erreur(j))+1;%je met+2 juste pour etre sur que je prends une valeurs sans defaut
                premier=(Erreur(j+1))-1;
            end
            Tab_debut=[Tab_debut premier];
            Tab_fin=[Tab_fin dernier];
        end
        Tab_fin=[Tab_fin Erreur(col)];
        Tab_debut=[Erreur(1) Tab_debut];
    
        Tab_debut=unique(Tab_debut);
        Tab_fin=unique(Tab_fin);
    
        for compt=1:length(Tab_debut);
            for j=Tab_debut(compt):Tab_fin(compt);
                vecteur(j)=NaN;
            end
        end
    
        for j=1:2000;
            if vecteur(j)==639;
                vecteur(j)=NaN;
            end
        end
    
        x=1:2000;
        idx=find(~isnan(vecteur));% récupération des indices des valeurs ~= de nan
        vecteur_cor=interp1(idx,vecteur(idx),x,'linear','extrap');
        % transformation en mm
        vecteur_cor_mm=vecteur_cor/8.65;%1mm-->8.65pixels
        matrice_cor(i,:)=vecteur_cor_mm;
    end
    end
    matrice_cor

  6. #6
    Membre éclairé 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
    Par défaut "premier" et "dernier"
    En plus, il peut y avoir un problème dans l'initialisation de "premier" et "dernier".

    Dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Tab_debut=[Tab_debut premier];
                Tab_fin=[Tab_fin dernier];
    Tu rajout "premier" et "dernier" à "Tab_debut" et à "Tab_fin" qu'il y ai une erreur ou non.

    Je te conseilles de faire ça (inclure ces lignes dans la boucle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        
    Tab_debut=[];
    Tab_fin=[];
        for j=1:(col-1); % je parcour mon tableau d'erreur
            if (Erreur(j+1)-Erreur(j))>10;% je teste la ou je trouve un saut de 10 pixel dans les indices je m'arrete et je definie touts ce qui est avant comme une seule erreur
                dernier=(Erreur(j))+1;%je met+2 juste pour etre sur que je prends une valeurs sans defaut
                premier=(Erreur(j+1))-1;
                Tab_debut=[Tab_debut premier];
                Tab_fin=[Tab_fin dernier];
            end
        end
    A ce moment, tu ne rajoute que s'il y a une erreur. Et donce, les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Tab_debut=unique(Tab_debut);
        Tab_fin=unique(Tab_fin);
    ne sont pas nécessaire, les indices sont identiques.

    Si tu ne veux pas faire cela, il faut par contre, faire quand même initialiser "premier" et "dernier".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Tab_debut=[];
        Tab_fin=[];
    premier=...;
    dernier=...;
        for j=1:(col-1); % je parcour mon tableau d'erreur
            if (Erreur(j+1)-Erreur(j))>10;% je teste la ou je trouve un saut de 10 pixel dans les indices je m'arrete et je definie touts ce qui est avant comme une seule erreur
                dernier=(Erreur(j))+1;%je met+2 juste pour etre sur que je prends une valeurs sans defaut
                premier=(Erreur(j+1))-1;
            end
            Tab_debut=[Tab_debut premier];
            Tab_fin=[Tab_fin dernier];
        end
    Dans ce cas, il faut faire attention aux valeurs de "premier" et "dernier" pour éviter les doublets...

Discussions similaires

  1. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  2. [VBS] Erreur sur "AddWindowsPrinterConnection"
    Par Admin dans le forum VBScript
    Réponses: 5
    Dernier message: 27/03/2004, 16h15
  3. Erreur sur serveur lié
    Par k-lendos dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/03/2004, 15h21
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Erreur sur le TNSListener après installation de 9iAS
    Par Patmane dans le forum Installation
    Réponses: 4
    Dernier message: 04/02/2004, 11h16

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