2013-08-25 2 views
0

Я пишу простой скрипт в Matlab, где я сравниваю соседний элемент и удаляю один из них, если разница между ними одна.Удаление элементов в массиве, индекс за пределами границ (Matlab)

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

конец

Однако я получаю сообщение об ошибке, что мои индексы из границы. Я не уверен, почему, мой алгоритм мне кажется, должен работать. Может быть, есть более простой способ сделать это с помощью внутренних функций?

ответ

3

проблема заключается в том, что когда вы делаете:

Vector(i) = [] 

вы меняете размер йо ur, и это приведет к первому результату, который вы не ищете, и второе условие if, которое следует в коде, не мешает сценарию выйти за пределы. Одним из способов решения этого может быть использование вспомогательного вектора.

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 

Обратите внимание, что я полагаю, что вы всегда хотите сохранить последний элемент.

Если вы хотите, чтобы избежать для петель вы могли бы также сделать:

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

Я думаю, что это

если Vector (я + 1) - вектор (я) == 1

может быть проблема, если у вас есть вектор размером 1 индекс я + 1 не существует

+0

Я думаю, что вы правы. Может быть, есть лучший способ сделать это, не сравнивая элементы таким образом. – l3win

2

pabaldenedo правильно, что проблема удаления элементов в середине итерации.

Лучшее решение просто векторизовать поиск и удаление:

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

Это также должно быть намного быстрее.

Если повторяющиеся элементы должны быть удалены, если они больше, чем предыдущий элемент, вы можете повторить это. К сожалению, у MATLAB нет цикла 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

Почему вы должны включить нуль в вектор в первой строке? mask = [diff (Vector) == 1, 0] – l3win

+0

Ничего, получилось, thx – l3win

Смежные вопросы