主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

フロ,制御

条件付き制御- if, else,切换

条件付きステ,トメントでは,ランタ,ムに実行するコ,ドのブロックを選択できます。最もシンプルな条件付きステ,トメントは,如果ステ,トメントです。以下に例を示します。

%生成随机数a = randi(100,1);%如果是偶数,则除以2如果rem(a, 2) == 0 disp('a是偶数')b = a/2;结束

如果ステ,トメントでは,オプションのキ,ワ,ドelseifまたは其他的を使用して,代替の選択肢を含めることができます。以下に例を示します。

A = randi(100,1);如果disp < 30 ('small'),则elseif disp < 80 ('medium'),否则disp('large')结束

または,一連の既知の値を使用して等価性をテストする場合は,开关ステ,トメントを使用します。以下に例を示します。

[dayNum, dayString] = weekday(date, 'long', 'en_US');switch dayString case 'Monday' disp('工作周的开始')case 'Tuesday' disp('Day 2') case 'Wednesday' disp('Day 3') case 'Thursday' disp('Day 4') case 'Friday' disp('工作周的最后一天')否则disp('Weekend!')结束

如果开关のいずれの場合も,最初の真の条件まで対応するコ,ドが実行されて,コ,ドブロックが終了されます。各条件付きステ,トメントでは,结束キ,ワ,ドが必要です。

一般的に,多数の既知の値で条件分岐する場合は,如果ステ,トメントよりも开关ステ,トメントの方が読みやすくなります。ただし,开关の値と情况下の値の間で非等価性をテストすることはできません。たとえば,开关で次のような条件を使用することはできません。

yourNumber = input('输入一个数字');if yourNumber < 0 disp('Negative') elseif yourNumber > 0 disp('Positive') else disp('Zero')结束

条件付きステ,トメントにおける配列の比較

関係演算子と如果ステ,トメントが行列にどのように機能するかを理解することは重要です。2 .の変数間の等価性をチェックする場合,次のようにします。

如果A == B,……

これは正しいmatlab®のコ,ドで,一个Bがスカラ,であるときに予想されることを実行します。しかし,一个Bが行列の場合,A == bはそれらが“等しいかどうか”をテストせずに,それらの“どこが等しいか”をテストします。結果は,要素ごとの等価性を表わす0と1からなる行列になります。

A =魔术(4);B = a;B(1,1) = 0;A == B ans = 4×4逻辑阵列0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

2 .の変数間の等価性をチェックする適切な方法は,関数isequalを使うことです。

如果isequal(A, B),…

isequalは,関数如果による結果の表現として,行列ではなく“スカラ”逻辑値1真正的を表す)または0)を出力します。上記の行列一个Bを使って以下を得ます。

isequal(A,B) ans =逻辑0

次に,このことを強調する他の例を示します。一个Bがスカラ,である場合,次のプログラムは予想通りの結果になります。列を交換した魔方陣を含む行列のほとんどの組に対して,行列の条件A > bA < b,またはA == b“どの”要素に対しても真ではないため,其他的句が実行されます。

if A > B 'greater' elseif A < B 'less' elseif A == B 'equal' else错误('意外情况')结束

次の関数は,如果と共に使って,行列の比較結果をスカラ,条件にするのに使うことができます。

Isequal isempty all any

ル,プ制御—用于while, continue, break

この節では,プログラムのル,プ制御を与える以下のmatlab関数を述べます。

ル,プは,前もって定義した固定回数だけステ,トメント群を繰り返し実行します。対応する结束でステ,トメント群を区別します。

对于n = 3:32 r(n) = rank(magic(n));结束r

ループ内のステートメントの最後のセミコロンは,繰り返し表示されないようにして,最終結果を表示するためループの後にrを使います。

読みやすくするため,特に入れ子状態のときには,ル,プに,ンデントを適用することは良い考えです。

H(i,j) = 1/(i+j);结束结束

ル,プは,回数を定義しないで,繰り返し回数を論理条件によりコントロ,ルするときに使います。対応する结束でステ,トメント群を区別します。

如果其他的结束を使ったプログラムを示します。これは,多項式のゼロを見けるために区間2分割を使います。

A = 0;fa = -Inf;B = 3;fb = Inf;而b-a > eps*b x = (a+b)/2;Fx = x^3-2*x-5;如果sign(fx) == sign(fa) a = x;Fa = fx;Else b = x;Fb = fx; end end x

結果は,多項式x3.- 2 * 5の根になります。まり,次のようになります。

X = 2.09455148154233

如果ステ,トメントの節で議論した行列比較に関する注意は,ステ,トメントにも適用されます。

继续

ステ,トメント继续は,ル,プの本体の中で,,または,のル,プの中で,あるステ,トメントをスキップして,次の反復をコントロ,ルします。入れ子のル,プ内の继续ステ,トメントに対して同じことが当てはまります。まり,继续ステ,トメントが遭遇したル,プの初めで実行が続きます。

次の例は,继续ルプを使って,ファルmagic.mの中の空白行とコメント行をスキップしたコドのランをカウントするものです。继续ステ,トメントを使って,空白行やコメント行に出会うとカウントしないで,magic.mの中の次のラ@ @ンに進みます。

Fid = fopen('magic.m','r');计数= 0;当~feof(fid) line = fgetl(fid);If isempty(line) || strncmp(line,'%',1) || ~ischar(line) continue end count = count + 1;结束fprintf('%d lines\n',count);文件关闭(fid);

打破

打破ステ,トメントは,またはル,プから抜け出すためのものです。入れ子になったル,プでは,打破は最下部のル,プのみから退出します。

前の節の例を改良したものを以下に示します。打破の使用はなぜ良い考えなのでしょうか?

A = 0;fa = -Inf;B = 3;fb = Inf;而b-a > eps*b x = (a+b)/2;Fx = x^3-2*x-5;If fx == 0 break elseif sign(fx) == sign(fa) a = x;Fa = fx;Else b = x;Fb = fx; end end x

プログラムの終了-返回

この節では,プログラムを最後まで実行せず途中で終了させるmatlab関数返回にいて述べます。

出力

返回はコマンドの現在のシ,ケンスを終了し,起動関数またはキ,ボ,ドに制御を戻します。返回は,键盘モ,ドの終了にも使用されます。呼ばれた関数は通常その機能を終了すると,それを起動した関数に制御を移します。呼ばれた関数の中に返回を挿入することで強制的に早く終了し起動した関数に制御を移すことができます。

ベクトル化

MATLABをスピードアップする1つの方法は,Mファイルのアルゴリズムをベクトル化することです。他のプログラミング言語がまたはル,プを使う部分で,matlabではベクトルまたは行列演算を使うことができます。次のコ,ドは,簡単な例として,対数表を作成するものです。

X = 0.01;Y = log10(x);对于k = 1:9 999 x(k+1) = x(k) + 0.01;Y (k+1) = log10(x(k+1));结束

同じコ,ドをベクトル化すると,次のようになります。

X = .01:.01:10;Y = log10(x);

さらに複雑なコ,ドに対しては,ベクトル化の効果が常に顕著とは限りません。

事前割り当て

コードの一部をベクトル化することができない場合,出力結果をストアするベクトルまたは配列を前もって設定しておくことによってル,プをスピ,ドアップできます。たとえば,次のコ,ドは,ル,プで作成されるベクトルを前もって作成するために関数0を使うものです。これにより,ル,プの実行はかなり速くなります。

R = 0 (32,1);对于n = 1:32 r(n) = rank(magic(n));结束

前の例の中で前もってスペースを設定しないと,MATLABインタープリターは,ループに関する1回の実行で,1要素ずつrベクトルを拡大します。ベクトルの領域を前もって確保することは,この手順を省略させ,より高速の実行になります。