2015-04-15 10 views
0

Я хочу вырастить вектор-столбец (не знаю, как долго это будет в конце). У меня есть тестовый код. Меня, однако, смущает его поведение. При инициализации vel=[0] вектор становится прекрасным. При инициализации с vel=[1] это не так. Появляется следующее сообщение об ошибке: «Attempted to access vel(2); index out of bounds because numel(vel)=1.»Matlab понимать растущие векторы

Почему это? Не имеет значения, что такое первый элемент моего вектора, или он делает это? Спасибо, что нарушили это для меня.

Найти код ниже:

vel=[0] 
    k=1 
    v=0 
for i=1:10; 


     if v>= vel(k) 
     vel(k+1)=v %stores all v values, for plotting and analysis of v0 behaviour 
     end 
     %assignin('base','vel',vel) 
     k=k+1 
     v=v+1 
end 
+0

Почему вы не используете массив [cell] (http://uk.mathworks.com/help/matlab/ref/cell.html) и преобразовываете его в массив после? – kkuilla

+1

@kkuilla, как это изменит что-нибудь? – TheBlackCat

+0

У вас не было бы непредсказуемого поведения растущего массива. Вы знаете размер ячейки после цикла и можете предварительно выделить это. – kkuilla

ответ

2

Да это делает разницу. Это из-за вашего предложения if: Если vel(1) = [1], цикл работает только дважды: vel(2) никогда не генерируется, если 0 >= 1 не соответствует действительности. Вот почему вы получаете «вне пределов» - «ужас».

Далее я предлагаю использовать i в цикле for.

+0

ах, чушь, глупая ошибка ... Большое спасибо за указание на это мне =) – Dahlai

2

Проблема в этой строке: if v>= vel(k).

Это означает, что, в случае, когда vel=[0], на первой итерации является v0, который является таким же, как vel(1), так что vel(k+1)=v линия выполнена. Затем во втором цикле vel(k): vel(2), который вы добавили ранее.

Однако, в случае, когда vel=[1], на первой итерации v все еще 0, что меньше, чем vel(1), так что линия vel(k+1)=v не выполняется. Это означает, что во втором цикле он пытается сделать if v>= vel(2), но так как вы не добавляли к массиву во втором цикле, индекс не существует.

Вы, вероятно, следует сделать это:

for i=1:10; 
    if v>= vel(k) 
     vel(k+1)=v; 
     %assignin('base','vel',vel) 
     k=k+1; 
     v=v+1: 
    end 
end 

образом, вы только переходите к следующему значению, когда Append фактически находится (хотите ли вы v в if тест или нет, зависит от того, что вы пытаетесь делать).

1

Вы не можете получить доступ к индексу, который находится за пределами границ, но вам разрешено создавать его и вырастить массив.

value = 1; 
value = arr(end+1); %Not allowed 
arr(end+1) = value; %Allowed 

Если у вас есть начальное условие vel = [1] условие v>= vel(k) ложно для первого цикла, и вы не вводите, если заявление, в котором вы выращиваете массив. Для следующего цикла вы пытаетесь получить доступ к vel(2), который не существует.

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