MATLAB入門筆記


% MATLAB:MATLAB 為 Matrix Laboratory ,用來處理矩陣可編程可實現算法邏輯的計算工具
%
% eg:1 繪制正弦和余弦曲線
x=[0:0.1:4*pi]; %建立角度向量
plot(x,sin(x),x,cos(x)) %畫圖
axis([0,2*pi,-1,1]) %設定坐標軸范圍
title(′正弦和余弦曲線′); %圖形名稱
xlabel(′θ(弧度)′) %x軸名
ylabel(′y′) %y軸名
legend(′sinθ′,′cosθ′); %圖例
grid on; %網格線


% MATLAB指令系統
% Who或whos 顯示在當前工作區中的所有變量名,前者顯示變量名,后者還顯示變量的大小、字節數和類型
% disp(x) 顯示x的內容,它可以是矩陣或字符串
% which test 顯示 M 文件 test.m 所在的目錄
% type test 在命令窗口下顯示 test.m 的內容
% cd,chdir,pwd 顯示目前的工作目錄
% Load 文件名 調出mat文件中的數據。也可以調出文本文件,但是文本文件只能是由數字組成的矩陣形式
% diary
% 建立一個文本文件,記錄在MATLAB中輸入的所有命令和它們的輸出,但是不能包括圖形。如果想把你的輸入存入一個特定的文件中,可使用 diary
% filename 建立文件。使用diary off↙命令可以停止記錄
%
% what 返回目前目錄下M,MAT,MEX文件的列表
% echo 控制是否顯示M文件執行的每一條命令
% clc 擦除MATLAB工作區中所有顯示的內容
% clf 擦除MATLAB圖形 工作區中的圖形
% hold 控制當前圖形窗口對象是否被刷新(在圖表中保持現有圖形)
% dir,ls 列出指定目錄下的文件和子目錄清單
% path 顯示目前的搜索路徑,可以用File菜單中的 Set path 觀察和修改路徑
% quit 退出工作區可以用,也可選擇File菜單中Exit命令
%
% 鍵盤操作部分
% ↑/Ctrl+p 重調前一行 (用於調出前面的命令進行修改,重新計算)
% ↓/Ctrl+n 重調下一行
% →/Ctrl+b 向前移一個字符
% ←/Ctrl+f 向后移一個字符
% Ctrl+→ 右移一個字
% Ctrl+← 左移一個字
% Home 移動到行首
% End 移動到行尾
% Esc 清除一行
% Del 刪除光標后的字符
% Backspace 刪除光標前的一個字符
% Ctrl+k 刪除到行尾
% help 查看當前幫助系統
% look for 關鍵字查找,若是要全文搜索,需要加上 -all
% 模糊查詢: 輸入關鍵字,然后按tab鍵,系統會列出這幾個關鍵字開頭的命令
%
% 三種基本數據類型:
% 1.數值型數據:輸入的數據為數值數據,包括實數和負數
% 2.字符串數據: 用英文格式單引號加以界定的數字,字符,各種符號,表達式,方程式和漢字等
% 3.符號型數據: 用sym或syms把字符、表達式、方程、矩陣等定義成數學符號,運算結果為數學表達式
%
% 變量符號的命名規則基本類似與JAVA,大小寫是區分的,長度不能大於63個。
%
% 表達式使用示例:
% x = sin(pi/4) (若省略“=”,系統自動建立一個名為ans的變量)
% x = sin(pi/4); 若以分號結束,則只進行計算不會馬上顯示結果,但是不寫分號,則會馬上顯示結果
% 一行中若是寫幾個語句,他們之間要用逗號或分號隔開
% 表達式的變量需要先定義后使用!
%
% 符號變量的聲明: syms sym
% syms a1 a2 a3
% a1,a2,a3是需要定義為符號變量的標識符,不能是數字、函數表達式或方程式。
% 變量a1,a2,a3,不能用引號界定,而是用“空格”隔開
%
% x = sym(1/2),y = sym('1/2'), z = sym('sin(x)+exp(x)')
% 顯然,sym定義的字符參量可以是數字,字符串,也可以是字符串變量名,字符表達式或字符方程
%
% eg 2: 求極限
% lim [x^(1/m)-a^(1/a)]/x-a , x->a

syms x a;
y = sym('[x^(1/m)-a^(1/a)]/x-a')
limit(y,x,a)

% MATLAB的固定變量:
% ans 用於結果的缺省變量名
% i j 虛數單位,定義為根號-1
% pi 圓周率
% Inf 無窮大,如1/0
% NaN 不確定量 如0/0
% realmin 最小正實數 2.225073858507201×10-308
% realmax 最大正實數 1.797693134862316×10+308
%
% 對變量操作的命令
% who 顯示當前工作空間中所有變量的一個簡單列表
% whos 列出變量的大小、數據格式等詳細信息
% clear 清除指定變量
% save 文件名 變量名 將變量列中所列出的變量保存到磁盤文件中,變量列表中,各個不同的變量之間不能用逗號,只能用空格來分隔
% load 文件名 變量名 將以前用save命令保存的變量從磁盤文件中調入MATLAB工作空間
%
%
% MATLAB主要操作之一:矩陣
% 常用操作矩陣的變量的方法:
% 1.在命令窗口中輸入
% 2.語句生成
% 3.函數生成
% 4.小矩陣生成大矩陣
%
% 使用原則:
% 1.矩陣的元素排列在方括號內
% 2.按行輸入,每行內的元素使用空格或逗號分隔
% 3.行與行之間用分號,或回車鍵隔開
% 4.矩陣生成不但可以使用純數字(含復數),也可以使用變量和表達式
%
% 方括號表達式示例: A = [ 1,2,3;4,5,6;7,8,9]
% 語句生成示例: B = a:h:b 或 B = [a:h:b]
% 其中a為初始值,h為步長,b為終止值。當步長為1時可省略h參數,另外h也可以取負數
% C = linspace(a,b,n) 等價於 C = a:(b-a)/(n-1):b
% 意義是:在線性空間上,行矢量的值從a到b,數據個數為n,缺省則n默認為100.
%
% 常用創建矩陣的函數:
% ones(m,n) 產生m x n的全1矩陣
% zeros(m,n) 產生m x n的全0矩陣
% rand(m,n) 產生m x n的隨機矩陣
% eye(m,n) 產生m x n的對角線全1矩陣
% length(X) 返回矩陣最長的維的維度
% size(X) 返回矩陣每一維的長度
%
% 4.小矩陣生成大矩陣示例:
% a = [ 1,2;3 4]
% c = [a a+2 3*a a-2]
% c =
% 1 2 3 4
% 3 4 5 6
% 3 6 -1 0
% 9 12 1 2
%
%
% 矩陣的引用:
% 一.引用矩陣元素
% 1.通過下表引用矩陣元素
% 2.矩陣元素的序號來引用矩陣元素。按列排序,m x n 矩陣A,矩陣元素A(i,j)的序號為(j-1)*m + i (m為列的長度)
% 二.矩陣的拆分
% 1.A(:,j)
% A(:,j)表示取A矩陣的第j列全部元素;
% A(i:i+m,:)表示取A矩陣第i~i+m行的全部元素;
% A(:,k:k+m)表示取A矩陣第k~k+m列的全部元素;
% A(i:i+m,k:k+m)表示取A矩陣第i~i+m行內,並在第k~k+m列中的所有元素
%
%
% MATLAB對數值矩陣的兩種不同的運算方法:
% 矩陣算法
% 把矩陣看作一個整體,各種運算完全按照線性代數代表的矩陣運算法則進行,運算的書寫形式和運算符號都與矩陣理論完全相同。
% 數組算法
% 把矩陣看作由其元素構成的一組數據(數組),各種運算是在參與運算矩陣的對應元素之間進行的數與數的運算,這種運算方便對大批數據的處理和一次求出多個函數值。
% 數組算法的運算符主要有 .* ./ .\ .^
%
% MATLAB運算符:
% + 加 A+B A B必須大小相同,或一個是標量
% - 減 A-B A B必須大小相同,或一個是標量
% * 矩陣乘 A*B A 的列數等於B的行數
% .* 數組乘 A.*B A B必須大小相同
% \ 矩陣左除 A\B =A-1* B 等效於A*X=B求X A-1=inv(A)
% .\ 數組左除 A.\B Bij/Aij
% / 矩陣右除 A/B =A*B-1 等效於X*B=A求X
% ./ 數組右除 A./B Aij/Bij
% ^ 矩陣乘方 A^m A自乘m次
% .^ 數組乘方 A.^m A中每個元素的m次方
%
% 總結:1.直接使用運算符是矩陣運算,前面帶小數點為數組計算。
% 2.矩陣運算的結果是由原本的矩陣得到一個新的矩陣,而數組運算是對原本矩陣的矩陣中的元素做對應的運算
%
%
% 關系運算符:
% ==
% ~=
% >
% <
% >=
% <=
%
% 邏輯運算符:
% &
% |
% !
% 說明:邏輯運算認定任何非零的元素都為真“1”,任何零元素都為假“0”.
%
% 轉置:
% A' —— 共軛轉置(將矩陣中的每個元素取共軛復數,再轉置)
% A.' —— 普通轉置(直接對矩陣做轉置)
%
% 逆矩陣與行列式計算:
% 求 逆: inv(A)
% 求行列式: det(A)
% 注意:這兩種運算都要求矩陣A為方陣!
%
% 矩陣下標說明:MATLAB的矩陣中不同於其他語言,矩陣的下標從1開始,而不是從0開始!
%
% 重點1:四則運算與冪運算
% 1.只有維數相同的矩陣才能進行加減運算
% 2.只有當兩個矩陣中前一個矩陣的列數和后一個矩陣的行數相同時,才可以進行乘法運算。
% 3.a\b運算等效於求a*X=b的解,而a/b等效於求x*b=a的解。(這一條可以用來求方程的解)
% 4.只有仿真才可以求冪
% 5.點運算是兩個維數相同矩陣對應元素之間的運算。
%
% 特殊矩陣之對角矩陣:V = [a1,a2,a3···,an]
% A = diag(V)
% A = a1 0 0·
% 0 a2 0 0
% 0 0 a3·
% · · ·an
%
% 數值顯示格式控制:Format命令
% format(short) : 短格式(5位定點書)99.1253
% format long : 長格式(15位定點書)99.123456789000000
% format short e : 短格式e方式 9.91e+001
% format long e : 長格式e方式 9.912345678900000e+001
% format bank : 2位十進制(小數部分)99.12
% format hex : 十六進制格式
%
% 重點一:求線性方程的解:
% x1 + 4*x2 - 7*x3 + 6*x4 = 0
% 2*x2 + x3 + x4 = -8
% x2 + x3 + 3*x4 = -2
% x1 + x3 - x4 = 1
%
% 實際代碼:
A = [1 4 -7 6;0 2 1 1;0 1 1 3;1 0 1 -1]
B = [0;-1;-2;1]
x = A\B

% MATLAB繪圖篇:
% help graph2d可以得到所用畫二維圖形的命令
% help graph3d可以得到所用畫三維圖形的命令
%
% 一:繪制二維圖形
% 格式:
% plot(X,'S')
% plot(X,Y,'S')
% plot(X1,Y1,'S1',X2,Y2,'S2'···,Xn,Yn,'Sn')
% 說明:
% 參數‘S’控制數據點的 標記 曲線類型 和 曲線色彩 , 三者置於一對單引號內。
%
% 常用的繪圖選項:
% - 實線 * 用星號標出數據點
% -- 虛線 . 用點號標出數據點
% : 點線 。 用圓圈號標出數據點
% -. 點划線 x 用叉號標出數據點
% b 藍色 + 用加號標出數據點
% g 綠色 s 用正方形標出數據點
% r 紅色 D 用菱形出數據點
% c 青色 V 用下三角標出數據點
% m 洋紅 ^ 用上三角標出數據點
% y 黃色 < 用左三角標出數據點
% k 黑色 > 用右三角標出數據點
% w 白色 H 用六角形標出數據點
% P 用五角形標出數據點
%

% 格式一:plot(X,'S')
% 說明:
% 當X是實向量時,以該向量元素的下標為橫坐標,元素值為縱坐標畫出一條連續曲線。
% 當X是實矩陣時,則按列繪制每列元素值相對其下標的曲線,曲線條數等於輸入參數矩陣的列數。
% 示例:
x=0:0.1:2*pi;%length(x)=63
y1=sin(x);
y2=cos(x);
y=[y1',y2'];
z=[y1;y2];
figure(1)
plot(y1 ,'--r+')
figure(2)
plot(y)
figure(3)
plot(z)

% 格式二:plot(X,Y,'S')
% 說明:
% 當X和Y為向量時,長度必須相同,分別用於存儲x坐標和y坐標數據。
% 當X是向量,Y是有一維與X同維的矩陣時,則繪制出多根不同顏色的曲線。曲線條數等於Y矩陣的另一維數,X被作為這些曲線共同的橫坐標。
% 示例:
x=0:0.1:2*pi;
y=[sin(x);cos(x)];
figure(1)
plot(x,y(1,:))
figure(2)
plot(x,y)

% 格式三:
% plot(X1,Y1,′S1′,X2,Y2,′S2′ ,......,X3,Y3,′S3′)
% 說明:
% 當輸入參數都為向量時,X1和Y1,X2和Y2,…,Xn和Yn分別組成一組向量對,
% 每一組向量對的長度可以不同。每一向量對可以繪制出一條曲線,這樣可以
% 在同一坐標內繪制出多條曲線。
% 示例:
x=0:0.1:2*pi;
y=[sin(x);cos(x)];
plot(x,y(1,:),′-r′,x(10:60),y(2,10:60),′--ko′)

% 格式四:繪制 y = f(X)圖形
% fplot(fname,lims,'S')
% 說明:
% 其中fname為函數名或單引號界定的函數表達式,
% lims為x,y的取值范圍,′S′定義與plot函數相同。
% 示例:
fplot('cos(tan(pi*x))',[ 0,1],'-ro')

% 格式五:繪制隱函數圖形 f(x,y)= 0
% 方式一:ezplot(f,[xmin,xmax,ymin,ymax])
% 說明:
% 在區間xmin<x<xmax和ymin<y<ymax繪制f(x,y) = 0的圖形。,默認區間-2π<x<2π和-2π<y<2π
% 方式二: x=X(t) , y = Y(t)
% ezplot(X,Y,[tmin,tmax])
% 說明:
% 在區間tmin < t < tmax 繪制 x = X(t)和y = Y(t)的圖形,默認區間0< t < 2PI
% 方式三: y = f(x)
% ezplot(f,[a,b])
% 說明:
% 在區間a<x<b繪制y= f(x)的圖形,默認區間-2π<x<2π
% 示例:
ezplot('x^2+y^2-9',[-3 3 -3 3]),axis equal
ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi])
ezplot('cos(tan(pi*x))',[ 0,1])

% 特殊坐標二位圖形
% 1.極坐標曲線
% 格式: polar(theta,rho,'S')
% theta:角度向量,rho:幅值向量,‘S’控制參數
% 示例:
theta=0:0.1:8*pi;
r=cos(4*theta)+1/4;
polar(theta,r)

% 對角坐標曲線 (用法與plot相同)
% 函數名 功能
% semilogx x軸對數坐標,y軸線性坐標
% semilogy x軸對數坐標,y軸線性坐標
% loglog x y軸均為對數坐標
% 示例:
x=0:0.01:5;
y=10.^x;
plot(x,y),grid on

x=0:0.01:5;
y=10 .^x;
semilogy(x,y)
grid on

% 二維圖形處理
% 標注方式:
% title(′圖形名稱′)
% xlabel(′x軸說明′)
% ylabel(′y軸說明′)
% text(x,y,′圖形說明′)
% legend(′圖例1′,′圖例2′,...)
%
% 函數中的說明文字,除使用標准的ASCII字符外,還可使用LaTeX格式的控制字符,這樣就可以在圖形上添加希臘字母、數學符號及公式等內容。例如,text(0.3,0.5, ′sin({\omega}t+{\beta}) ′)將得到標注效果sin(ωt+β)。
% 上述函數除legend外,均可以用於三維函數。
%
% 示例:
x=[0:0.1:2*pi];
plot(x,sin(x),x,cos(x))
title(′正弦和余弦曲線′);
xlabel(′θ(弧度)′)
ylabel(′y′)
text(3,0.5,′sinθ cosθ 曲線′);
legend(′sinθ′,′cosθ′);
%
% 坐標控制:axis函數
% 主要格式
% axis([xmin xmax ymin ymax zmin zmax])
% axis equal:縱、橫坐標軸采用等長刻度。
% axis auto:使用缺省設置。
% axis off:取消坐標軸。
% axis on:顯示坐標軸。
%
% grid on/off:控制是否畫網格線。
% hold on/off 控制是否刷新當前軸及圖形
%
% 示例:
t=0:0.1:2*pi;
plot(sin(t),cos(t))
hold on
plot(t/2/pi,sin(t),'r')
plot(-t/2/pi,sin(t),'r')
grid on;
axis equal
%
% 二.三維圖形的基本函數
% 1.三維曲線圖
% plot3函數
% 格式:Plot3(x1,y1,z1, ′S1′, x2,y2,z2, ′S2′, …xn,yn,zn, ′Sn′)
% 示例:畫畫螺旋線
t=-pi:0.1:8*pi;
x=sin(t);
y=cos(t);
plot3(x,y,t,′-r′)
xlabel(′sin(t)′);
ylabel(′cos(t)′);
zlabel(′t′)
%
% 2.三維網格圖
% meshgrid函數:產生平面區域內的網格坐標矩陣
% 格式: [X,Y]=meshgrid(A,B)
% 說明:
% 語句執行后,矩陣X的每一行都是向量A,行數等於向量B的元素的個數,矩陣Y的每一列都是向量B,列數等於向量A的元素的個數。
%
% mesh函數
% 格式:mesh(x,y,z)
% 說明:一般情況下,x,y,z是維數相同的矩陣。x,y是網格坐標矩陣,z是網格點上的高度矩陣。
% 示例:三維網格圖
[x,y]=meshgrid(0:0.08:2*pi);
z=sin(x).*cos(y);
figure(1)
mesh(x,y,z)
xlabel('x'),ylabel('y')
zlabel('sin(x)cos(x)')
grid on,box on
figure(2)
mesh(z),box on
%
% 3.三維曲面圖
% 格式:surf(x,y,z)
% 示例:
[x,y]=meshgrid(0:0.08:2*pi);
z=sin(x).*cos(y);
surf(x,y,z)
zlabel(′sin(x)cos(x)′)
grid on
box on
% 示例:顯示夫琅禾費衍射圖樣
%
w=3e-5;
lamda=6.328e-7;
z=1e5;
A=pi*w^2;
k=2*pi/lamda;
a=linspace(-4000,4000,401);
[x,y]=meshgrid(a);
r=sqrt(x.^2+y.^2);
m=k*w.*r/z;
I=(A/lamda/z)^2 * ( 2*besselj(1,m)./m ).^2;
J=max(max(I));
I=I./J;
figure(1)
surf(x,y,I)
xlabel('x'),ylabel('y'),zlabel('I')
shading(‘interp’)%色彩效果
colormap(jet),colorbar
axis([-4000 4000 -4000 4000 0 1])

figure(2)
plot(x(1,:),I(201,:))
xlabel('x'),ylabel('I')
axis([ -4000 4000 0 1])
%
% 4.圖形窗口和分割
% 在實際應用中,有時需要在不同圖形窗口或一個圖形窗口中繪制若干個獨立的圖形,
% 這就需要選取不同的圖形窗口或對圖形窗口分割。
% figure函數
% 格式: figure(n)
% 說明:
% 該函數打開不同的圖形窗口。
% n為圖形窗口排序號。
% 默認時打開的是1號圖形窗,即當前窗。
%
% 示例:
t=linspace(0,2*pi,50);
figure(1)
plot(t,sin(t))
figure(2)
plot(t,cos(t))

% 在實際應用中,有時需要在一個圖形窗口中繪制若干個獨立的圖形,這就需要對圖形窗口分割。
% subplot函數
% 格式:subplot(m,n,p)
% 說明:
% 該函數將當前圖形窗口分成m×n個繪圖區,即每行n個,共m行。
% 區號按行優先編號,且選定第p個區為當前活動區。
% 在每一個繪圖區允許以不同的坐標系單獨繪制圖形。
%
% 示例:
t=0:0.1:2*pi;
subplot(2,2,1)
plot(t,sin(t),’-r’)
title(′x=sin(t)′);
xlabel(′t′)
ylabel(′sin(t)′)
subplot(2,2,2);
plot(t,cos(t),′-b′)
title(′y=cos(t)′);
xlabel(′t′)
ylabel(′cos(t)′)
subplot(2,2,3);
[X,Y]=meshgrid(0:0.1:2*pi);
Z=sin(X).*cos(Y);
surf(X,Y,Z)
zlabel(′sin(t)cos(t)′)
title(′z=sin(t)*cos(t)′);
subplot(2,2,4)
mesh(X,Y,Z)
xlabel(′sin(t)′)
ylabel(′cos(t)′)
zlabel(′sin(t)cos(t)′)
title(′z=sin(t)*cos(t)′);

% 5.簡單動畫
% (1)質點運動軌跡的顯示
% comet函數
% 格式:
% comet(x)
% comet(x,y)
% comet(x,y,p)
% 說明:
% comet(x)顯示質點繞向量x運動
% comet(x,y)顯示質點繞向量x與y運動
% comet(x,y,p),其中為p軌跡尾巴的長度,缺省值為P=0.1
% 示例:模擬上拋運動
% V(x)=100cos(pi/4)
% V(y)=100sin(pi/4)
% x = V(x)*t
% y = V(y)*t - 1/2*g*t*t
%
vx = 100*cos(1/4*pi);
vy = 100*sin(1/4*pi);
t = 0:0.001:15;
x = vx*t;
y = vy*t-9.8*t.^2/2;
comet(x,y)

% (2)以電影播放的方式顯示動畫
% 保存想要產生動畫的圖片,存儲為一系列各種類型的二維、三維圖,再像放電影的方式按次序播放出來
% 步驟:
% 由getframe函數將當前的圖片抓取為電影的畫面,存入矩陣中。
% 再由movie函數將矩陣 中的畫面以動畫顯示出來
% 格式: m(j) = getframe
% movie(m)
% 示例:演示駐波
a=50;w=0.2;v=3.64;
for t=1:100
x=0:1:80*pi;
y=a*cos(w*(t-x./v)+pi/2);
z=a*cos(w*(t+x./v));
plot(x,y,x,z,x,y+z);
axis([0 80*pi -100 100]);
grid on;
m(t)=getframe;
end
movie(m)

%
%
% MATLAB的工作模式:
% 1.指令驅動模式
% 通常matlab以指令驅動模式工作,即在matlab 窗口下當用戶輸入單行指令時,matlab 立即處理這條指令,並顯示結果,這就是matlab命令行模式。
% ?命令行模式操作時,matlab窗口只允許一次執行一行上的一個或幾個語句
% 在matlab窗口輸入數據和命令進行計算時,當處理復雜問題和大量數據時是不方便的。
% 命令行方式程序可讀性差,而且不能存儲,對於復雜的問題,應編寫成能存儲的程序文件。
%
% 2.m文件模式
% m文件是matlab所特有的使用該語言編寫的磁盤文件。
% 將matlab語句構成的程序存儲成以m為擴展名的文件,然后再執行該程序文件,這種工作模式稱為程序文件模式。
% 程序文件不能在指令窗口下建立,因為指令窗口只允許一次執行一行上的一個或幾個語句。
%
% M文件有兩類:
% 1.腳本文件(Script File) : 獨立的m文件
% 2.函數文件(Function File): 可調制的m文件
% 腳本文件是一串matlab命令的集合,完成制定的功能,變量空間是workspace;
% 腳本文件既不接受輸入參數也不返回輸出參數,腳本文件實際上是一串指令的集合,與在命令窗口逐行執行文件中的所有指令,其結果是一樣的。
% 函數文件是一個黑箱,根據輸入作出輸出,變量空間是獨立的函數變量空間,在函數運行完成后關閉。
%
% M文件建立:
% 1.命令行輸入edit
% 2.新建文件
%
% 1.腳本文件包括兩部分:注釋部分和程序部分
% a.m
% %繪制sin(x)*cos(x)圖形
% x=0:0.1:4*pi;
% y=sin(x).*cos(x);
% plot(x,y)
% %注釋部分,用以說明函數的作用及有關內容,使用help命令時顯示。只顯示程序中的第一句注釋語。
%
% 2.函數文件:指能夠接受並輸出參數的m文件
% 函數文件的格式:
% function 輸出形參表=函數名(輸入形參表)
% 注釋說明語句段
% 程序語句段
% 說明:
% 1.函數m文件第一行必須以單詞function作為引導詞。
% 2.函數文件的文件命名規則與變量相同,必須是函數名 .m。
% 3.當輸出形參多於一個時,須用方括號括起來,以矩陣形式表示。
% 4.程序中的變量均為局部變量,不保存在工作空間中。其變量只在函數運行期間有效。
% 示例:
% peri_area.m
function [l s]=peri_area(r)
%計算圓的周長和面積
l=2*pi*r; %周長
s=pi*r.^2; %面積
[a,b] = per_area(3);
%
% MATLAB的程序結構:(與C語言類似)
% 1.順序結構
% 2.選擇結構
% 3.循環結構
%
% 一.順序結構
% (1)數據的輸入
% input 函數
% 調用格式
% A = input('提示信息'.'選項')
% 說明:選項用於控制輸入數據格式,‘s’允許輸入字符串。
% 除了字符串輸入需要加‘s’,其余的一律不加(如果不加想要輸入字符串,則需要‘’包裹輸入的字符串)
%
% (2)數據的輸出
% disp 函數
% 調用格式
% disp(輸出項)
% 說明:
% 輸出項可以是變量或字符串。
% 輸出變量時,不顯示變量名。
%
% sprintf函數
% 調用格式
% S = sprintf(格式,輸出項)
% 說明:
% 輸出格式控制同c語言
% 輸出項可以是變量或表達式
% 示例:輸出格式控制
x=pi;m=2;
sprintf('x1=%f x2=%4.3f\nx3=%10.9f', (1+sqrt(5))/2,x,pi)
sprintf(‘%d’,round(x)) %不顯示小數點后面的數字
sprintf('%s','hello')
S=sprintf('The array is %dx%d.',m,3) ;
disp(S)

% 重點再次回顧:
%解一元二次方程
%a b c方程系數
%x1 x2為方程的根
disp('pls input a b c')
a=input('a=');
b=input('b=');
c=input('c=');
d=b*b-4*a*c;
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
disp('x1 x2 is')
disp([x1,x2])
disp(sprintf('x1=%6.5f\nx2=%6.5f',x1,x2))

% (3)程序的暫停
% pause函數
% 調用格式
% pause(延遲秒數)
% 說明:
% 如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續執行。
% 若要強行中止程序的運行可使用Ctrl+C命令。
%
% 二。選擇結構
% (1)if語句
if 條件1
語句組1
elseif 條件2
語句組2
……
elseif 條件m
語句組m
else
語句組n
end
% (2)switch語句
switch 表達式
case 表達式1
語句組1
case 表達式2
語句組2
……
case 表達式m
語句組m
otherwise
語句組n
end
% try語句
try
語句組1
catch
語句組2
end

% 示例
A=[1,2,3;4,5,6]; B=[7,8,9;10,11,12];
try
C=A*B;
catch
C=A.*B;
end
C
erro=lasterr%顯示出錯原因

% 三。循環結構
% (1)for語句
% 格式
% for 循環變量=表達式1:表達式2:表達式3
% 循環體語句
% end
% 說明:
% 表達式1的值為循環變量的初值,表達式2的值為步長,表達式3的值為循環變量的終值。
% 步長為1時,表達式2可以省略。
% (2)while語句
% while(條件)
% 循環體語句
% end
% 說明:若條件成立,則執行循環體語句,執行后再判斷條件是否成立,如果不成立則跳出循環
%
% break和continues語句
% break:用於終止循環的執行。
% continue: 直接進行下一次循環
% 示例:
%計算100~200之間第一個能被21整除的整數
for n=100:200
if rem(n,21)~=0 %rem(x,y) :計算x./y的余數
continue
end
break
end
n

% 一、MATLAB文件的打開和關閉
% (1)文件的打開
% 格式: fid = fopen(文件名,打開方式)
% 說明:
% 其中文件名用字符串形式,表示待打開的文件。
% 常見的打開方式有:
% ′r′表示對打開的文件讀數據;
% ′r+′表示讀寫;
% ′w′刪除已經存在的文件內容或建立一個新文件,並打開文件寫;
% ′w+′刪除已經存在的文件內容或建立一個新文件,讀寫;
% ′a′表示在打開的文件末尾添加數據。
% fid用於存儲文件句柄值,句柄值用來標識該數據文件,其它函數可以利用它對該數據文件進行操作。
%
% (2)文件的關閉
% 格式 sta = fclose(fid)
% 說明:該函數關閉fid所表示的文件。
% sta表示關閉文件操作的返回代碼,若關閉成功,返回0,否則返回–1。
%
% 二、文件的讀寫操作
% 文件數據格式有兩種形式,一是二進制文件,二是文本文件。對不同類型的文件讀寫是不同的。
%
% (1)二進制文件的讀寫操作
% 讀二進制文件
% 格式 [A,COUNT]=fread(fid,size, precision)
% 說明:
% A用於存放讀取的數據。
% COUNT返回所讀取的數據元素個數
% fid為文件句柄
% precision代表讀寫數據的類型:′int′ ′float′ ′char′等
% size為可選項,若不選用則讀取整個文件內容,若選用則它的值可以是下列值: (
% 1) N表示讀取 N個元素到一個列向量。
% (2) [M,N]表示讀數據到M×N的矩陣中,數據按列存放。
%
% 寫二進制文件
% 格式: COUNT=fwrite (fid, A, precision)
% 說明:
% COUNT返回所寫的數據元素個數。
% fid為文件句柄。
% A用來存放寫入文件的數據,
% precision用於控制所寫數據的類型,其形式與fread函數相同
%
% (2)文本文件的讀寫操作
% 讀文本文件
% 格式 A = fscanf(fid,format)
% [A,COUNT] = fscanf(fid,format,size)
% 說明:
% A用以存放讀取的數據。
% COUNT返回所讀取的數據元素個數。fid為文件句柄。
% format用以控制讀取的數據格式,由%加上格式符組成,常見的格式符有%d,%f,%e,%c,%s等。
% size為可選項,決定矩陣A中數據的排列形式。
%
% 寫文本文件
% 格式: COUNT= fprintf(fid, format, A)
% 說明:
% A存放要寫入文件的數據。
% 先按format指定的格式將數據矩陣A格式化,然后寫入到fid所指定的文件。格式符與fscanf函數相同。
%
% 示例:文件的操作
clear
x=0:0.1:2*pi;
fid=fopen('example.mat','w+')
count=fwrite(fid,x,'float')
fclose(fid)
fid1=fopen('example.mat','r+')
t=fread(fid1,'float');
y=[t,sin(t)];
plot(t,y(:,2))
fclose(fid1)
%
%
% 二、函數的調用
% 格式
% [輸出實參表]=函數名(輸入實參表)
% 說明:
% 函數調用時各實參出現的順序、個數,應與函數定義時形參的順序、個數一致,否則會出錯。
% 函數調用時,先將實參傳遞給相應的形參,從而實現參數傳遞,然后再執行函數的功能。
% 示例:利用函數文件,實現直角坐標和極坐標的轉換

%定義函數文件tran.m:
function [rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);


%調用tran.m的命令文件exam406.m
x=input('Please input x=:');
y=input('Please input y=:');
[rho,theta]=tran(x,y);
rho
theta

%
% 函數參數的可調性
% nargin和nargout
% 說明:
% 在調用函數時,用nargin和nargout分別記錄調用該函數時的輸入實參和輸出實參的個數。
% 只要在自定義函數文件中包含這兩個函數,就可以准確地知道該函數文件被調用時的輸入輸出參數個數,從而決定函數如何進行處理。
% nargin和nargout用法示例:
%定義函數文件sumproduct.m:
function [out1,out2]=sumproduct(x,y,z)
if nargin==0
disp('no input arguments'),return
elseif nargin==1
sum=x;product=x;
elseif nargin==2
sum=x+y;product=x.*y;
elseif nargin==3
sum=x+y+z;product=x.*y.*z;
else
disp('too many input arguments')
end

if nargout==0
return
elseif nargout==1
out1=sum;
else
out1=sum;out2=product;
end

%調用sumproduct.m
sumproduct
[x,y]=sumproduct(1,2,3)
[x,y]=sumproduct(1)
x=sumproduct(1,2,3)
[x,y]=sumproduct(1,2,3,4)


% 定義全局變量
% globle X
% 說明:
% 說明:
% 全局變量名一般用大寫。
% 自定義函數文件中的變量,作用區域僅在函數內部。對於自定義函數中的一些公用變量,可以定義成全局變量,在主程序中統一定義.
% global用法示例:
function y=Ep(x)
%計算彈性勢能
global K
y=K*x.^2/2;

function f=F(x)
%計算彈力
global K
f=K*x;

%計算exam408.m
global K
K=0.01;
x=input('Please input x=');
ep=Ep(x)
f=F(x)

% 來自臧小飛老師在最后留下的話:
% 良好的編程習慣:
% 在動手編程之前,明確程序的目的,設想解決方案,作出初步的流程圖。如果程序較大,就要把程序分成幾個相對獨立的模塊,各司其職。一個一個模塊解決。
% %后面的內容是程序的注解,要養成注釋程序的習慣,在關鍵的命令行,變量定義處必須要有注釋,在整個程序開頭有一個總結性的注釋。這樣便於自己或別人查看和修改程序。
% 變量命名規則要統一, 含義清晰。
% 編輯m文件要注意排版,這可以使程序層次變得更清晰,有序,增加程序的可讀性。
% 養成在主程序開頭用clear指令清除變量的習慣,以消除工作空間中其它變量對程序運行的影響。但注意在函數或子程序中不要用clear。
% 參數值要集中放在程序的開始部分,以便維護。在語句行之后輸入分號使其中間結果不在屏幕上顯示,以提高執行速度。
% input指令可以用來輸入一些臨時的數據;而對於大量參數,則通過建立一個存儲參數的子程序,在主程序中用子程序的名稱來調用。
% 程序盡量模塊化,也就是采用主程序調用子程序的方法,將所有子程序合並在一起來執行全部的操作。
% 設置好MATLAB的工作路徑,以便程序運行。
%
% 提升MATLAB的運行效率
% 1. 盡量避免使用循環
% a.盡量用向量化的運算來代替循環操作。
% b.在必須使用多重循環時下,則在循環的外環執行循環次數少的,內環執行循環次數多的。這樣可以顯著提高速度。
% 2.預分配矩陣空間,即事先確定變量的大小、維數。
% 這一類的函數有zeros、ones等。
% 3. 將耗時的循環調用C或fortrun等低級語言運算
% 4.改用更有效的算法
%
% 最后一道題:輸出100-200之間第三個被15整除的數
% x=100:200; n=find(rem(x,15)==0); X=x(n(3))
%
%
% 往年期末考試習題:
% 以兩種方式求線性方程組的解:
% x1 + 2*x2 - 7*x3 + 6*x4 = 0
% 2*x2 + x3 + x4 = 6
% 4*x2 - 7*x3 + 2*x4 = 7
% 2*x2 - 2*x3 + x4 = 4
% X=A\B
% 在一個圖形窗口中繪制直線、圓、極坐標和曲面圖四個獨立的圖形,數據自設,要求圖形標注完整。
% 實現上拋和平拋運動的動畫演示(速度,時間自設)。
% 輸出[100,300]之間第3個能被13整除的整數,另將該 數值范圍內所有能被13整除的整數輸出。
% Created by Andrew Duan 2016.10.17 00:27:52


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM