Я должен изменить свою переменную цикла в повторении, поскольку я должен получить доступ к элементам массива в цикле, который изменяет w.r.t размер в цикле.
Вот мой фрагмент кода:
que=[];
que=[2,3,4];
global len;
len=size(que,2)
x=4;
for i=1:len
if x<=10
que(x)= 5;
len=size(que,2)
x=x+1;
end
end
que
Массив должен распечатать как:
2 3 4 5 5 5 5 5 5 5
Но это печатается как это:
2 3 4 5 5 5
В Visual C++ массив вычисляется правильно, и целый массив 10 элементов печатается, который увеличивается во время выполнения.
Как я могу выполнить это в Matlab?
Программные циклы в Matlab имеют ужасную производительность. Как уже говорили все, делайте это с помощью встроенных функций Matlab и векторизуйте все, насколько это возможно. Если вам действительно нужны циклические конструкции, возможно, вам подойдет C :)
Для этого следует использовать цикл while вместо цикла for :
que = [2 3 4];
x = 4;
while x <= 10
que(x) = 5;
x = x+1;
end
Или вы можете вообще избежать использования циклов, векторизовав свой код одним из следующих способов:
que = [2 3 4]; %# Your initial vector
%# Option #1:
que = [que 5.*ones(1,7)]; %# Append seven fives to the end of que
%# Option #2:
que(4:10) = 5; %# Expand que using indexing
Да, вы можете использовать цикл (пока), но почему? Изучите способ работы с MATLAB. Избегайте этого цикла, в котором нет необходимости.
Например, используйте эту единственную строку кода, которая просто добавляет столько элементов, сколько нужно добавить.
que = [que,repmat(5,1,10 - length(que))];
Если у вас есть другой способ определить, как долго ваша цель для этой переменной, все равно будет возможно создать массив в одну строку, используя аналогичную схему.
Я также могу спросить, почему вы определяете len как глобальную переменную в опубликованном вами коде?
Ваш вектор возврата - это именно то, что вы закодировали. Цикл for будет выполняться ровно 3 раза - длина вектора que, вот почему вы получаете три 5s вместо семи. Изменение len
внутри цикла не поможет, так как диапазон для переменной i
определен до запуска цикла for и не может быть изменен во время выполнения. Другими словами, после запуска цикла for цикл забывает, что такое len
, он просто помнит, что i
нужно изменить с 1 на 3.
Всегда ли начальный x
равен length(que)+1
?
Какой вектор вы ожидаете, если, допустим, x=5?
2 3 4 0 5 5 5 5 5
? или 2 3 4 5 5 5 5 5 5
?
или 2 3 4 5 5 5 5 5 5 5
? (фактически не зависит от x)
В первом случае лучшим matlab-ish решением будет решение от @gnovice:
que = [2 3 4];
x = 5;
y = 10;
val = 5;
que(x:y)=val;
Во втором случае еще одно решение от @gnovice:
que = [2 3 4];
x = 5;
y = 10;
val = 5;
que = [que, val.*ones(1,y-x+1)];
или
que = [que, repmat(val, 1, y-x+1)];
В третьем случае это решение @woodchips:
que = [que, repmat(val, 1, y - length(que))];
В вашей ситуации использование цикла (for или while) очень плохо, потому что при каждом цикле вы увеличиваете размер вектора que за счет перераспределения памяти.