2017-01-19 11 views
0

Я пытаюсь изменить значение z по +1 каждого семьсот пятидесятых, 1500-, 2250th, ... и т.д. петли и это то, что я написал:MATLAB - состояние, чтобы сделать что-то только один раз й числа петель

len = 1500000; 
y = 750; 
z = 1; 
for i = 1:len 
    if (i == [y.*(1:2000)]) 
     z = z + 1; 
    end 
end 

Почему значение z не меняется? Может кто-нибудь сказать мне, что случилось с моим заявлением if, пожалуйста?

ответ

3

MATLAB считает массив равным true, если все элементы: true. Так с этим в виду, если мы посмотрим на ваше условное для if заявления

i == (y .* (1:2000)) 

Что это возвращает массив из 2000 значений, где они либо все false (в том случае, когда i не кратна y) и все false за исключением одного true стоимость если есть. Даже если есть true, это по-прежнему оценивается false, и ваш оператор if никогда не будет оценен.

Лучший способ сделать это состоит в использовании mod, чтобы проверить, является ли данный i кратно y

if mod(i, y) == 0 
    z = z + 1; 
end 

Однако, если только содержимое вашей петли, что вы показали, то вы можете просто опустить итерации, что вы не заботитесь о

for i = y:y:len 
    z = z + 1; 
end 

Если вы на самом деле хотите, чтобы сравнить массив, как вы показали, хотя, вы бы лучше, чтобы вычислить y .* 1:2000 вне цикла, а затем использовать ismember, чтобы увидеть, если i находится в массиве

tmp = y .* (1:2000); 

for i = 1:len 
    if ismember(i, tmp) 
     z = z + 1; 
    end 
end 
+0

Большое спасибо! Теперь это имеет большой смысл. – tamkrit