2015-06-01 1 views
0

Пример моего кода: (. Фактический код очень долго, можно найти в истории редактирования)Динамически проверить условие итерации цикла - MATLAB

X = {'a','b','c','d'} 

for i = 1:length(X) 
    if X(i) == 'a' %// for example 
      X(i)=[]; 
    end 
end 

Почему не встречное остановку 3-я итерация? Он попытался продолжить до 4-й итерации и создал следующую ошибку:

Индекс превышает размеры матрицы.

Но поскольку первый элемент «a» был удален, фактический размер массива стал 3 (вместо 4). Не следует ли остановить «цикл» после третьей итерации?

+0

Я не» Теперь у меня есть Matlab, но я проверю, что сегодня, интересно ...;) –

+0

Какова длина region_L? – GameOfThrows

+0

до длины цикла (region_L) = 11 – Devel

ответ

3

вы, наверное, имели в виду

X = ['a','b','c','d'] 

(в квадратных скобках), так X является массив символов (строка), а не массив ячеек


проблема заключается в том, что в цикле удалить одну запись от X, поэтому X оставлен с 3 вводами. Таким образом, когда вы пытаетесь получить доступ к своей записи 4 (на итерации i=4), вы получите сообщение об ошибке.

Это происходит из-за того, что условие выхода for равно , которое не подвергалось повторной оценке на каждой итерации. В for заявлении вы говорите, что i должен бежать от 1 к 4 (4 это значение length(X)в то время), и это то, что происходит.

Для достижения желаемого вам, вероятно, необходим цикл while.Условие while -loop равно , оцениваемое после каждой итерации, используя текущие значения для переменных, чтобы определить, должна ли произойти новая итерация или нет. Таким образом, в следующем коде только 3 итерации происходит, и вы не получите никаких ошибок:

i = 1; 
while i<=length(X) 
    if X(i) == 'a' 
     X(i) = []; 
    else 
     i = i + 1; 
    end 
end 

Счетчик i должен увеличиваться только тогда, когда ни один элемент X не был удален. Благодаря @matlabgui для улова.

+0

спасибо, ваша идея была лучшей и без конфликтов больше – Devel

+0

@LuisMendo вам нужно добавить 'continue' после' X (i) = [] '- рассмотрим случай, когда' X = ['a' 'a' 'c' 'd'] ' – matlabgui

+1

@matlabgui Спасибо! Вы правы, я об этом не думал. Я отредактировал ответ. Теперь я увеличиваю счетчик 'i' только в том случае, если элемент не был удален. Я думаю, что это то же самое, что «продолжить», но я нахожу это более ясным. –

0

Массивы MATLAB начинаются с 1 , а затем вам нужно уменьшить конец цикла, потому что ваш вектор уменьшился или получил вторую переменную.

И я был не в состоянии сравнить символы .. но с числами он работал

поэтому было бы

j=0 
for i = 1:length(X) 
    j=j+1; 
    if X(j) == 'a' %for example 
      X(j)=[]; 
      j=j-1; 
    end 
end 
0

Вы получите сообщение об ошибке, так как индекс от Matlab любого массива начинается с 1, и вы сделали for-loop, начиная с 0.

+1

извините за 0, это была ошибка ввода – Devel

0

Я не могу воссоздать проблему, код использует ячейки, и вы не можете индексировать 0-я ячейка. Поэтому я редактировал закодировать выглядеть следующим образом:

for i = 1:length(X) 
    if X{i} == 'a' %for example 
     X{i}=[]; 
    end 
end 

>>X = 

[] 'b' 'c' 'd' 

Никаких проблем не обнаружено

EDIT: на основе кода, вы удаляете ячейки во время выполнения этого цикла; попробуйте удалить значение в вашей ячейке вместо того, чтобы удалить ячейку, вы хотите использовать фигурные скобки {} вместо [], и если вы хотите удалить пустые ячейки, просто сделать это в конце с помощью:

X(~cellfun('isempty',X)) 
+0

Вы правы, но у меня есть более сложный код, который я попытался объяснить простым кодом (я отредактирую и поставлю код, может быть, вы увидит проблему) спасибо – Devel

+0

@Devel Я отредактировал свой ответ, пожалуйста, проверьте, не имеет ли значения – GameOfThrows

1

Я подозреваю, что ваш код:

X={'a','b','c','d'} 

for i = 1:length(X) 
    if X{i} == 'a' %for example 
      X(i)=[] 
    end 
end 

Когда X{i} == «а» вы удаляете X(i) -> т.е. X становится 3 длиной вместо 4. Но цикл запрограммирован, чтобы перейти к длине X до начала (т.е. 4).

В такой ситуации вы можете сделать петлю в обратном направлении:

X={'a','b','c','d'} 

for i = length(X):-1:1 
    if X{i} == 'a' %for example 
      X(i)=[] 
    end 
end 

Другой метод для хранения inedx в петлю, а затем удалить в конце:

X={'a','b','c','d'} 

index = false(length(X),1); 
for i = 1:length(X) 
    if X{i} == 'a' %for example 
      index(i)= true; 
    end 
end 
X(index) = []; 
+0

Да, это точно проблема, но я должен начать свою петлю в правильном направлении: для i = 1: length (X) – Devel

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