講義注第五次為上機(jī)課-第7講matlab程序設(shè)計(jì)_第1頁(yè)
講義注第五次為上機(jī)課-第7講matlab程序設(shè)計(jì)_第2頁(yè)
講義注第五次為上機(jī)課-第7講matlab程序設(shè)計(jì)_第3頁(yè)
講義注第五次為上機(jī)課-第7講matlab程序設(shè)計(jì)_第4頁(yè)
講義注第五次為上機(jī)課-第7講matlab程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

課程提綱M文件介紹控制語(yǔ)句函數(shù)變量及變量作用域程序設(shè)計(jì)的輔助函數(shù)程序設(shè)計(jì)的優(yōu)化程序調(diào)試信息接口小結(jié)page2——華氏溫度和攝氏溫度的轉(zhuǎn)換%輸出攝氏溫度:print

T(C)9Problem:

設(shè)計(jì)一個(gè)

程序,

一個(gè)華氏溫度的輸入,輸出攝氏溫度。Solution:Step

1:清晰地陳述出你要解決的問(wèn)題;“將華氏溫度轉(zhuǎn)換為攝氏溫度并輸出”Step

2:

確定程序的輸入變量和輸出變量;“輸入變量:華氏溫度;輸出變量:攝氏溫度”Step3:

設(shè)計(jì)程序偽代碼;%

華氏溫度:input

T(F)%溫度轉(zhuǎn)換:T(C)

5

(T

(F)

32)page3Step

4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%

Script

file:temp_conversion.m%fprintf('%6.2f

degrees

Fahrenheit=

%6.2f

Celsius.\n',temp_f,temp_k);“程序信息”“名字”%Purpose:

“用途”%

To

convert

an

input

temperature

from

degrees

Fahrenheit

to%

an

output

temperature

in

Celsius.%%Record

of

revisions:“修改記錄”%

Date

Programmer

Description

of

change%

====

==========

================%

21/10/13

Y.Y.Guo Original

code%%Define

variables:“變量定義”%

temp_f--Temperature

in

degrees

Fahrenheit%

temp_k

--Temperature

in

Celsius%Prompt

the

user

for

the

input

temperature“.

華氏溫度”temp_f=input('Enter

the

temperature

in

degrees

Fahrenheit:');%

Convert

to

Celsius.temp_k=(5/9)*(temp_f-32);%

Writeout

the

result.“溫度轉(zhuǎn)換”“輸出攝氏溫度”page4Step

5:調(diào)試程序>>

run('C:\Program

Files\

\R2010a\bin\temp_conversion.m')Enter

the

temperature

in

degrees

Fahrenheit:120120.00

degrees

Fahrenheit

=

48.89

Celsius.Enter

the

temperature

in

degrees

Fahrenheit:100100.00

degrees

Fahrenheit

=

37.78

Celsius.初學(xué)者總是期望,拿到問(wèn)題就能寫(xiě)出漂亮的代碼與完美無(wú)誤的程序,而實(shí)際上這是不可能的!的變量、語(yǔ)句與語(yǔ)法只是血肉般的簡(jiǎn)單存在,在任何一種語(yǔ)言中都能找到,而一個(gè)良好的編程則是般的永恒存在!程序設(shè)計(jì)中,寫(xiě)代碼只是簡(jiǎn)單的一半,另一半則是問(wèn)題的分析與偽代碼的設(shè)計(jì)!page5M文件介紹是一種高級(jí)計(jì)算機(jī)語(yǔ)言,因而也能夠編制一種以.m為擴(kuò)展名的文本文件,簡(jiǎn)稱M文件。是一種解釋性語(yǔ)言,命令在運(yùn)行時(shí)被翻譯為機(jī)器語(yǔ)言被執(zhí)行,M文件就是命令的集合。M文件是純文本(ASCII碼)文件,因而便于進(jìn)行編寫(xiě)和修改。擴(kuò)展名必須為.m。M文件分類:命令式(Script):命令行的簡(jiǎn)單疊加函數(shù)式(Function):參數(shù)傳遞和函數(shù)調(diào)用page6M文件建立與編輯M文件建立:窗口中菜單項(xiàng)File-->New-->Script/Function單擊圖標(biāo)

,新建一個(gè)M文件M文件編輯:窗口中菜單項(xiàng)File-->Open單擊圖標(biāo)

,打開(kāi)一個(gè)M文件找到M文件,直接雙擊打開(kāi)page7page8命令式文件(Script)命令式文件的運(yùn)行相當(dāng)于在命令窗口(CommandWindow)中逐行輸入并運(yùn)行命令。需注意一下幾點(diǎn):標(biāo)點(diǎn)符號(hào)的運(yùn)用要恰當(dāng)好處,每行命令結(jié)束時(shí)用分號(hào)隔開(kāi),以免程序運(yùn)行時(shí)數(shù)據(jù)輸出造成不便;建立良好的書(shū)寫(xiě)風(fēng)格,保持程序的可讀性,比如程序的層次感,注釋行的書(shū)寫(xiě);注釋行以符號(hào)%開(kāi)頭,在程序運(yùn)行中不被執(zhí)行,只起解釋說(shuō)明作用;不需要用end語(yǔ)句作為命令式文件的結(jié)束標(biāo)志;運(yùn)行此文件時(shí),將其

設(shè)置為當(dāng)前

。實(shí)例1:建立一命令式M文件繪制的LOGO圖L

i

f

e

is

t

o

o

s

h

o

r

t

to

s

p

e

n

d

wr

i

t

i

ng

D

O

lo

o

ps

.

.

.%

Script

file:

logotu.m%%

Purpose:%

This

file

is

to

create

the

Logo

of%

softwareload

logosurf(L,R),

colormap(M)n=size(L,1)axis

offaxis([1

n

1n

-.2

.8])view(-37.5,30)title('Life

is

too

short

to

spend

writingDO

loops...')page9函數(shù)式文件(Function)函數(shù)式文件可以實(shí)現(xiàn)計(jì)算中的參數(shù)傳遞。函數(shù)式的標(biāo)志是第1行為function語(yǔ)句。函數(shù)式可以有返回值,也可有無(wú)返回值;函數(shù)式文件名與函數(shù)名應(yīng)一一對(duì)應(yīng);函數(shù)式中的變量?jī)H在函數(shù)起作用,為局部變量;養(yǎng)成良好的注釋,方便自己,方便他人。function

[outarg1,

outarg2,...]=

fname(inarg1,

inarg2,

...)%

H1

comment

line%

Other

comment

lines...(Executable

code)...(return)help命令運(yùn)行后將顯示M文件注釋語(yǔ)句中的第

續(xù)塊,被空行

的其它注釋語(yǔ)句,將被忽略;lookfor顯示第一個(gè)注釋行內(nèi)容,為了便于被搜索,第一行page10注釋盡可能包含特息。page11實(shí)例2:建立求一個(gè)向量元素平均值的函數(shù)function

y=average(x)%AVERAGE

求向量元素的平均值%語(yǔ)法%y=average(x)%其中,x是向量,y為計(jì)算得到向量元素的均值%若輸入?yún)?shù)為非向量時(shí)則出錯(cuò)%代碼行[m,n]=size(x);%判斷輸入?yún)?shù)是否為向量if(~((m==1)|(n==1))|(m==1&

n==1))%若輸入?yún)?shù)不是向量,則出錯(cuò)error('Input

must

be

a

vector!')end%計(jì)算向量元素的平均值y=sum(x)/length(x);>>

x=1:10;>>

y=average(x)y

=5.5000>>

x=[2

4

6

8

10];>>

y=average(x)y

=6page12控制語(yǔ)句順序語(yǔ)句選擇語(yǔ)句分支語(yǔ)句循環(huán)語(yǔ)句人機(jī)交互語(yǔ)句順序語(yǔ)句程序

令語(yǔ)句按固定的順序一個(gè)接一個(gè)的執(zhí)行,這樣的程序稱為順序語(yǔ)句。%

Script

file:

logotu.m%%

Purpose:%

This

file

is

to

createthe

Logoof%

softwareload

logosurf(L,R),

colormap(M)n=size(L,1)axis

offaxis([1

n

1

n

-.2

.8])view(-37.5,30)title('Life

is

too

short

tospendwriting

DOloops...')順序語(yǔ)句只能實(shí)現(xiàn)簡(jiǎn)單的功能,而在解決實(shí)際問(wèn)題時(shí)往往會(huì)

選擇執(zhí)行特定命令及重復(fù)性執(zhí)行特定命令的情形,因而需要學(xué)習(xí)選擇語(yǔ)句及循環(huán)語(yǔ)句。page13選擇語(yǔ)句選擇語(yǔ)句可以使

選擇性執(zhí)行指定區(qū)域內(nèi)的代碼(稱之為語(yǔ)句塊blocks),而跳過(guò)其他區(qū)域的代碼。if

control_expr_1Statements

(block

1)elseif

control_expr_2Statements

(block

2)elseif

control_expr_3Statements

(block

3)elseStatements

(block

4)end判斷表達(dá)式control_expr緊跟在if或elseif后面;若判斷表達(dá)式的結(jié)果為1,則執(zhí)行其后

令語(yǔ)句塊(block),若結(jié)果為0,則跳過(guò)其后

令語(yǔ)句塊;某一命令語(yǔ)句塊被執(zhí)行后,程序跳至end語(yǔ)句后一可執(zhí)行語(yǔ)句;elseif語(yǔ)句可有任意個(gè),else語(yǔ)句最多只有一個(gè)。page14實(shí)例3:輸入三角形三邊長(zhǎng),求面積>>

run('C:\ProgramFiles\

\R2010a\bin\triarea.m')請(qǐng)輸入三角形的三條邊(數(shù)組形式):[3

4

5]6>>

run('C:\ProgramFiles\

\R2010a\bin\triarea.m')請(qǐng)輸入三角形的三條邊(數(shù)組形式):[1

2

3]不能構(gòu)成一個(gè)三角形。S

p(

p

a)(

p

b)(

p

c)>>

%

Script

file:

triarea.m%

This

program

is

to

calculate

the

area

ofatriangularA=input('請(qǐng)輸入三角形的三條邊(數(shù)組形式):');if

A(1)+A(2)>A(3)

&

A(1)+A(3)>A(2)&A(2)+A(3)>A(1)p=(A(1)+A(2)+A(3))/2;s=sqrt(p*(p-A(1))*(p-A(2))*(p-A(3)));disp(s);elsedisp('不能構(gòu)成一個(gè)三角形。')end三角形面積

公式:2其中:p

1

(a

b

c)page15實(shí)例4:求一元二次方程的根ax2

bx

c

0(a

0)Step

1:清晰地陳述出你要解決的問(wèn)題;“求一個(gè)一元二次方程的根”Step

2:

確定程序的輸入變量和輸出變量;“輸入變量:方程系數(shù)a,b,c;輸出變量:兩根x1,x2”Step3:

設(shè)計(jì)程序偽代碼;%輸入方程系數(shù)input

a,b,c%求根公過(guò)程式:2apage16x

b

b2

4ac偽代碼整體框架:輸入方程系數(shù);求根過(guò)程;輸出求根結(jié)果。Step3:設(shè)計(jì)程序偽代碼-續(xù)%

if%%

else

if%輸出結(jié)果print

x1,x2b2

4ac

0b

b2

4acx1

2a

b

b2

4acx22ab2

4ac

0

b

x1

x22a%else

(對(duì)應(yīng)b2

4ac

0

)%e2nd2a2a

2ax

b

i4ac

b212ax

b

i4ac

b2Tips:偽代碼的設(shè)計(jì)由上而下,先分析總體框架,再局部細(xì)化;偽代碼不是真實(shí)的代碼,其書(shū)寫(xiě)類似于數(shù)學(xué)表達(dá)式;偽代碼只需在草稿紙寫(xiě),力求簡(jiǎn)潔、整齊、清晰。page17Step

4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%

Script

file:

calc_roots.m%%

Purpose:%

This

program

solves

for

the

roots

of

a

quadratic

equation%

of

the

form

a*x^2

+

b*x

+

c

=

0.

It

calculates

the

answers%%

Record

of

revisions:%

Date Programmer

Description

of

change%

======

========

================%

21/10/13

Y.Y.Guo Original

code%%

Define

variables:%

a

--Coefficient

of

x^2

term

of

equation%

b

--Coefficient

of

x

term

ofequation%

c

--Constantterm

of

equation%

discriminant

--Discriminant

of

the

equation%

imag_part

--Imagpart

of

equation

(for

complex

roots)%

real_part

--Real

part

of

equation(for

complex

roots)%

x1

-- solution

of

equation

(for

real

roots)%

x2

--Second

solution

of

equation

(for

realroots)“名字”“用途”“修改記錄”“變量定義”“程序信息”%

regardless

of

the

type

of

roots

that

the

equation

possesses.Tips:一般而言,變量的定義可以在后續(xù)程序編寫(xiě)過(guò)進(jìn)行,每出現(xiàn)一個(gè)新的變量時(shí),則在程序段前面進(jìn)行定義;若為物理變量,則最好將其單位列出。page18Step

4:

將偽代碼轉(zhuǎn)換為

程序語(yǔ)句-續(xù)%

Prompt

the

user

for

the

coefficients

of

the

equationdisp

('This

program

solves

for

the

roots

of

a

quadratic

');disp

('equation

of

theform

A*X^2

+

B*X

+

C

=0.');a

=

input('Enter

the

coefficient

A:

');b

=

input('Enter

the

coefficient

B:

');c

=

input('Enter

the

coefficient

C:');%

Calculate

discriminantdiscriminant

=

b^2

-

4

*

a

*

c;“輸入方程系數(shù)”“計(jì)算方程判別式”%

Solve

for

the

roots,

depending

on

the

value

of

the

discriminant.if

discriminant

>

0

%

there

are

two

real

roots,

so

...x1

=

(-b

+

sqrt(discriminant))

/(2*a);x2

=

(-b

-

sqrt(discriminant))

/

(2*a);disp('This

equation

has

two

real

roots:');fprintf('x1

=

%f\n',

x1);fprintf('x2

=

%f\n',

x2);elseif

discriminant

==

0

%

there

is

one

repeated

root,

so

...x1

=

(

-b

)

/(2*a);“方程有兩不等實(shí)根的情況”“方程有兩相等實(shí)根的情況”disp('This

equation

has

two

identical

real

roots:');fprintf('x1

=

x2

=

%f\n',

x1);page19Step4:

將偽代碼轉(zhuǎn)換為 程序語(yǔ)句-續(xù)else

%

there

are

complex

roots,

so

...real_part

=

(-b)

/(2*a);imag_part

=

sqrt(

abs(discriminant))

/(2*a);disp('This

equation

has

complexroots:');fprintf('x1

=

%f

+

i

%f

\n',real_part,imag_part);fprintf('x1

+

%f

-

i

%f

\n',

real_part,imag_part);end“方程有兩共軛復(fù)根的情況”Step

5:

調(diào)試程序>>

run('C:\ProgramFiles\

\R2010a\bin\calc_roots.m')This

program

solves

for

the

roots

of

a

quadraticequation

of

the

form

A*X^2

+

B*X

+C

=0.Enter

the

coefficient

A:

1Enter

the

coefficient

B:

4Enter

the

coefficient

C:

3This

equationhas

two

real

roots:x1

=

-1.000000

x2

=

-3.000000x2

4x

3

0(x1

1,

x2

3)page20Step

5:調(diào)試程序-續(xù)>>

run('C:\Program

Files\

\R2010a\bin\calc_roots.m')x2

2x

1

0(x1

x2

1)This

program

solvesfor

the

roots

of

a

quadraticequation

of

theform

A*X^2

+

B*X

+

C

=

0.Enter

the

coefficient

A:

1Enter

the

coefficient

B:

2Enter

the

coefficient

C:

1This

equationhas

two

identicalreal

roots:x1

=

x2

=

-1.000000>>

run('C:\ProgramFiles\

\R2010a\bin\calc_roots.m')This

program

solvesfor

the

roots

of

a

quadraticequation

of

theform

A*X^2

+

B*X

+

C

=

0.Enter

the

coefficient

A:

1Enter

the

coefficient

B:

1Enter

the

coefficient

C:

1This

equation

has

complex

roots:x1

=

-0.500000

+

i

0.866025x1

=

-0.500000

-

i

0.866025122

23

)2

2x2

x

1

0(x

1

i

3

,

x

1

ipage21分支語(yǔ)句switch

(switch_expr)case

case_expr_1,Statements

(block

1)case

case_expr_2,Statements

(block

2)otherwise,Statements

(block

3)end分支語(yǔ)句是一種特殊的選擇語(yǔ)句,可以實(shí)現(xiàn)多種情況下的開(kāi)關(guān)控制。switch_expr

可以是數(shù)字、字符串或者邏輯變量;當(dāng)case_expr表達(dá)式與switch_expr相符時(shí),其后的命令語(yǔ)句塊(block)將被執(zhí)行,不符時(shí),其后

令語(yǔ)句塊將被跳過(guò);當(dāng)某一命令語(yǔ)句塊被執(zhí)行后,程序跳至end語(yǔ)句后一可執(zhí)行語(yǔ)句。page22page23實(shí)例5:分支語(yǔ)句的簡(jiǎn)單應(yīng)用>>num=input('請(qǐng)輸入一個(gè)數(shù):');switch

numcase

-1disp('I

am

a

teacher.');case

0disp('I

am

a

student.');case

1disp('You

are

a

teacher.');otherwisedisp('You

are

a

student.');end循環(huán)語(yǔ)句實(shí)際問(wèn)題中,需要反復(fù)執(zhí)行某些語(yǔ)句,這時(shí)就需要用到循環(huán)語(yǔ)句。在循環(huán)語(yǔ)句中,一組被重復(fù)執(zhí)行的語(yǔ)句稱為循環(huán)體,每循環(huán)一次,都必須做出判斷,是繼續(xù)循環(huán)執(zhí)行還是終止執(zhí)行跳出循環(huán),這個(gè)判斷的依據(jù)稱為循環(huán)的終止條件。循環(huán)語(yǔ)句分類:for循環(huán):循環(huán)前循環(huán)次數(shù)已知;while循環(huán):循環(huán)前循環(huán)次數(shù)未知。page24循環(huán)語(yǔ)句之“for循環(huán)”for循環(huán)以指定的數(shù)目重復(fù)地執(zhí)行特定的語(yǔ)句塊。forindex=expr1:expr2:expr3statement

1……statement

nendpage25expr1為循環(huán)變量index的初始值,expr2為index的步長(zhǎng),expr3為index的終值;當(dāng)步長(zhǎng)expr2=1時(shí),可以省略不寫(xiě)。Example

1:for

i=1:2:9……endExample

2:for

i=1:9……end實(shí)例6:已知向量t=[-1

0

13

5],生成其Vandermonde矩陣>>

t=[-1

0

1

3

5];>>

n=max(size(t));>>

for

j=1:n

for

i=1:na(i,j)=t(i)^(n-j);endend>>

aa

=1

-1

1

-1

10

0

0

0

11

1

1

1125

25

5

1a

=1 -1

1 -1

10

0

0

0

11

1

1

1125

25

5

1另案>>

a(:,n)=ones(n,1);>>

for

j=n-1:-1:1a(:,j)=t.*a(:,j+1)';end>>

apage26實(shí)例7:計(jì)算給定日期是一年中的第幾天Step

1:

清晰地陳述出你要解決的問(wèn)題;“計(jì)算給定的一天是這一年中的第幾天”Step

2:確定程序的輸入變量和輸出變量;“輸入變量:年year,月month,日day;輸出變量:一年中的第幾天day_of_year”偽代碼整體框架:輸入年、月、日;計(jì)算第幾天:leap_day=0page27先加上當(dāng)月的天數(shù);加上這一年往月的天數(shù),若包括二月,則需考慮是否為閏年;輸出計(jì)算結(jié)果。Step

3:設(shè)計(jì)程序偽代碼;%輸入年、月、日input

year,

month,

day%計(jì)算第幾天%

首先判斷年份是否為閏年if

year/400余0

是閏年leap_day=1else

if

year/100余0不是閏年Step3:

設(shè)計(jì)程序偽代碼-續(xù)elseif

year/4余0

是閏年

leap_day=1else

不是閏年leap_day=0

end%開(kāi)始計(jì)算第幾天%首先加上當(dāng)月的天數(shù)day_of_year=day%加上這一年往月的天數(shù)for

i=1:month-1switch

(i)case

{1,

3,

5,

7,

8,10}

day_of_year=day_of_year+31case

{4,

6,

9,

11}

day_of_year=day_of_year+30case{2}

day_of_year=day_of_year+28+leap_dayend

end

%輸出結(jié)果print

day_of_yearpage28Step

4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%Script

file:dayofyear.m

“名字”%%Purpose:

“用途”%

This

programcalculates

the

day

of

year

corresponding%

to

a

specified

date.

It

illustrates

the

use

switch%

and

for

constructs.%%Record

of

revisions:

“修改記錄”%

Date Programmer

Description

of

change%

========

=========

===============%

21/10/13

Y.Y.Guo Original

code%%Define

variables:

“變量定義”%

day

--Day

(dd)%

day_of_year

--Day

of

year%

i

--Loopindex%

leap_day

--Extra

day

for

leap

year%

month

--Month

(mm)%

year

--Year(yyyy)“程序信息”page29Step

4:

將偽代碼轉(zhuǎn)換為

程序語(yǔ)句-續(xù)%

Get

day,

month,

and

year

to

convertdisp('This

program

calculatesthe

day

of

year

given

the

');disp('current

date.');month

=

input('Enter

current

month

(1-12):');day

=

input('Enter

current

day(1-31):');year

=

input('Enter

current

year(yyyy):

');%

Check

for

leap

year,

and

add

extra

day

if

necessaryif

mod(year,400)

==

0leap_day

=

1;

%

Years

divisible

by

400

are

leap

yearselseifmod(year,100)

==

0leap_day

=

0;

%

Other

centuries

are

not

leap

yearselseif

mod(year,4)

==

0leap_day=

1;

%

Otherwise

every

4th

year

is

a

leap

yearelseleap_day

=

0;

%

Other

years

are

not

leap

yearsend“輸入年、月、日”“判斷該年是否為閏年”page30day_of_year

=

day_of_year

+

31;case

{4,6,9,11},day_of_year

=

day_of_year

+

30;case

2,day_of_year

=

day_of_year

+

28

+

leap_day;endend% l

userfprintf('The

date

%2d/%2d/%4d

is

day

of

year

%d.\n',...month,

day,

year,

day_of_year)%

Calculateday

of

year

by

adding

current

day

to

the%

days

in

previous

months.day_of_year=day;

“首先加上當(dāng)月天數(shù)”for

i

=

1:

month

-

1%

Add

days

in

months

from

January

to

last

monthswitch

(i)case

{1,3,5,7,8,10},Step

4:

將偽代碼轉(zhuǎn)換為

程序語(yǔ)句-續(xù)“再加上往月天數(shù)”“輸出計(jì)算結(jié)果”page31Step

5:

調(diào)試程序>>

run('C:\ProgramFiles\

\R2010a\bin\dayofyear.m')This

program

calculatesthe

day

of

year

given

thecurrent

date.Enter

current

month

(1-12):10Enter

current

day(1-31):30Enter

current

year(yyyy):

2013The

date

10/30/2013

is

day

of

year

303.>>

run('C:\ProgramFiles\

\R2010a\bin\dayofyear.m')This

program

calculatesthe

day

of

year

given

thecurrent

date.Enter

current

month

(1-12):10Enter

currentday(1-31):30Enter

current

year(yyyy):

1992The

date

10/30/1992

is

day

of

year

304.page32循環(huán)語(yǔ)句之“while循環(huán)”while循環(huán)是一個(gè)通過(guò)邏輯判斷來(lái)確定重復(fù)次數(shù)的語(yǔ)句塊。while

expressionstatement

1……statement

nendpage33如果expression的值非零,程序?qū)?zhí)行代碼塊,然后返回到while語(yǔ)句執(zhí)行;當(dāng)expression的值為零時(shí),這個(gè)重復(fù)過(guò)程結(jié)束,程序?qū)⑻羍nd后面的一可執(zhí)行語(yǔ)句。實(shí)例8:矩陣冪運(yùn)算的近似解當(dāng)A矩陣的階數(shù)不太高且元素值不太大時(shí),可以用如下的展開(kāi)式近似求解。exp(A)

1

A

A2

/

2!

A3

/

3!...>>

a=[2

3;3

4];e=zeros(size(a));f=eye(size(a));k=1;while

norm(e+f-e,1)>0e=e+f;f=a*f/k;k=k+1;end>>

ee

=162.7871

224.6754224.6754

312.5707>>

expm(a)ans

=162.7871

224.6754224.6754

312.5707可見(jiàn)同

的函數(shù)計(jì)算所得結(jié)果比較,計(jì)算精度還很不錯(cuò)!page34實(shí)例9:計(jì)算給定數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差Step

1:

清晰地陳述出你要解決的問(wèn)題;“計(jì)算給定數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差,且數(shù)據(jù)的數(shù)目未知,但非負(fù)”Step

2:確定程序的輸入變量和輸出變量;“輸入變量:給定數(shù)據(jù);輸出變量:這些數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差”偽代碼整體框架:輸入數(shù)據(jù);計(jì)算平均值和標(biāo)準(zhǔn)差;輸出計(jì)算結(jié)果。1Nx

ii1Nx

Ni1

N2

i1

s

N

(N

1)N

xi2

xi

Step3:

設(shè)計(jì)程序偽代碼;%輸入數(shù)據(jù)

input%計(jì)算平均值和標(biāo)準(zhǔn)差N=N+1;

sum_x=sum_x+x;sum_x2=sum_x2+x2page35Step

3:設(shè)計(jì)程序偽代碼-續(xù)page36%輸出計(jì)算結(jié)果:print

x_bar,std_dev%

To

calculate

mean

and

the

standard

deviation

of%

an

inputdata

set

containing

an

arbitrarynumber%

of

input

values.%

======

========

===============%

21/10/13

Y.Y.

Guo Original

code%程序語(yǔ)句Step

4:

將偽代碼轉(zhuǎn)換為%Script

file:stats_1.m

“名字”%%Purpose:

“用途”%

“修改記錄”%

Record

of

revisions:%

Date ProgrammerDescription

of

change“變量定義”%

Define

variables:%

n

--

The

number

of

inputsamples%

std_dev

--

The

standarddeviation

of

the

inputsamples%

sum_x

--

The

sum

of

theinput

values%

sum_x2--

The

sum

of

thesquares

of

the

input

values%

x

--

An

input

data

value%

xbar

--

The

averageof

theinput

samplesStep

4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句-續(xù)page37%

Initializesums.n

=

0;

sum_x

=

0;

sum_x2

=

0;%

Readin

valuex

=

input('Enter value:

');%

WhileLoop

to

read

inputvalues.while

x

>=

0%

Accumulate

sums.n

=

n

+

1;sum_x

=

sum_x

+

x;sum_x2

=

sum_x2

+

x^2;%

Read

in

nextvaluex

=

input('Enternext

value:

');end%

Calculate

the

mean

and

standard

deviationx_bar

=

sum_x

/n;std_dev

=

sqrt(

(n

*

sum_x2

-

sum_x^2)

/

(n

*

(n-1))

);%

l

user.fprintf('The

mean

of

this

data

set

is:

%f\n',

x_bar);fprintf('The

standard

deviation

is:

%f\n',

std_dev);fprintf('The

number

of

data

points

is:

%d\n',n);“輸入非負(fù)數(shù)據(jù)并計(jì)算平均值和標(biāo)準(zhǔn)差”“輸出計(jì)算結(jié)果”Step

5:

調(diào)試程序>>

run('C:\Program

Files\

\R2010a\bin\stats_1.m')Enter

value:

1Enter

next

value:

3Enter

next

value:

5Enter

next

value:

9Enter

next

value:

-1The

mean

of

this

data

set

is:

4.500000The

standarddeviation

is:

3.415650The

number

of

data

points

is:

4Enter

next

value:98Enter

next

value:97Enter

next

value:

93Enter

next

value:76Enter

next

value:80Enter

next

value:

-9The

mean

of

this

data

set

is:

90.666667The

standarddeviation

is:

10.152175The

number

of

data

points

is:

6Note:當(dāng)輸入數(shù)據(jù)為負(fù)數(shù)時(shí),計(jì)算終止。在計(jì)算平均值和>>

run('C:\Program

Files\Enter value:

100\R2010a\bin\stats_1.m')標(biāo)準(zhǔn)差時(shí)只考慮之前輸入的非負(fù)數(shù)據(jù)。page38page39循環(huán)語(yǔ)句之“嵌套循環(huán)”如果一個(gè)循環(huán)完全出現(xiàn)在另一個(gè)循環(huán)當(dāng)中,則稱這兩個(gè)循環(huán)為帶嵌套的循環(huán)。此外,也會(huì)出現(xiàn)多重嵌套的循環(huán)。for

i

=

1:3for

j

=

1:3product

=

i

*j;fprintf('%d

*

%d

=

%d

\n',

i,

j,

product);endend1

*

1

=

11

*

2

=

21

*

3=

32

*

1

=

22

*

2

=

42

*

3

=

63

*

1

=

33

*

2=

63

*

3

=

9page40人機(jī)交互語(yǔ)句echo

on

指令:顯示其后所有執(zhí)行文件的指令;echo

off

指令:關(guān)閉其后所有執(zhí)行文件的指令顯示;input

指令:提示用戶從鍵盤(pán)輸入數(shù)值、字符串或表達(dá)式,并接受輸入;pause

指令:使程序運(yùn)行停止,等待用戶按任意鍵繼續(xù);disp指令:在屏幕上顯示字符串;fprintf指令:在屏幕上按一定格式輸出字符串。input命令調(diào)用格式為:input(提示信息,選項(xiàng))>>

reply

=

input('Do

you

want

more?

Y/N

[Y]:

',

's');Do

you

want

more?

Y/N

[Y]:

Y>>

replyreply

=Y>>

reply

=

input('Pleaseinput

your

height:

')Please

input

your

height:

177reply

=177Note:‘s’表示允許用戶輸入一個(gè)字符串,如果省略不寫(xiě),則表示數(shù)字變量。人機(jī)交互語(yǔ)句page41人機(jī)交互語(yǔ)句pause命令此命令有如下幾種調(diào)用格式:pause:程序暫停等待回應(yīng),直到用戶按任意鍵繼續(xù)運(yùn)行;pause(n):程序暫停n秒時(shí)間;pause

on:執(zhí)行其后的pause命令;pause

off:不執(zhí)行其后的pause命令。pause

命令在程序的調(diào)試過(guò)程或者用戶需要查看中間結(jié)果時(shí)十分有用。page42人機(jī)交互語(yǔ)句disp命令調(diào)用格式為:disp(輸出項(xiàng))>>

A='I

miss

you

very

much!';disp(A)I

miss

you

verymuch!fprintf命令>>

a=9;

fprintf('%d\n',a)9Note:常見(jiàn)輸出格式%d

--整型格式輸出;%f

--浮點(diǎn)型格式輸出;調(diào)用格式為:fprintf(格式,輸出項(xiàng))

%e--指數(shù)形式輸出;\n

--換行。的輸出格式控制與C語(yǔ)言相同!page43函數(shù)變量及變量作用域函數(shù)文件的

變量是局部變量,與其他函數(shù)文件及工作空間相互

。但是,如果在若干函數(shù)中,都把某一變量定義為全局變量,那么這些函數(shù)將公用這一個(gè)變量。在

中,全局變量用命令global定義。全局變量的作用域是整個(gè)

工作空間,即全程有效。所有的函數(shù)都可以對(duì)它進(jìn)行存取和修改。因此,定義全局變量是函數(shù)間傳遞信息的一種

。page44實(shí)例10:全局變量使用簡(jiǎn)例function

f=wadd(x,y)%

add

two

variableglobal

ALPHA

BETAf=cos(ALPHA)*x+sin(BETA)*y;求x,

y按照如下

方式的和:f

cos

x

sin

y>>

global

ALPHA

BETA>>

ALPHA=pi/3;BETA=pi/4;>>

wadd(5,6)ans

=6.7426Tips:使用全局變量時(shí),函數(shù)

以及命令窗口(或者命令式M文件)中均應(yīng)該定義相應(yīng)的全局變量;定義多個(gè)全局變量時(shí),用空格隔開(kāi),不能用逗號(hào)。page45在函數(shù)調(diào)用上有一個(gè)與眾不同之處:函數(shù)所傳遞參數(shù)數(shù)目的可調(diào)性。憑借這一點(diǎn),一個(gè)函數(shù)可完成多種功能。在調(diào)用函數(shù)時(shí),用兩個(gè)變量nargin

和nargout分別記錄調(diào)用該函數(shù)時(shí)的輸入實(shí)參和輸出實(shí)參的個(gè)數(shù)。只要在函數(shù)文件中包含這兩個(gè)變量,就可以準(zhǔn)確地知道該函數(shù)文件被調(diào)用時(shí)的輸入輸出參數(shù)個(gè)數(shù),從而決定函數(shù)如何進(jìn)行處理。函數(shù)變量及變量作用域-續(xù)page46實(shí)例11:nargin變量使用簡(jiǎn)例function

c=test_nargin(a,b)%

This

function

is

to

test

thenargin

%

variableif

nargin==1c=det(a);elseif

nargin==2c=a+b;end編制一個(gè)函數(shù),函數(shù)名為test_nargin,它能實(shí)現(xiàn)如下功能:如果調(diào)用函數(shù)時(shí)只有一個(gè)輸入變量,則求該變量的模(對(duì)矩陣而言則為行列式),如果有兩個(gè)輸入變量,則求兩個(gè)變量的和。>>

A=[1,2,3;4:6;10

1218];

B=eye(3);>>

test_nargin(A)ans

=-12.0000>>

test_nargin(B)ans

=1>>

test_nargin(A,

B)ans

=2

2

34

6

610

12

1961

2 3

A

4

5

10

12

180100B

0

10

0

1page47程序設(shè)計(jì)的輔助函數(shù)在語(yǔ)言的程序設(shè)計(jì)中,有幾組輔助函數(shù)可用以支持M文件的編輯,對(duì)這些函數(shù)的合理使用可以增加函數(shù)的魯棒性或豐富函數(shù)功能。輔助函數(shù)包括:執(zhí)行函數(shù)容錯(cuò)函數(shù)時(shí)間控制函數(shù)page48執(zhí)行函數(shù)函數(shù)名說(shuō)明函數(shù)名說(shuō)明eval字符串調(diào)用builtin外部加載調(diào)用函數(shù)evalc執(zhí)行表達(dá)式assignin工作間中分配變量feval調(diào)用M文件run運(yùn)行(script)evalin執(zhí)行計(jì)算工作間中的表達(dá)式中提供了一系列的執(zhí)行函數(shù)。page49容錯(cuò)函數(shù)一個(gè)程序設(shè)計(jì)的好壞在很大程度上取決于其容錯(cuò)能力的大小。語(yǔ)言中提供了相應(yīng)的報(bào)錯(cuò)及警告函數(shù)error,warning等。函數(shù)error可以在窗口中顯示錯(cuò)誤的信息,以提示用戶輸入錯(cuò)誤或者調(diào)用錯(cuò)誤,其調(diào)用格式如下:error(‘錯(cuò)誤信息’):如果調(diào)用M文件時(shí)觸發(fā)error,則程序?qū)⒅袛噙\(yùn)行,并顯示錯(cuò)誤信息。函數(shù)warning的用法類似于函數(shù)error,但與其不同的是,函數(shù)warning不會(huì)中斷程序的執(zhí)行,而僅僅給出警告信息。與容錯(cuò)相關(guān)的函數(shù)或命令還有:

lasterr、lastwarn以及errortrap

on/off等。

page50語(yǔ)言還提供了一個(gè)流程控制結(jié)構(gòu)用于容錯(cuò)處理,即try-catch-end結(jié)構(gòu),其調(diào)用格式如下:tryblock

1catchblock

2end容錯(cuò)函數(shù)在執(zhí)行該語(yǔ)句段時(shí),將先執(zhí)行block1,如果block1內(nèi)出現(xiàn)錯(cuò)誤,則將執(zhí)行block

2,如果block

2也出現(xiàn)錯(cuò)誤,則程序?qū)?bào)錯(cuò)并終止;如果block

1內(nèi)出現(xiàn)錯(cuò)誤,block

2執(zhí)行后,則可由容錯(cuò)函數(shù)lasterr獲得錯(cuò)誤詳情。page51page52實(shí)例12:容錯(cuò)控制結(jié)構(gòu)try-catch-end示例function

c=testtce(a,b)%

This

function

is

to

test

the%

try-catch-end

structuretryc=a+b;catchc=strcat(a,b);end>>

a='I

miss'a

=I

miss>>

b='

you

very

much!'b

=you

very

much!>>

c=testtce(a,b)c

=I

miss

you

very

much!>>

lasterrans

=Error

using

==>

plusMatrix

dimensions

must

agree.>>

a+b???

Error

using==>plusMatrix

dimensions

mustagree.時(shí)間控制函數(shù)中提供了一些時(shí)間控制函數(shù),可以用來(lái)監(jiān)視程序運(yùn)行的時(shí)間,如下表所示。函數(shù)名說(shuō)明函數(shù)名說(shuō)明Now數(shù)值形式顯示當(dāng)前Datevec轉(zhuǎn)換為向量形式顯時(shí)間和日期示日期Date字符形式顯示當(dāng)前Calendar當(dāng)月的日歷表日期Clock向量形式顯示當(dāng)前Weekday當(dāng)前日期對(duì)應(yīng)的星日期和時(shí)間期表達(dá)Datenum轉(zhuǎn)換為數(shù)值格式顯示日期Eomday制定年月的最后一天Datestr轉(zhuǎn)換為字符形式顯Datetick制定坐標(biāo)軸的日期示日期表達(dá)page53例如:>>

dateans

=22-Oct-2013另外,還提供了一些計(jì)時(shí)函數(shù),如下表所示。函數(shù)名

說(shuō)明cputime

以CPU時(shí)間方式計(jì)時(shí)tic,toc

計(jì)時(shí)器開(kāi)關(guān)etime

計(jì)算兩個(gè)時(shí)刻的時(shí)間差page54page55程序設(shè)計(jì)的優(yōu)化以矩陣作為操作主體,盡量避免對(duì)矩陣元素的操作;盡量避免循環(huán)運(yùn)算,尤其是多重循環(huán);數(shù)據(jù)的預(yù)定義:尤其在循環(huán)中使用數(shù)組變量時(shí),可以預(yù)先估計(jì)變量可能出現(xiàn)的最大維數(shù),進(jìn)行預(yù)定義;內(nèi)存的管理:即使清理內(nèi)容,clear。page56實(shí)例13:循環(huán)運(yùn)算和向量運(yùn)算時(shí)間對(duì)比f(wàn)unction

y=test_opt2x=[1:10000]*pi;y=sin(x);>>

tic;test_opt1;t1=toct1

=0.0658>>

tic;test_opt2;t1=toct1

=0.0172計(jì)算y=sin(x),其中

x

10000function

y=test_opt1for

i=1:10000y(i)=sin(pi*i);end程序調(diào)試使用pause函數(shù);在程序內(nèi)設(shè)置斷點(diǎn);調(diào)試出現(xiàn)錯(cuò)誤時(shí),學(xué)會(huì)查看Workplace,分析變量取值是否科學(xué)合理。page57page58page59信息接口文件接口應(yīng)用程序接口獨(dú)立程序與MS-Word接口page60文件接口文件可分為兩類:文本文件由字符和與字符的顯示格式有關(guān)的控制符構(gòu)成常見(jiàn)擴(kuò)展名:“TXT”、“BAT”、“HTM”二進(jìn)制文件二進(jìn)制文件為非文本文件常見(jiàn)擴(kuò)展名:“COM”、“EXE”、“BMP”、“WAV”Note:簡(jiǎn)單來(lái)說(shuō),文本文件是基于字符編碼的文件,常見(jiàn)的編碼有ASCII編碼,其它則可認(rèn)為是二進(jìn)制文件。page61文件的打開(kāi)與關(guān)閉fopen函數(shù)fid=fopen(filename,permission)[fid,message]=fopen(filename,permssion)[filename,permission,machineformat]=fopen(fid)fid

=fopen('all')fclose函數(shù)status=fclose(fid)status=fclose('all')例:打開(kāi)一個(gè)名為my.txt的數(shù)據(jù)文件并進(jìn)行讀操作,命令為:fid=fopen('my.txt','r')格式化數(shù)據(jù)的讀寫(xiě)fscanf函數(shù)[A,

count]=fscanf(fid,

format,

size)fprintf函數(shù)count=fprintf(fid,format

,

A

...)page62計(jì)算當(dāng)x=[0

1]時(shí)f(x)=ex的值,并將結(jié)果寫(xiě)入到文件my.txt中。x=0:0.1:1;y=[x;exp(x)];

%y有兩行數(shù)據(jù)fid=fopen('my.txt','w');fprintf(fid,'%6.2f

%

12.8f\n',y);fclose(fid);實(shí)例14:文件接口簡(jiǎn)例page63文件的定位和狀態(tài)feof函數(shù):檢測(cè)文件是否已經(jīng)結(jié)束status=feof(fid)ferror函數(shù):用于查詢文件的輸入、輸出錯(cuò)誤信息msg=ferror(fid)frewind函數(shù):使位置指針重新返回文件的開(kāi)頭frewind(fid)fseek函數(shù):設(shè)置文件的位置指針status=fseek(fid,

offset,

origin)f l函數(shù):用于查詢當(dāng)前文件指針的位置position=f

l(fid)。page64實(shí)例15:輸出文件的大小和位置>>fid=fopen('my.txt','r');fseek(fid,0,'eof');x=f

l(fid);fprintf(1,'File

Size=%d\n',x);frewind(fid);x=f

l(fid);fprintf(1,'File

Position

=%d\n',x);fclose(fid);輸出結(jié)果:File

Size=231File

Position=0page65按行

數(shù)據(jù)數(shù)據(jù),但不

換行符。行、保留換行符并把行作為fgetl函數(shù):按行從文件中l(wèi)ine=fgetl(fid)fgets函數(shù):用于從文件中字符串返回。(1)line=fgets(fid)–

(2)line=fgets(fid,nchar)page66page67二進(jìn)制文件數(shù)據(jù)的讀寫(xiě)fwrite函數(shù):用于向一個(gè)文件寫(xiě)入二進(jìn)制數(shù)據(jù)count=fwrite(fid,A,precision)。fread函數(shù):用于從文件中讀二進(jìn)制數(shù)據(jù)[A,count]=fread(fid,

size,

precision)Note:使用函數(shù)fread()和fwrite()讀寫(xiě)文件時(shí),必須以二進(jìn)制方式打開(kāi)文件。實(shí)例16:魔方矩陣的二進(jìn)制讀寫(xiě)將5行5列“魔方陣”存入二進(jìn)制文件中:fid=fopen('my.dat','w');a=magic(5);fwrite(fid,a,'long');fclose(fid);注意二進(jìn)制文件和文本文件讀寫(xiě)數(shù)據(jù)的不同!從二進(jìn)制文件中“魔方陣”:fid=fopen('my.dat','r');[A,count]=fread(fid,

[5,

inf],

'long');fclose(fid);AA

=17

24

1

8

1523

5

7

14

16page68page69圖像聲音文件的讀寫(xiě)imread函數(shù):從文件中讀入圖像A

=

imread(filename,fmt)[A,

map]

=

imread(filename,fmt)image函數(shù):顯示圖像image(A)imwrite函數(shù):將圖像寫(xiě)入文件imwrite(A,

filename,

fmt)imwrite(A,

map,

filename,

fmt)imfinfo函數(shù):查詢圖像文件信息innfo

imflnfo(filename)wavread函數(shù):用于

擴(kuò)展名為“.wav”

文件y=wavread(file)[y,

fs,

nbits]=wavread(file)wavwrite函數(shù):用于將數(shù)據(jù)寫(xiě)入到擴(kuò)展名為“wav”文件中wavwrite(y,

fs,

nbits,

wavefile)wavplay函數(shù):利用windows音頻輸出設(shè)備

聲音wavplay(y,fs)圖像聲音文件的讀寫(xiě)-續(xù)page70應(yīng)用程序接口調(diào)用其他語(yǔ)言編寫(xiě)的程序(MEX文件);調(diào)用計(jì)算引擎;MAT文件接口。page71MEX文件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論