MATLAB新手教程
MATLAB新手教程
?
1.MATLAB的基本知識
1-1、基本運算與函數(shù)???
在MATLAB下進行基本數(shù)學運算,僅僅需將運算式直接打入提示號(>>)之後,并按入Enter鍵就可以。比如:??
>> (5*2+1.3-0.8)*10/25??
ans =4.2000??
MATLAB會將運算結(jié)果直接存入一變數(shù)ans,代表MATLAB運算後的答案(Answer)并顯示其數(shù)值於螢幕上。
小提示: ">>"是MATLAB的提示符號(Prompt),但在PC中文視窗系統(tǒng)下,由於編碼方式不同,此提示符號常會消失不見,但這并不會影響到MATLAB的運算結(jié)果。??
我們也可將上述運算式的結(jié)果設(shè)定給還有一個變數(shù)x:??
x = (5*2+1.3-0.8)*10^2/25??
x = 42?
此時MATLAB會直接顯示x的值。由上例可知,MATLAB認識全部一般經(jīng)常使用到的加(+)、減(-)、乘(*)、除(/)的數(shù)學運算符號,以及冪次運算(^)。??
小提示: MATLAB將全部變數(shù)均存成double的形式,所以不需經(jīng)過變數(shù)宣告(Variabledeclaration)。MATLAB同一時候也會自己主動進行記憶體的使用和回收,而不必像C語言,必須由使用者一一指定.這些功能使的MATLAB易學易用,使用者可專心致力於撰寫程式,而不必被軟體枝節(jié)問題所干擾。???
若不想讓MATLAB每次都顯示運算結(jié)果,僅僅需在運算式最後加上分號(;)就可以,例如以下例:
y = sin(10)*exp(-0.3*4^2);??
若要顯示變數(shù)y的值,直接鍵入y就可以:??
>>y??
y =-0.0045??
在上例中,sin是正弦函數(shù),exp是指數(shù)函數(shù),這些都是MATLAB經(jīng)常使用到的數(shù)學函數(shù)。
下表即為MATLAB經(jīng)常使用的基本數(shù)學函數(shù)及三角函數(shù):??
小整理:MATLAB經(jīng)常使用的基本數(shù)學函數(shù)
abs(x):純量的絕對值或向量的長度
angle(z):復 數(shù)z的相角(Phase angle)
sqrt(x):開平方
real(z):復數(shù)z的實部
imag(z):復數(shù)z的虛 部
conj(z):復數(shù)z的共軛復數(shù)
round(x):四舍五入至近期整數(shù)
fix(x):不管正負,舍去小數(shù)至近期整數(shù)
floor(x):地板函數(shù),即舍去正小數(shù)至近期整數(shù)
ceil(x):天花板函數(shù),即增加正小數(shù)至近期整數(shù)
rat(x):將實數(shù)x化為分數(shù)表示
rats(x):將實數(shù)x化為多項分數(shù)展開
sign(x):符號函數(shù) (Signum function)。??
當x<0時,sign(x)=-1;??
當x=0時,sign(x)=0;??
當x>0時,sign(x)=1。??
> 小整理:MATLAB經(jīng)常使用的三角函數(shù)
sin(x):正弦函數(shù)
cos(x):馀弦函數(shù)
tan(x):正切函數(shù)
asin(x):反正弦函數(shù)
acos(x):反馀弦函數(shù)
atan(x):反正切函數(shù)
atan2(x,y):四象限的反正切函數(shù)
sinh(x):超越正弦函數(shù)
cosh(x):超越馀弦函數(shù)
tanh(x):超越正切函數(shù)
asinh(x):反超越正弦函數(shù)
acosh(x):反超越馀弦函數(shù)
atanh(x):反超越正切函數(shù)??
變數(shù)也可用來存放向量或矩陣,并進行各種運算,例如以下例的列向量(Row vector)運算:
x = [1 3 5 2];??
y = 2*x+1??
y = 3 7 11 5??
小提示:變數(shù)命名的規(guī)則??
1.第一個字母必須是英文字母 2.字母間不可留空格 3.最多僅僅能有19個字母,MATLAB會忽略多馀字母? ?
我們能夠任意更改、添加或刪除向量的元素:?
y(3) = 2 % 更改第三個元素??
y =3 7 2 5??
y(6) = 10 % 增加第六個元素??
y = 3 7 2 5 0 10??
y(4) = [] % 刪除第四個元素,??
y = 3 7 2 0 10??
在上例中,MATLAB會忽略全部在百分比符號(%)之後的文字,因此百分比之後的文字均可視為程式的注解(Comments)。MATLAB亦可取出向量的一個元素或一部份來做運算:?
x(2)*3+y(4) % 取出x的第二個元素和y的第四個元素來做運算??
ans = 9??
y(2:4)-1 % 取出y的第二至第四個元素來做運算??
ans = 6 1 -1??
在上例中,2:4代表一個由2、3、4組成的向量
?
若對MATLAB函數(shù)使用方法有疑問,可隨時使用help來尋求線上支援(on-line help):helplinspace??
小整理:MATLAB的查詢命令
help:用來查詢已知命令的使用方法。比如已知inv是用來計算反矩陣,鍵入help inv就可以得知有關(guān)inv命令的使用方法。(鍵入help help則顯示help的使用方法,請試看看!) lookfor:用來尋找未知的命令。比如要尋找計算反矩陣的命令,可鍵入 lookfor inverse,MATLAB即會列出全部和keywordinverse相關(guān)的指令。找到所需的命令後 ,就可以用help進一步找出其使用方法。(lookfor其實是對全部在搜尋路徑下的M檔案進行keyword對第一注解行的比對,詳見後敘。)??
將列向量轉(zhuǎn)置(Transpose)後,就可以得到行向量(Column vector):??
z = x'??
z = 4.0000??
?? 5.2000??
?? 6.4000??
?? 7.6000??
?? 8.8000??
?? 10.0000???
不論是行向量或列向量,我們均可用同樣的函數(shù)找出其元素個數(shù)、最大值、最小值等:?
length(z) % z的元素個數(shù)??
ans = 6??
max(z) % z的最大值??
ans = 10??
min(z) % z的最小值??
ans =?? 4??
小整理:適用於向量的經(jīng)常使用函數(shù)有:
min(x): 向量x的元素的最小值
max(x): 向量x的元素的最大值
mean(x): 向量x的元素的平均值
median(x): 向量x的元素的中位數(shù)
std(x): 向量x的元素的標準差
diff(x): 向量x的相鄰元素的差
sort(x): 對向量x的元素進行排序(Sorting)
length(x): 向量x的元素個數(shù)
norm(x): 向量x的歐氏(Euclidean)長度
sum(x): 向量x的元素總和
prod(x): 向量x的元素總乘積
cumsum(x): 向量x的累計元素總和
cumprod(x): 向量x的累計元素總乘積
dot(x, y): 向量x和y的內(nèi) 積
cross(x, y): 向量x和y的外積 (大部份的向量函數(shù)也可適用於矩陣,詳見下述。)?
?
?
若要輸入矩陣,則必須在每一列結(jié)尾加上分號(;),例如以下例:??
A = [1 2 3 4; 5 6 7 8; 9 1011 12];???
A =???
1? 2? 3?4???
5? 6? 7?8???
9? 10 11? 12??
相同地,我們能夠?qū)仃囘M行各種處理:??
A(2,3) = 5 % 改變位於第二列,第三行的元素值??
A =???
1? 2? 3?4??
5? 6? 5?8???
9? 10 11? 12???
B = A(2,1:3) % 取出部份矩陣B??
B = 5 6 5??
A = [A B'] % 將B轉(zhuǎn)置後以行向量并入A??
A =???
1? 2? 3??4? 5???
5? 6? 5??8? 6???
9? 10 11? 12?5??
A(:, 2) = [] % 刪除第二行(:代表全部列)??
A =???
1? 3? 4?5???
5? 5? 8?6???
9? 11 12? 5? ?
A = [A; 4 3 2 1] % 增加第四列???
A =???
1? 3?? 4??5???
5? 5?? 8??6???
9? 11? 12?5??
4? 3?? 2??1??
A([1 4], :) = [] % 刪除第一和第四列(:代表全部行)??
A =???
5? 5?? 8??6???
9? 11? 12?5??
這幾種矩陣處理的方式能夠相互疊代運用,產(chǎn)生各種意想不到的效果,就看各位的巧思和創(chuàng)意。??
小提示:在MATLAB的內(nèi)部資料結(jié)構(gòu)中,每個矩陣都是一個以行為主(Column-oriented )的陣列(Array)因此對於矩陣元素的存取,我們可用一維或二維的索引(Index)來定址。舉例來說,在上述矩陣A中,位於第二列、第三行的元素可寫為A(2,3) (二維索引)或A(6)(一維索引,即將全部直行進行堆疊後的第六個元素)。??
此外,若要又一次安排矩陣的形狀,可用reshape命令:??
B = reshape(A, 4, 2) % 4是新矩陣的列數(shù),2是新矩陣的行數(shù)??
B =??
5?? 8???
9?? 12???
5?? 6? ?
11? 5??
小提示: A(:)就是將矩陣A每一列堆疊起來,成為一個行向量,而這也是MATLAB變數(shù)的內(nèi)部儲存方式。曾經(jīng)例而言,reshape(A, 8, 1)和A(:)相同都會產(chǎn)生一個8x1的矩陣。?
MATLAB可在同一時候運行數(shù)個命令,僅僅要以逗號或分號將命令隔開:??
x = sin(pi/3); y = x^2; z = y*10,
z =???
7.5000??
若一個數(shù)學運算是太長,可用三個句點將其延伸到下一行:?
z = 10*sin(pi/3)* ...??
sin(pi/3);??
若要檢視現(xiàn)存於工作空間(Workspace)的變數(shù),可鍵入who:??
who??
Your variables are:??
testfile x??
這些是由使用者定義的變數(shù)。若要知道這些變數(shù)的具體資料,可鍵入:??
whos??
Name Size Bytes Class?
A 2x4 64 double array??
B 4x2 64 double array??
ans 1x1 8 double array??
x 1x1 8 double array??
y 1x1 8 double array??
z 1x1 8 double array??
Grand total is 20 elements using 160 bytes??
使用clear能夠刪除工作空間的變數(shù):??
clear A??
A??
??? Undefined function or variable 'A'.??
另外MATLAB有些永久常數(shù)(Permanent constants),盡管在工作空間中看不 到,但使用者可直接取用,比如:??
pi??
ans = 3.1416??
下表即為MATLAB經(jīng)常使用到的永久常數(shù)。??
小整理:MATLAB的永久常數(shù) i或j:基本虛數(shù)單位
eps:系統(tǒng)的浮點(Floating-point)準確度
inf:無限大, 比如1/0 nan或NaN:非數(shù)值(Not a number) ,比如0/0
pi:圓周率 p(= 3.1415926...)
realmax:系統(tǒng)所能表示的最大數(shù)值?
realmin:系統(tǒng)所能表示的最小數(shù)值
nargin: 函數(shù)的輸入引數(shù)個數(shù)
nargin: 函數(shù)的輸出引數(shù)個數(shù)??
?1-2、反復命令? ?
最簡單的反復命令是for圈(for-loop),其基本形式為:????
for 變數(shù) = 矩陣;???
運算式;???
end??
當中變數(shù)的值會被依次設(shè)定為矩陣的每一行,來運行介於for和end之間的運算式。因此,若無意外情況,運算式運行的次數(shù)會等於矩陣的行數(shù)。??
舉例來說,下列命令會產(chǎn)生一個長度為6的調(diào)和數(shù)列(Harmonic sequence):?
x = zeros(1,6); % x是一個16的零矩陣??
for i = 1:6,??
x(i) = 1/i;??
end ???
在上例中,矩陣x最初是一個16的零矩陣,在for圈中,變數(shù)i的值依次是1到6,因此矩陣x的第i個元素的值依次被設(shè)為1/i。我們可用分數(shù)來顯示此數(shù)列:???
format rat % 使用分數(shù)來表示數(shù)值??
disp(x)??
1 1/2 1/3 1/4 1/5 1/6??
for圈能夠是多層的,下例產(chǎn)生一個16的Hilbert矩陣h,當中為於第i列、第j行的元素為???
h = zeros(6);??
for i = 1:6,??
for j = 1:6,??
h(i,j) = 1/(i+j-1);???
end???
end???
disp(h)???
1 1/2 1/3 1/4 1/5 1/6??
1/2 1/3 1/4 1/5 1/6 1/7??
1/3 1/4 1/5 1/6 1/7 1/8??
1/4 1/5 1/6 1/7 1/8 1/9???
1/5 1/6 1/7 1/8 1/9 1/10???
1/6 1/7 1/8 1/9 1/10 1/11??
小提示:預先配置矩陣 在上面的樣例,我們使用zeros來預先配置(Allocate)了一個適當大小的矩陣。若不預先配置矩陣,程式仍可運行,但此時MATLAB須要動態(tài)地添加(或減小)矩陣的大小,因而減少程式的運行效率。所以在使用一個矩陣時,若能在事前知道其大小,則最好先使用zeros或ones等命令來預先配置所需的記憶體(即矩陣)大小。??
?
在下例中,for圈列出先前產(chǎn)生的Hilbert矩陣的每一行的平方和:???
for i = h,??
disp(norm(i)^2); % 印出每一行的平方和??
end??
?
1299/871??
282/551???
650/2343??
524/2933??
559/4431??
831/8801??
在上例中,每一次i的值就是矩陣h的一行,所以寫出來的命令特別簡潔。??
令一個經(jīng)常使用到的反復命令是while圈,其基本形式為:??
while 條件式;??
運算式;??
end?
也就是說,僅僅要條件示成立,運算式就會一再被運行。比如先前產(chǎn)生調(diào)和數(shù)列的樣例,我們可用while圈改寫例如以下:???
x = zeros(1,6); % x是一個16的零矩陣??
i = 1;??
while i <= 6,???
x(i) = 1/i;???
i = i+1;???
end??
format short
??
1-3、邏輯命令??
最簡單的邏輯命令是if, ..., end,其基本形式為:?
if 條件式;???
運算式;???
end???
if rand(1,1) > 0.5,???
disp('Given random number is greater than 0.5.');??
end???
Given random number is greater than 0.5.
??
1-4、集合多個命令於一個M檔案????
若要一次運行大量的MATLAB命令,可將這些命令存放於一個副檔名為m的檔案,并在 MATLAB提示號下鍵入此檔案的主檔名就可以。此種包括MATLAB命令的檔案都以m為副檔名,因此通稱M檔案(M-files)。比如一個名為test.m的M檔案,包括一連串的MATLAB命令,那麼僅僅要直接鍵入test,就可以運行其所包括的命令:??
pwd % 顯示如今的文件夾??
ans =???
D:\MATLAB5\bin??
cd c:\data\mlbook % 進入test.m所在的文件夾??
type test.m % 顯示test.m的內(nèi)容??
% This is my first test M-file.??
% Roger Jang, March 3, 1997??
fprintf('Start of test.m!\n');??
for i = 1:3,??
fprintf('i = %d ---> i^3 = %d\n', i, i^3);???
end??
fprintf('End of test.m!\n');??
test % 運行test.m ??
Start of test.m!??
i = 1 ---> i^3 = 1??
i = 2 ---> i^3 = 8??
i = 3 ---> i^3 = 27??
End of test.m!??
小提示:第一注解行(H1 help line) test.m的前兩行是注解,能夠使程式易於了解與管理。特別要說明的是,第一注解行通經(jīng)常使用來簡短說明此M檔案的功能,以便lookfor能以keyword比對的方式來找出此M檔案。舉例來說,test.m的第一注解行包括test這個字,因此假設(shè)鍵入lookfor test,MATLAB就可以列出全部在第一注解行包括test的M檔案,因而test.m也會被列名在內(nèi)。??
嚴格來說,M檔案可再細分為命令集(Scripts)及函數(shù)(Functions)。前述的test.m即為命令集,其效用和將命令逐一輸入全然一樣,因此若在命令集能夠直接使用工作空間的變數(shù),并且在命令集中設(shè)定的變數(shù),也都在工作空間中看得到。函數(shù)則須要用到輸入引數(shù)(Input arguments)和輸出引數(shù)(Output arguments)來傳遞資訊,這就像是C語言的函數(shù),或是FORTRAN語言的副程序(Subroutines)。舉例來說,若要計算一個正整數(shù)的階乘 (Factorial),我們能夠?qū)懸粋€例如以下的MATLAB函數(shù)并將之存檔於fact.m:??
function output = fact(n)??
% FACT Calculate factorial of a given positive integer.??
output = 1;???
for i = 1:n,???
output = output*i;???
end???
當中fact是函數(shù)名,n是輸入引數(shù),output是輸出引數(shù),而i則是此函數(shù)用到的臨時變數(shù)。要使用此函數(shù),直接鍵入函數(shù)名及適當輸入引數(shù)值就可以:??
y = fact(5)??
y = 120??
(當然,在運行fact之前,你必須先進入fact.m所在的文件夾。)在運行fact(5)時,
MATLAB會跳入一個下層的臨時工作空間(Temperary workspace),將變數(shù)n的值設(shè)定為5,然後進行各項函數(shù)的內(nèi)部運算,全部內(nèi)部運算所產(chǎn)生的變數(shù)(包括輸入引數(shù)n、臨時變數(shù)i,以及輸出引數(shù)output)都存在此臨時工作空間中。運算完成後,MATLAB會將最後輸出引數(shù)output的值設(shè)定給上層的變數(shù)y,并將清除此臨時工作空間及其所含的全部變數(shù)。換句話說,在呼叫函數(shù)時,你僅僅能經(jīng)由輸入引數(shù)來控制函數(shù)的輸入,經(jīng)由輸出引數(shù)來得到函數(shù)的輸出,但全部的臨時變數(shù)都會隨著函數(shù)的結(jié)束而消失,你并無法得到它們的值。?
小提示:有關(guān)階乘函數(shù) 前面(及後面)用到的階乘函數(shù)僅僅是純粹用來說明MATLAB的函數(shù)觀念。若實際要計算一個正整數(shù)n的階乘(即n!)時,可直接寫成prod(1:n),或是直接呼叫g(shù)amma函數(shù):gamma(n-1)。??
MATLAB的函數(shù)也能夠是遞式的(Recursive),也就是說,一個函數(shù)能夠呼叫它本身。
舉例來說,n! = n*(n-1)!,因此前面的階乘函數(shù)能夠改成遞式的寫法:??
function output = fact(n)??
% FACT Calculate factorial of a given positive integerrecursively.??
if n == 1, % Terminating condition??
output = 1;??
return;??
end??
output = n*fact(n-1);???
在寫一個遞函數(shù)時,一定要包括結(jié)束條件(Terminating condition),否則此函數(shù)將會一再呼叫自己,永遠不會停止,直到電腦的記憶體被耗盡為止。以上例而言,n==1即滿足結(jié)束條件,此時我們直接將output設(shè)為1,而不再呼叫此函數(shù)本身。??
?
1-5、搜尋路徑??
在前一節(jié)中,test.m所在的文件夾是d:\mlbook。假設(shè)不先進入這個文件夾,MATLAB就找不到你要運行的M檔案。假設(shè)希望MATLAB不論在何處都能運行test.m,那麼就必須將d:\mlbook增加MATLAB的搜尋路徑(Search path)上。要檢視MATLAB的搜尋路徑,鍵入path就可以:?
path???
MATLABPATH??
d:\matlab5\toolbox\matlab\general??
d:\matlab5\toolbox\matlab\ops??
d:\matlab5\toolbox\matlab\lang??
d:\matlab5\toolbox\matlab\elmat???
d:\matlab5\toolbox\matlab\elfun???
d:\matlab5\toolbox\matlab\specfun???
d:\matlab5\toolbox\matlab\matfun???
d:\matlab5\toolbox\matlab\datafun??
d:\matlab5\toolbox\matlab\polyfun??
d:\matlab5\toolbox\matlab\funfun??
d:\matlab5\toolbox\matlab\sparfun??
d:\matlab5\toolbox\matlab\graph2d??
d:\matlab5\toolbox\matlab\graph3d??
d:\matlab5\toolbox\matlab\specgraph???
d:\matlab5\toolbox\matlab\graphics??
d:\matlab5\toolbox\matlab\uitools??
d:\matlab5\toolbox\matlab\strfun??
d:\matlab5\toolbox\matlab\iofun??
d:\matlab5\toolbox\matlab\timefun??
d:\matlab5\toolbox\matlab\datatypes??
d:\matlab5\toolbox\matlab\dde??
d:\matlab5\toolbox\matlab\demos??
d:\matlab5\toolbox\tour???
d:\matlab5\toolbox\simulink\simulink??
d:\matlab5\toolbox\simulink\blocks??
d:\matlab5\toolbox\simulink\simdemos???
d:\matlab5\toolbox\simulink\dee??
d:\matlab5\toolbox\local??
此搜尋路徑會依已安裝的工具箱(Toolboxes)不同而有所不同。要查詢某一命令是在搜尋路徑的何處,可用which命令:???
which expo??
d:\matlab5\toolbox\matlab\demos\expo.m??
非常顯然c:\data\mlbook并不在MATLAB的搜尋路徑中,因此MATLAB找不到test.m這個M檔案:??
which test??
c:\data\mlbook\test.m??
要將d:\mlbook增加MATLAB的搜尋路徑,還是使用path命令:??
path(path, 'c:\data\mlbook');???
此時d:\mlbook已增加MATLAB搜尋路徑(鍵入path試看看),因此MATLAB已經(jīng)"看"得到
test.m:??
which test??
c:\data\mlbook\test.m??
如今我們就能夠直接鍵入test,而不必先進入test.m所在的文件夾。??
小提示:怎樣在其啟動MATLAB時,自己主動設(shè)定所需的搜尋路徑? 假設(shè)在每一次啟動MATLAB後都要設(shè)定所需的搜尋路徑,將是一件非常麻煩的事。有兩種方法,能夠使MATLAB啟動後 ,就可以加載使用者定義的搜尋路徑:??
1.MATLAB的預設(shè)搜尋路徑是定義在matlabrc.m(在c:\matlab之下,或是其它安裝MATLAB 的主文件夾下),MATLAB每次啟動後,即自己主動運行此檔案。因此你能夠直接改動matlabrc.m ,以增加新的文件夾於搜尋路徑之中。??
2.MATLAB在運行matlabrc.m時,同一時候也會在預設(shè)搜尋路徑中尋找startup.m,若此檔案存在,則運行其所含的命令。因此我們可將全部在MATLAB啟動時必須運行的命令(包括更改搜尋路徑的命令),放在此檔案中。??
每次MATLAB遇到一個命令(比如test)時,其處置程序為:??
1.將test視為使用者定義的變數(shù)。
2.若test不是使用者定義的變數(shù),將其視為永久常數(shù) 。
3.若test不是永久常數(shù),檢查其是否為眼下工作文件夾下的M檔案。
4.若不是,則由搜尋路徑尋找是否有test.m的檔案。
5.若在搜尋路徑中找不到,則MATLAB會發(fā)出嗶嗶聲并印出錯誤訊息。??
下面介紹與MATLAB搜尋路徑相關(guān)的各項命令。??
?
?
1-6、資料的儲存與加載??
有些計算曠日廢時,那麼我們通常希望能將計算所得的儲存在檔案中,以便將來可進行其它處理。MATLAB儲存變數(shù)的基本命令是save,在不加不論什么選項(Options)時,save會將變數(shù)以二進制(Binary)的方式儲存至副檔名為mat的檔案,例如以下述:??
save:將工作空間的全部變數(shù)儲存到名為matlab.mat的二進制檔案。
save filename:將工作空間的全部變數(shù)儲存到名為filename.mat的二進制檔案。 save filename x y z :將變數(shù)x、y、z儲存到名為filename.mat的二進制檔案。??
下面為使用save命令的一個簡例:??
who % 列出工作空間的變數(shù)??
Your variables are:?
B h j y??
ans i x z??
save test B y % 將變數(shù)B與y儲存至test.mat??
dir % 列出如今文件夾中的檔案??
. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc??
.. 3plotxyz.doc first.doc temp.doc test.mat??
1basic.doc book.dot go.m template.doc testfile.dat??
delete test.mat % 刪除test.mat??
以二進制的方式儲存變數(shù),通常檔案會比較小,并且在加載時速度較快,可是就無法用普通的文書軟體(比如pe2或記事本)看到檔案內(nèi)容。若想看到檔案內(nèi)容,則必須加上-ascii選項,詳見下述:??
save filename x -ascii:將變數(shù)x以八位數(shù)存到名為filename的ASCII檔案。
Save filename x -ascii -double:將變數(shù)x以十六位數(shù)存到名為filename的ASCII檔案。??
還有一個選項是-tab,可將同一列相鄰的數(shù)目以定位鍵(Tab)隔開。??
小提示:二進制和ASCII檔案的比較 在save命令使用-ascii選項後,會有下列現(xiàn)象:save命令就不會在檔案名稱後加上mat的副檔名。
因此以副檔名mat結(jié)尾的檔案一般是MATLAB的二進位資料檔。
若非有特殊須要,我們應該盡量以二進制方式儲存資料。???
load命令可將檔案加載以取得儲存之變數(shù):??
load filename:load會尋找名稱為filename.mat的檔案,并以二進制格式加載。若找不到filename.mat,則尋找名稱為filename的檔案,并以ASCII格式加載。load filename-ascii:load會尋找名稱為filename的檔案,并以ASCII格式加載。??
若以ASCII格式加載,則變數(shù)名稱即為檔案名稱(但不包括副檔名)。若以二進制加載,則可保留原有的變數(shù)名稱,例如以下例:??
clear all; % 清除工作空間中的變數(shù)??
x = 1:10;??
save testfile.dat x -ascii % 將x以ASCII格式存至名為testfile.dat的檔案??
load testfile.dat % 加載testfile.dat??
who % 列出工作空間中的變數(shù)??
Your variables are:?
testfile x??
注意在上述過程中,由於是以ASCII格式儲存與加載,所以產(chǎn)生了一個與檔案名稱同樣的變數(shù)testfile,此變數(shù)的值和原變數(shù)x全然同樣。??
1-7、結(jié)束MATLAB??
有三種方法能夠結(jié)束MATLAB:??
1.鍵入exit
2.鍵入quit
3.直接關(guān)閉MATLAB的命令視窗(Command window)??
?
?
2.數(shù)值分析
2.1微分?
diff函數(shù)用以演算一函數(shù)的微分項,相關(guān)的函數(shù)語法有下列4個:??
diff(f) 傳回f對預設(shè)獨立變數(shù)的一次微分值??
diff(f,'t') 傳回f對獨立變數(shù)t的一次微分值??
diff(f,n) 傳回f對預設(shè)獨立變數(shù)的n次微分值??
diff(f,'t',n) 傳回f對獨立變數(shù)t的n次微分值??
??? 數(shù)值微分函數(shù)也是用diff,因此這個函數(shù)是靠輸入的引數(shù)決定是以數(shù)值或是符號微分,假設(shè)引數(shù)為向量則運行數(shù)值微分,假設(shè)引數(shù)為符號表示式則運行符號微分。??
??? 先定義下列三個方程式,接著再演算其微分項:??
>>S1 = '6*x^3-4*x^2+b*x-5';??
>>S2 = 'sin(a)';??
>>S3 = '(1 - t^3)/(1 + t^4)';??
>>diff(S1)??
ans=18*x^2-8*x+b??
>>diff(S1,2)??
ans= 36*x-8??
>>diff(S1,'b')??
ans= x??
>>diff(S2)??
ans=??
cos(a)??
>>diff(S3)??
ans=-3*t^2/(1+t^4)-4*(1-t^3)/(1+t^4)^2*t^3??
>>simplify(diff(S3))??
ans= t^2*(-3+t^4-4*t)/(1+t^4)^2?
2.2積分?
?int函數(shù)用以演算一函數(shù)的積分項, 這個函數(shù)要找出一符號式 F 使得diff(F)=f。假設(shè)積
分式的解析式(analytical form, closed form) 不存在的話或是MATLAB無法找到,則int 傳回原輸入的符號式。相關(guān)的函數(shù)語法有下列 4個:??
int(f) 傳回f對預設(shè)獨立變數(shù)的積分值??
int(f,'t') 傳回f對獨立變數(shù)t的積分值??
int(f,a,b) 傳回f對預設(shè)獨立變數(shù)的積分值,積分區(qū)間為[a,b],a和b為數(shù)值式??
int(f,'t',a,b) 傳回f對獨立變數(shù)t的積分值,積分區(qū)間為[a,b],a和b為數(shù)值式??
int(f,'m','n') 傳回f對預設(shè)變數(shù)的積分值,積分區(qū)間為[m,n],m和n為符號式??
我們示范幾個樣例:??
>>S1 = '6*x^3-4*x^2+b*x-5';??
>>S2 = 'sin(a)';??
>>S3 = 'sqrt(x)';?
>>int(S1)??
ans= 3/2*x^4-4/3*x^3+1/2*b*x^2-5*x??
>>int(S2)??
ans= -cos(a)??
>>int(S3)??
ans= 2/3*x^(3/2)??
>>int(S3,'a','b')??
ans= 2/3*b^(3/2)- 2/3*a^(3/2)??
>>int(S3,0.5,0.6)???
ans= 2/25*15^(1/2)-1/6*2^(1/2)??
>>numeric(int(S3,0.5,0.6)) % 使用numeric函數(shù)能夠計算積分的數(shù)值??
ans= 0.0741?
2.3求解常微分方程式??
??MATLAB解常微分方程式的語法是dsolve('equation','condition'),當中equation代表常微分方程式即y'=g(x,y),且須以Dy代表一階微分項y' D2y代表二階微分項y'' ,???
condition則為初始條件。?????
如果有下面三個一階常微分方程式和其初始條件?????
y'=3x2, y(2)=0.5????
y'=2.x.cos(y)2, y(0)=0.25??????
y'=3y+exp(2x), y(0)=3????
相應上述常微分方程式的符號運算式為:??????
>>soln_1 = dsolve('Dy =3*x^2','y(2)=0.5')??????
ans= x^3-7.500000000000000?????
>>ezplot(soln_1,[2,4]) % 看看這個函數(shù)的長相?????
>>soln_2 = dsolve('Dy =2*x*cos(y)^2','y(0) = pi/4')??????
ans= atan(x^2+1)????
>>soln_3 = dsolve('Dy = 3*y +exp(2*x)',' y(0) = 3')??????
ans= -exp(2*x)+4*exp(3*x)???
2.4非線性方程式的實根??
??? 要求任一方程式的根有三步驟:???
??? 先定義方程式。要注意必須將方程式安排成 f(x)=0 的形態(tài),比如一方程式為sin(x)=3,
則該方程式應表示為f(x)=sin(x)-3。能夠 m-file 定義方程式。??
??? 代入適當范圍的 x, y(x) 值,將該函數(shù)的分布圖畫出,藉以了解該方程式的「長相」。?
??? 由圖中決定y(x)在何處附近(x0)與 x 軸相交,以fzero的語法fzero('function',x0)就可以求出在 x0附近的根,當中 function 是先前已定義的函數(shù)名稱。假設(shè)從函數(shù)分布圖看出根不僅僅一個,則須再代入還有一個在根附近的 x0,再求出下一個根。??
??? 下面分別介紹幾數(shù)個方程式,來說明怎樣求解它們的根。?
??? 例一、方程式為??
???sin(x)=0??
??? 我們知道上式的根有 ,求根方式例如以下:??
>> r=fzero('sin',3) % 由于sin(x)是內(nèi)建函數(shù),其名稱為sin,因此無須定義它,選擇 x=3 附近求根??
?r=3.1416??
>> r=fzero('sin',6) % 選擇 x=6 附近求根??
r = 6.2832?
??? 例二、方程式為MATLAB 內(nèi)建函數(shù) humps,我們不需要知道這個方程式的形態(tài)為何,只是我們能夠?qū)⑺鼊澇鰜?#xff0c;再找出根的位置。求根方式例如以下:??
>> x=linspace(-2,3);??
>> y=humps(x);??
>> plot(x,y), grid % 由圖中可看出在0和1附近有二個根
?
>> r=fzero('humps',1.2)??
r = 1.2995?
例三、方程式為y=x.^3-2*x-5??
??? 這個方程式事實上是個多項式,我們說明除了用 roots 函數(shù)找出它的根外,也能夠用這節(jié)介紹的方法求根,注意二者的解法及結(jié)果有所不同。求根方式例如以下:??
% m-function, f_1.m??
function y=f_1(x) % 定義 f_1.m 函數(shù)??
y=x.^3-2*x-5;?
>> x=linspace(-2,3);??
>> y=f_1(x);??
>> plot(x,y), grid % 由圖中可看出在2和-1附近有二個根?
?
>> r=fzero('f_1',2); % 決定在2附近的根??
r = 2.0946??
>> p=[1 0 -2 -5]??
>> r=roots(p) % 以求解多項式根方式驗證??
r =??
2.0946??
-1.0473 + 1.1359i ??
-1.0473 - 1.1359i??
2.5線性代數(shù)方程(組)求解
??? 我們習慣將上組方程式以矩陣方式表演示樣例如以下??
????AX=B??
當中 A 為等式左邊各方程式的系數(shù)項,X 為欲求解的未知項,B 代表等式右邊之已知項?
要解上述的聯(lián)立方程式,我們能夠利用矩陣左除 \ 做運算,即是 X=A\B。??
??? 假設(shè)將原方程式改寫成 XA=B?
當中 A 為等式左邊各方程式的系數(shù)項,X 為欲求解的未知項,B 代表等式右邊之已知項?
??? 注意上式的 X, B 已改寫成列向量,A事實上是前一個方程式中 A 的轉(zhuǎn)置矩陣。上式的 X 能夠矩陣右除 / 求解,即是 X=B/A。??
??? 若以反矩陣運算求解 AX=B, X=B,即是 X=inv(A)*B,或是改寫成 XA=B, X=B,即是X=B*inv(A)。??
??? 我們直接以以下的樣例來說明這三個運算的使用方法:??
>> A=[3 2-1; -1 3 2; 1 -1 -1]; % 將等式的左邊系數(shù)鍵入??
>> B=[10 5 -1]'; % 將等式右邊之已知項鍵入,B要做轉(zhuǎn)置??
>> X=A\B % 先以左除運算求解??
X = % 注意X為行向量??
-2??
5??
6??
>> C=A*X % 驗算解是否正確??
C = % C=B??
?
10??
5??
-1?
>> A=A'; % 將A先做轉(zhuǎn)置??
>> B=[10 5 -1];??
>> X=B/A % 以右除運算求解的結(jié)果亦同??
X = % 注意X為列向量??
10?5? -1??
>> X=B*inv(A); % 也能夠反矩陣運算求解?
??
3.基本xy平面畫圖命令??
??? MATLAB不但擅長於矩陣相關(guān)的數(shù)值運算,也適合用在各種科學目視表示(Scientificvisualization)。
??? 本節(jié)將介紹MATLAB基本xy平面及xyz空間的各項畫圖命令,包括一維曲線及二維曲面的繪制、列印及存檔。??
??? plot是繪制一維曲線的基本函數(shù),但在使用此函數(shù)之前,我們需先定義曲線上每一點的x 及y座標。
下例可畫出一條正弦曲線:??
close all;
x=linspace(0, 2*pi, 100); % 100個點的x座標??
y=sin(x); % 相應的y座標??
plot(x,y);??
?
小整理:MATLAB基本畫圖函數(shù)
plot: x軸和y軸均為線性刻度(Linear scale)
loglog: x軸和y軸均為對數(shù)刻度(Logarithmic scale)
semilogx: x軸為對數(shù)刻度,y軸為線性刻度
semilogy: x軸為線性刻度,y軸為對數(shù)刻度??
若要畫出多條曲線,僅僅需將座標對依次放入plot函數(shù)就可以:??
plot(x, sin(x), x, cos(x));??
?
若要改變顏色,在座標對後面加上相關(guān)字串就可以:??
plot(x, sin(x), 'c', x, cos(x), 'g');??
?
若要同一時候改變顏色及圖線型態(tài)(Line style),也是在座標對後面加上相關(guān)字串就可以:?
plot(x, sin(x), 'co', x, cos(x), 'g*');??
?
小整理:plot畫圖函數(shù)的叁數(shù) 字元 顏色字元 圖線型態(tài)y 黃色. 點k 黑色o 圓w 白色x? xb 藍色+ +g 綠色* *r 紅色- 實線c 亮青色: 點線m 錳紫色-. 點虛線-- 虛線?
圖形完畢後,我們可用axis([xmin,xmax,ymin,ymax])函數(shù)來調(diào)整圖軸的范圍:??
axis([0, 6, -1.2, 1.2]);?
?
此外,MATLAB也可對圖形加上各種注解與處理:??
xlabel('Input Value'); % x軸注解??
ylabel('Function Value'); % y軸注解??
title('Two Trigonometric Functions'); % 圖形標題??
legend('y = sin(x)','y = cos(x)'); % 圖形注解??
grid on; % 顯示格線??
?
我們可用subplot來同一時候畫出數(shù)個小圖形於同一個視窗之中:??
subplot(2,2,1); plot(x, sin(x));??
subplot(2,2,2); plot(x, cos(x));??
subplot(2,2,3); plot(x, sinh(x));??
subplot(2,2,4); plot(x, cosh(x)); ?
?
MATLAB還有其它各種二維畫圖函數(shù),以適合不同的應用,詳見下表。??
小整理:其它各種二維畫圖函數(shù)
bar 長條圖
errorbar 圖形加上誤差范圍
fplot 較精確的函數(shù)圖形
polar 極座標圖
hist 累計圖
rose 極座標累計圖
stairs 階梯圖
stem 針狀圖
fill 實心圖
feather 羽毛圖
compass 羅盤圖
quiver 向量場圖?
下面我們針對每一個函數(shù)舉例。?
當資料點數(shù)量不多時,長條圖是非常適合的表示方式:??
close all; % 關(guān)閉全部的圖形視窗??
x=1:10;???
y=rand(size(x));???
bar(x,y);??
?
假設(shè)已知資料的誤差量,就可用errorbar來表示。下例以單位標準差來做資的誤差量:
x = linspace(0,2*pi,30);???
y = sin(x);??
e = std(y)*ones(size(x));??
errorbar(x,y,e)??
?
對於變化劇烈的函數(shù),可用fplot來進行較精確的畫圖,會對劇烈變化處進行較密集的取樣,例如以下例:??
fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是畫圖范圍??
?
若要產(chǎn)生極座標圖形,可用polar:??
theta=linspace(0, 2*pi);??
r=cos(4*theta);???
polar(theta, r); ?
?
對於大量的資料,我們可用hist來顯示資料的分 情況和統(tǒng)計特性。以下幾個命令可用來驗證randn產(chǎn)生的高斯亂數(shù)分 :??
x=randn(5000, 1); % 產(chǎn)生5000個 m=0,s=1 的高斯亂數(shù)??
hist(x,20); % 20代表長條的個數(shù)??
?
rose和hist非常接近,僅僅只是是將資料大小視為角度,資料個數(shù)視為距離,并用極座標繪制
表示:??
x=randn(1000, 1);??
rose(x);??
?
stairs可畫出階梯圖:??
x=linspace(0,10,50);??
y=sin(x).*exp(-x/3);??
stairs(x,y);??
?
stems可產(chǎn)生針狀圖,常被用來繪制數(shù)位訊號:??
x=linspace(0,10,50);??
y=sin(x).*exp(-x/3);??
stem(x,y);??
?
stairs將資料點視為多邊行頂點,并將此多邊行涂上顏色:??
x=linspace(0,10,50);???
y=sin(x).*exp(-x/3);??
fill(x,y,'b'); % 'b'為藍色??
?
feather將每個資料點視復數(shù),并以箭號畫出:???
theta=linspace(0, 2*pi, 20);??
z = cos(theta)+i*sin(theta);??
feather(z);??
?
compass和feather非常接近,僅僅是每一個箭號的起點都在圓點:??
theta=linspace(0, 2*pi, 20);??
z = cos(theta)+i*sin(theta);??
compass(z);??
?
??
4.基本XYZ立體畫圖命令??
在科學目視表示(Scientific visualization)中,三度空間的立體圖是一個很重要的技巧。本章將介紹MATLAB基本XYZ三度空間的各項畫圖命令。???
mesh和plot是三度空間立體畫圖的基本命令,mesh可畫出立體網(wǎng)狀圖,plot則可畫出立體曲面圖,兩者產(chǎn)生的圖形都會依高度而有不同顏色。
下列命令可畫出由函數(shù)<圖片>形成的立體網(wǎng)狀圖:??
x=linspace(-2, 2, 25); % 在x軸上取25點??
y=linspace(-2, 2, 25); % 在y軸上取25點??
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩陣??
zz=xx.*exp(-xx.^2-yy.^2); % 計算函數(shù)值,zz也是21x21的矩陣??
mesh(xx, yy, zz); % 畫出立體網(wǎng)狀圖??
?
surf和mesh的使用方法類似:???
x=linspace(-2, 2, 25); % 在x軸上取25點??
y=linspace(-2, 2, 25); % 在y軸上取25點??
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩陣???
zz=xx.*exp(-xx.^2-yy.^2); % 計算函數(shù)值,zz也是21x21的矩陣???
surf(xx, yy, zz); % 畫出立體曲面圖??
?
?
為了方便測試立體畫圖,MATLAB提供了一個peaks函數(shù),可產(chǎn)生一個凹凸有致的曲面,包括了三個局部極大點及三個局部極小點??
要畫出此函數(shù)的最快方法即是直接鍵入peaks:??
peaks??
?
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...??
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...??
- 1/3*exp(-(x+1).^2 - y.^2)??
我們亦可對peaks函數(shù)取點,再以各種不同方法進行畫圖。
meshz可將曲面加上圍裙:??
[x,y,z]=peaks;??
meshz(x,y,z);??
axis([-inf inf -inf inf -inf inf]);??
?
waterfall可在x方向或y方向產(chǎn)生水流效果:??
[x,y,z]=peaks;??
waterfall(x,y,z);??
axis([-inf inf -inf inf -inf inf]);??
?
?
下列命令產(chǎn)生在y方向的水流效果:??
[x,y,z]=peaks;??
waterfall(x',y',z');??
axis([-inf inf -inf inf -inf inf]);??
?
meshc同一時候畫出網(wǎng)狀圖與等高線:??
[x,y,z]=peaks;??
meshc(x,y,z);??
axis([-inf inf -inf inf -inf inf]);??
?
?
surfc同一時候畫出曲面圖與等高線:??
[x,y,z]=peaks;??
surfc(x,y,z);??
axis([-inf inf -inf inf -inf inf]);??
?
?
?
contour3畫出曲面在三度空間中的等高線:??
contour3(peaks, 20);??
axis([-inf inf -inf inf -inf inf]); ?
?
?
contour畫出曲面等高線在XY平面的投影:??
contour(peaks, 20);??
?
plot3可畫出三度空間中的曲線:??
t=linspace(0,20*pi, 501);???
plot3(t.*sin(t), t.*cos(t), t);??
?
亦可同一時候畫出兩條三度空間中的曲線:?
t=linspace(0, 10*pi, 501);??
plot3(t.*sin(t), t.*cos(t), t, t.*sin(t), t.*cos(t), -t);??
?
?
4.三維網(wǎng)圖的高級處理
1.??????消隱處理
例.比較網(wǎng)圖消隱前后的圖形
z=peaks(50);
subplot(2,1,1);
mesh(z);
title('消隱前的網(wǎng)圖')
hidden off
subplot(2,1,2)
mesh(z);
title('消隱后的網(wǎng)圖')
hidden on
colormap([0 0 1])
?
?
2.??????裁剪處理
利用不定數(shù)NaN的特點,能夠?qū)W(wǎng)圖進行裁剪處理
例.圖形裁剪處理
P=peaks(30);
subplot(2,1,1);
mesh(P);
title('裁剪前的網(wǎng)圖')
subplot(2,1,2);
P(20:23,9:15)=NaN*ones(4,7);???????%剪孔
meshz(P)????????????????????????%垂簾網(wǎng)線圖
title('裁剪后的網(wǎng)圖')
colormap([0 0 1])??????????????????%藍色網(wǎng)線
?
注意裁剪時矩陣的相應關(guān)系,即大小一定要同樣.
?
?
3.??????三維旋轉(zhuǎn)體的繪制
為了一些專業(yè)用戶能夠更方便地繪制出三維旋轉(zhuǎn)體,MATLAB專門提供了2個函數(shù):柱面函數(shù)cylinder和球面函數(shù)sphere
(1)?? 柱面圖
柱面圖繪制由函數(shù)cylinder實現(xiàn).
[X,Y,Z]=cylinder(R,N)? 此函數(shù)以母線向量R生成單位柱面.母線向量R是在單位高度里等分刻度上定義的半徑向量.N為旋轉(zhuǎn)圓周上的分格線的條數(shù).能夠用surf(X,Y,Z)來表示此柱面.
[X,Y,Z]=cylinder(R)或[X,Y,Z]=cylinder此形式為默認N=20且R=[1 1]
?
例.柱面函數(shù)演示舉例
x=0:pi/20:pi*3;
r=5+cos(x);
[a,b,c]=cylinder(r,30);
mesh(a,b,c)
?
?
?
例.旋轉(zhuǎn)柱面圖.
r=abs(exp(-0.25*t).*sin(t));
t=0:pi/12:3*pi;
r=abs(exp(-0.25*t).*sin(t));
[X,Y,Z]=cylinder(r,30);
mesh(X,Y,Z)
colormap([1 0 0])
?
?
(2).球面圖
球面圖繪制由函數(shù)sphere來實現(xiàn)
[X,Y,Z]=sphere(N)???????????? 此函數(shù)生成3個(N+1)*(N+1)的矩陣,利用函數(shù)??????? surf(X,Y,Z) 可產(chǎn)生單位球面.
[X,Y,Z]=sphere???????? 此形式使用了默認值N=20.
Sphere(N)???????????? 僅僅是繪制了球面圖而不返回不論什么值.
例.繪制地球表面的氣溫分布示意圖.
[a,b,c]=sphere(40);
t=abs(c);
surf(a,b,c,t);
axis('equal')?? %此兩句控制坐標軸的大小同樣.
axis('square')
colormap('hot')
?
總結(jié)
以上是生活随笔為你收集整理的MATLAB新手教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在企业内部使用openssl创建私有CA
- 下一篇: 【闲聊产品】之七:投票真的有用么?
