Как перезапустить итерацию цикла в MATLAB? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь перезапустить цикл for, если условие не стратифицировано. Я могу сделать это с помощью while, поскольку я хочу, чтобы цикл выполнялся в течение определенного числа итераций. Я пытался установить iter=iter-1 внутри оператора if, но это не сработало. Есть предложения?

R=2*10^3;
lamda= 0.00001;
h=100;
a = 9.6117;
b = 0.1581;


for iter=1:10

     M=poissrnd(lamda*R^2);

     xx=R*rand(1,M); 
     yy=R*rand(1,M); 
     zz=ones(1,M)*h;

     BS=[xx' yy' zz'];
     user=[0,0, 0];

     s=pdist2(BS(:,1:2),user(1,1:2));    
     anga=atand(h./s);
     PL=1./(1+(a*exp(b*(a-anga))));
     berRV=binornd(1,PL);

     if berRV(1)==1       
         % do something    
     else
         % repeat
     end

end

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Самый простой подход здесь был бы с циклом while внутри цикла for:

for iter=1:10
    berRV(1) = 0
    while berRV(1)~=1       
        % original loop code here
    end
    % do something
end

[К сожалению, у MATLAB нет петли do...while, это сделало бы вышеупомянутое немного чище.]

0 голосов
/ 31 октября 2018

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

for iter=1:10
    while 1
        % loop code here
        if berRV(1) == 1
            break
        end
    end
end

Идея аналогична той, которую представляет Крис, а именно: вы повторяете тело цикла for до тех пор, пока не будет выполнено какое-то условие. Разница заключается только в том, как вы завершаете цикл while,

0 голосов
/ 30 октября 2018

Вы можете сделать это с помощью цикла while со сравнением того, было ли определено количество необходимых результатов. См. Комментарий о сохранении найденных значений, так как вы не указали, что нужно делать, когда выполняется условие, которое вы ищете.

R=2*10^3;
lamda= 0.00001;
h=100;
a = 9.6117;
b = 0.1581;

total_results_found = 0;
needed_results_found = 10;

while total_results_found < needed_results_found

    M=poissrnd(lamda*R^2);

    xx=R*rand(1,M);
    yy=R*rand(1,M);
    zz=ones(1,M)*h;

    BS=[xx' yy' zz'];
    user=[0,0, 0];

    s=pdist2(BS(:,1:2),user(1,1:2));
    anga=atand(h./s);
    PL=1./(1+(a*exp(b*(a-anga))));
    berRV=binornd(1,PL);

    if berRV(1)==1
        % save the result here

        % iterate the counter
        total_results_found = total_results_found + 1;
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...