Изменение для цикла индексирует переменную в цикле

Я должен изменить свою переменную цикла в повторении, поскольку я должен получить доступ к элементам массива в цикле, который изменяет 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?

5
задан bluish 21 January 2013 в 12:43
поделиться

4 ответа

Программные циклы в Matlab имеют ужасную производительность. Как уже говорили все, делайте это с помощью встроенных функций Matlab и векторизуйте все, насколько это возможно. Если вам действительно нужны циклические конструкции, возможно, вам подойдет C :)

0
ответ дан 18 December 2019 в 14:43
поделиться

Для этого следует использовать цикл 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
10
ответ дан 18 December 2019 в 14:43
поделиться

Да, вы можете использовать цикл (пока), но почему? Изучите способ работы с MATLAB. Избегайте этого цикла, в котором нет необходимости.

Например, используйте эту единственную строку кода, которая просто добавляет столько элементов, сколько нужно добавить.

que = [que,repmat(5,1,10 - length(que))];

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

Я также могу спросить, почему вы определяете len как глобальную переменную в опубликованном вами коде?

3
ответ дан 18 December 2019 в 14:43
поделиться

Ваш вектор возврата - это именно то, что вы закодировали. Цикл 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 за счет перераспределения памяти.

0
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: