2013-08-25 3 views
0

J'écris un script simple dans Matlab où je compare un élément adjacent et supprime l'un d'entre eux s'il y a une différence entre eux.Supprimer des éléments dans array, index out of bounds (Matlab)

for i=1:length(Vector) - 1 
if Vector(i+1) - Vector(i) == 1 
    Vector(i) = []; 
end 
if i == length(Vector) 
    break 
end 

fin

Cependant, je reçois une erreur que mes indices sont hors limite. Je ne sais pas pourquoi, mon algorithme me semble devoir fonctionner. Y a-t-il peut-être un moyen plus simple de faire cela avec des fonctions internes?

Répondre

3

le problème est que lorsque vous faites:

Vector(i) = [] 

vous changez la taille de yo ur array et cela produira d'abord un résultat que vous ne cherchez pas et ensuite la condition if qui suit dans le code n'empêche pas le script de sortir des limites. Une façon de résoudre cela pourrait être d'utiliser un vecteur auxiliaire.

Vector = [1,5,6,3,5,7,8,9]; 
tmp = []; 
j = 1; 

for i=1:length(Vector)-1 
    if Vector(i+1) - Vector(i) == 1 
     continue 
    end 
    tmp(j) = Vector(i); 
    j = j + 1; 
end 

tmp(end+1) = Vector(end); 
Vector = tmp 

Notez que je suppose que vous voulez toujours conserver le dernier élément.

Si vous voulez éviter les boucles, vous pouvez également faire:

Vector = [1,5,6,3,5,7,8,9]; 
tmp = circshift(Vector, [0,-1]); %shifted version of Vector 
tmp(end) = Vector(end)+2; %To ensure that the last element will be included 
index = tmp-Vector ~= 1; %indices that satisfy the condition 
Vector = Vector(index) 
0

Je pense que ce

si Vector (i + 1) - Vector (i) == 1

pourrait être le problème lorsque vous avez un vecteur de taille 1 l'indice i + 1 n'existe pas

+0

Je pense que vous avez raison. Peut-être qu'il y a une meilleure façon de le faire en ne comparant pas les éléments de cette manière. – l3win

2

pabaldenedo est exact que le problème supprime des éléments au milieu de l'itération.

Une meilleure solution est tout simplement vectoriser la recherche et le retrait:

mask = [diff(Vector) == 1, 0]; % find elements where the step is 1 
Vector = Vector(~mask);  % exclude them 

Cela devrait également être beaucoup plus rapide.

Si des éléments répétés doivent être supprimés lorsqu'ils sont supérieurs à l'élément précédent, vous pouvez le répéter. Malheureusement MATLAB n'a pas de boucle do-while.

mask = [diff(Vector) == 1, 0]; % find elements where the step is 1 
while any(mask)    % if we found elements to exclude 
    Vector = Vector(~mask);  % exclude them 
    mask = [diff(Vector) == 1, 0]; % search again 
end 
+0

Pourquoi devez-vous inclure le zéro dans le vecteur de la première ligne? mask = [diff (Vector) == 1, 0] – l3win

+0

Peu importe, je l'ai, merci – l3win

Questions connexes