Shortening nested If statements

HI Friends,
I am trying to shorten this nested if statement, is there a way to make it more compact ?
GR = [3.78 2.06 1.58 1.21 0.82]
for i=1:x
ig(i) = 3.78;
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
% Gear change with speed exceeding 2000 rpm
if N(i) > Nopt
ig(i) = 2.06;
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
if N(i) > Nopt
ig(i) = 1.58;
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
if N(i) > Nopt
ig(i) = 1.21;
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
if N(i) > Nopt
ig(i) = 0.82;
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
end
end
end
end
end

 採用された回答

Jeff Miller
Jeff Miller 2018 年 3 月 20 日

1 投票

Approximately:
GR = [3.78 2.06 1.58 1.21 0.82];
magic_constants = [3.78 2.06 1.58 1.21 0.82];
for i=1:x
j = 0;
Less = false;
while ~Less & (j<numel(magic_constants)
j = j + 1;
ig(i) = magic_constants(j);
N(i) = Vel_mps(i)*io*ig(i)*60/pi/Dt;
Less = N(i) <= Nopt;
end;
end;

4 件のコメント

DIP
DIP 2018 年 3 月 21 日
Thank you Jeff..what is magic_constants?
Jeff Miller
Jeff Miller 2018 年 3 月 21 日
Just an arbitrary name for an array to store your different ig values, initialized at the top. I wasn't sure what to call them, since I'm not sure what they reflect.
DIP
DIP 2018 年 3 月 21 日
Thank you Jeff.
Jan
Jan 2018 年 3 月 21 日
編集済み: Jan 2018 年 3 月 21 日
This code can be written with a FOR loop also:
GR = [3.78 2.06 1.58 1.21 0.82];
n = numel(GR);
for i = 1:x
c = Vel_mps(i) * io * 60 / pi / Dt;
for j = 1:n
d = GR(j) * c;
if d > Nopt
N(i) = d;
ig(i) = GR(j);
break; % Break: for j
end
end
end
And with FIND:
GR = [3.78 2.06 1.58 1.21 0.82];
NoptX = Nopt / (io * 60 / pi / Dt);
for i = 1:x
d = Vel_mps(i) * GR;
j = find(d > NoptX, 1);
N(i) = d(j);
ig(i) = GR(j);
end

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeSimulink についてさらに検索

質問済み:

DIP
2018 年 3 月 20 日

編集済み:

Jan
2018 年 3 月 21 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by