оператор if для пропуска определенных значений в цикле - PullRequest
0 голосов
/ 02 июля 2018

У меня есть диапазон значений X и Y, и у меня есть домен, в котором я не хочу вычислять значения узлов внутри. Я хочу иметь оператор if внутри цикла в Matlab, чтобы пропустить их.

Например:

  • Диапазон: X = [1:20] и Y = [1:20].
  • Я хочу игнорировать узлы в этом диапазоне: X = [5:7] и Y = [12:14].

Я думаю, что код должен быть примерно таким:

for X=1:20
    for Y=1:20
        if X=5:7 & Y=12:14
            return
        end
        % the operation here !
        T(X,Y) = lab lab lab
    end
end

Однако я не уверен, как правильно написать условие.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я предлагаю альтернативу решению Wolfie, чтобы заранее сгенерировать все индексы, а затем применить один цикл:

Xvect = repmat(X, length(Y), 1);
Yvect = repmat(Y, 1, length(X));
Xvect = Xvect(:);
Yvect = Yvect(:);

Xis5to7 = (Xvect >= 5) & (Xvect <= 7);
Yis12to14 = (Yvect >= 12) & (Yvect <= 14);
XYcomb = ~(Xis5to7 & Yis12to14); % This is the range to exclude, negate it.

allX = Xvect(XYcomb);
allY = Yvect(XYcomb);
(par)for i = 1 : length(allX);
   X = allX(i);
   Y = allY(i);
   Ltemp(i) = ...;
end
L(XYcomb) = Ltemp;

Преимущество состоит в том, что комбинации (allX, allY) отображаются спереди плюс, благодаря одной петле, очень удобно делать из него parfor.

0 голосов
/ 02 июля 2018

Вы можете использовать ismember или комбинацию any и == для условия, а continue - команда для перехода к следующему индексу цикла ...

% ismember example
for X = 1:20
    for Y = 1:20
        if ismember( X, 5:7 ) && ismember( Y, 12:14 )
            continue
        end
        % your loop operations
    end
end

В этом случае вы можете заменить условие if на

if any( X == 5:7 ) && any( Y == 12:14 )
...