主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。

제어 흐름

조건부제어- 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!')结束

如果开关모두에대해matlab®에서는첫번째真实조건에해당하는코드를실행하고코드블록을종료합니다。각각의조건문에는结束키워드가필합니다。

알고있는이산값이면서값의개수가많을때는일반적으로开关문을사용하는편이如果문을사용하는것보다읽기편합니다。하지만开关값과情况下값간에부등식을테스트할수는없습니다。예를들어,다음과같은조건유형은开关로는구현할수없습니다。

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

조건문의배열비교

관계연산자와如果문이행렬에대해동작하는방식을이해하는것은중합니다。두변수간의등식을확하려는경우다음을사용해야할수있습니다。

如果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

두변수간의동일성을확하는올바른방법은isequal함수를사용하는것입니다。

如果isequal(A, B),…

isequal如果함수실행결과로,행렬대신스칼라논리값1真正的에해당)또는0)을반환합니다。위의一个행렬과B행렬을사용하면다음과같은결과를얻게됩니다。

isequal(A,B) ans =逻辑0

다음은이러한부분을보다중점적으로설명하기위한또다른예제입니다。一个B가스칼라경우다음프로그램은절대“예기치못한상황”에도달하지않습니다。하지만이전에소개한,열을서로교환한마방진을포함해대부분의행렬쌍에서는A > bA < bA == b중어떤행렬조건도모든소에대해true가아니므로其他的절이실행됩니다。

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

다음을포함한여러함수가如果조건사용시행렬비교결과를스칼라조건으로줄이는데도움이됩니다。

Isequal isempty all any

루프제어- for, while, continue, break

이섹션에서는프로그램루프를제어하는다음matlab함수에대해다룹니다。

루프는특정명령문그룹을,미리지정한고정횟수만큼반복해서실행합니다。이와짝을이루는结束는해당명령문의끝을@ @시합니다。

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

내부명령문이세미콜론으로끝나면출력이반복해` ` ` ` `시되지않으며,루프뒤에r이있으면최종결과만@ @시됩니다。

특히,루프가중첩되어있는경우에는가독성을높이기위해루프를안쪽으로들여쓰는것이좋습니다。

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

루프는논리조건의제어에따라특정명령문그룹을무한으로반복해서실행합니다。이와짝을이루는结束는해당명령문의끝을@ @시합니다。

다음은구간이분법을사용하여다항식의해를찾는완전한프로그램으로,여기에는如果其他的结束가포함되어있습니다。

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.—2x—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프로그램의실행속도를높이기위한한가지방법은프로그램을구성할때사용하는알고리즘을벡터화하는것입니다。다른프로그래밍언어에서는루프나루프를사용할수있는데비해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인터프리터에서는루프를돌때마다요소하나씩,r벡터를확장하게됩니다。벡터사전할당을활용하면이단계를수행할필가없어실행속도가빨라집니다。