第一篇:MatLab基礎知識小結來源
MatLab基礎知識小結來源: 吳學簫的日志
matlab常用到的永久變量。ans:計算結果的默認變量名。i j:基本虛數單位。
eps:系統的浮點(F10a9Bg個oht): inf: 無限大,例1/0 nan NaN:非數值(N航a nmnb謝)pi:圓周率n(n=3.1415926..)。realmax:系統所能表示的最大數值。realmin: 系統所能表示的最小數值,nargin: 函數的輸入參數個數: nargout:函數的輸出多數個數
①matlab的所有運算都定義在復數城上。對于方根問題運算只返回處于第一象限的解。
⑦matlab分別用左斜/和右來表示“左除和“右除”運算。對于標量運算而言,這兩者的作用沒有區別:但對于矩陣運算來說,二者將產生不同的結果。
多項式的表示方法和運算
p(x)=x^3-3x-5 可以表示為p=[1 0 –3 5],求x=5時的值用plotval(p,5)也可以求向量:a=[3 4 5],plotval(p,a)函數roots求多項式的根 roots(p)p=[1 0-3 5];r=roots(p)由根重組多項式poly(根)q=poly(r)real(q)有時會產生虛根,這時用real抽取實根即可 conv(a,b)函數 多項式乘法(執行兩個數組的卷積)a=[1 2 3 4];b=[1 4 9 16];c=conv(a,b)多項式的加減法,低階的多項式必須用首零填補,使其與高階多項式有同樣的階次 多項式除法 [q , r]=deconv(c , b)表示b/c q為商多項式,r為余數 多項式的導數 polyder(f)f=[ 2 4 5 6 2 1];s=polyder(f)
多項式的曲線擬合 x=[1 2 3 4 5];y=[5.6 40 150 250 498.9];p=polyfit(x,y,n)數據的n次多項式擬合 poly:矩陣的特征多項式、根集對應的多項式 x2=1:0.1:5;n取1時,即為最小二乘法
y2=polyval(p,x2);計算多項式的值(polyvalm計算矩陣多項式)plot(x,y,'*',x2,y2);grid on 最小二乘法 x=[1 2 3 4 5];y=[5.6 40 150 250 498.9];plot(x,y,’*’),lsline
多項式插值(p158)
YI=interp1(x,y,XI,’method’)一維插值
(XI為插值點的自變量坐標向量,可以為數組或單個數。method為選擇插值算法的方法,包括: linear(線性插值)cubic(立方插值)spline(三次樣條插值)nearst(最近臨插值)
例如:人口預測 year=1900:10:1900;number=[78 91 105 ?.每十年的人口數];x=1900:1:2000;y=interp1(year,number,x,’spline’);plot(year,numeber,’*’,x,y);grid on
一維博里葉變換插值使用函數interpft實現,計算含有周期函數值的矢量的傅里葉變換
然后使用更多的點進行傅里葉變換的逆變換,函數的使用格式如下:y=interpft(x,n)其中x是含有周期函數值的矢量,并為等距的點,n為返同等間距點的個數。
求解一元函數的最小值
y=fminbnd('humps',0.3,1)humps為一內置函數 求解多元函數的最小值
函數fminserch用于求多元函數的最小值。它可以指定一個開始的矢量,并非指定一個區間。此函數返回一個矢量為此多元函數局部最小函數值對應的自變量
紋理成圖功能
由warp函數的紋理成圖功能實現平面圖像在空間三維曲面上的顯示。將文件名為flowers.tif的圖像分別投影到圓柱形和球星表面上 i=imread('flowers.tif');[x,y,z]=cylinder;subplot(1,2,1),warp(x,y,z,i);[x,y,z]=sphere(50);subplot(1,2,2),warp(x,y,z,i);warp(x,y,z,i);求函數的零點
求函數humps在[1,2]區間上的零點 fzero(‘humps’,[1,2]);也可以給一個初始值 fzero(‘humps’,0.9);對于多項式可直接由roots求其根 roots(‘4*x^3+……’);也可以用solve c=sym('c','real');x=sym('x','real');s=solve(x^3-x+c)
函數定積分
q=quadl(‘humps’,0,1)求humps函數在0 1區間上的定積分,也可以用quad語句
二重積分 首先計算內積分,然后借助內積分的中間結果再求出二重積分的值,類似于積分中的分步積分法。Result=dblquad(‘integrnd’,xin,xmax.,ymin,ymax)integrnd為被積函數的名稱字符串
符號積分運算int(f)最精確的是符號積分法 計算s=∫12[∫01xydx]dy syms x y 中間為空格,不能為逗號
s=int(int(‘x^y’,’x’,0,1),’y’,1,2)引號可省略 vpa(s)顯示s的值 內積分限為函數的二重積分 I=∫14[∫√y2(x2+y2)dx]dy 符號法I=vpa(int(int(‘x^2+y^2’,’x’,sqrt(y),2),’y’,1,4)
微分運算(diff)
微分是描述一個函數在一點處的斜率,是函數的微觀性質、因此積分對函數的形狀在小范圍內的改變不敏感,而微分很敏感。—個函數的小的變化,容易產生相鄰點的斜率的大的改變。由干微分這個固有的困難.所以盡可能避免數值微分.特別是對實驗獲得的數據進行微分。在這種情況,最好用最小二乘曲線擬合這種數據,然后對所得到的多項式進行微分;或用另一種方法對點數據進行三次樣條擬合,然后尋找樣條微分,但是,有時微分運算是不能避免的,在MATLAB中.用函數diff汁算一個矢量或者矩陣的微分(也可以理解為差分)。
a=[1 2 3 3 3 7 8 9];b=diff(a)一次微分 bb=diff(a,2)二次微分
實際上diff(a)=[a(2)-a(1),a(3)-a(2),??,a(n)-a(n-1)] 對于求矩陣的微分,即為求各列矢量的微分,從矢量的微分值可以判斷矢量的單調性、是否等間距以及是否有重復的元素。符號微分運算(diff)syms x t a f =cos(a*x)df =diff(f)由findsym的規則,隱式的指定對x進行微分 dfa=diff(f,'a')指定對變量a進行微分 dfa=diff(f,'a',3)三次微分 diff函數不僅作用在標量上,還可以在矩陣上,運算規則就是按矩陣的元素分別進行微分 syms a x A=[cos(a*x),sin(a*x),-sin(a*x),cos(a*x)];dA=diff(A)微分方程dsolve 在matlab中,符號表達式中包含字母D用來表示微分運算,D2,D3分別對應第二,第三階導數,D2y表示d2y/dt2 把t缺省了
y=dsolve(‘Dy=f(y)’)單個方程,單個輸出
[u,v]=dsolve(‘Du=f(u,v)’,’Dv=g(u,v)’)2個方程,2個輸出 s=dsolve(‘Dx=f(x,y,z)’,’Dy=g(x,y,z)’,’Dz=k(x,y,z)’)s.x s.y s.z 3個方程,架構數組
dsolve('Dx=-a*x')結果:C1*exp(-a*t)沒給定初值,所以結果中含參變量 x=dsolve('Dx=-a*x','x(0)=1','s')結果exp(-a*s)給定了初值,獨立變量設為s 計算多元函數的梯度
fx=gradient(f)f是一個矢量返回f的一維數值梯度,fx對應于x方向的微分。
[x,y]=meshgrid(-2:.2:2,-2:.2:2);z=x.*exp(-x.^2-y.^2);[px,py]=gradient(z,.2,.2);contour(z),hold on 畫等值線 quiver(px,py)
matlab字符串運算 利用sym命令創建表達式
f=sym(‘cos(x)+sin(x)’)或 syms x , f=cos(x)+sin(x)diff(f)求其導數
(也可直接用命令f=diff(‘cos(x)+cos(y)’)
當字符表達式中含有多于一個的變量時,只有—個變量是獨立變量。如果不告訴matlab哪一個變量是獨立變量,則可以通過findsym命令詢問 利用findsym命令查詢獨立變量 f=sym('sin(a*x)+b')findsym(f,1)給出獨立變量(一個變量,如果為2則給出2個變量)findsym(f)給出所有變量
符號表達式的化簡和替換
collect函數 collect(f,v)表示將f表示為關于符號變量v的多項式形式,即關于v合并同類項,v缺省,則用findsym確定的缺省變量 syms x y f=x^2*y+y*x-x^2-2*x+1 collect(f)得到(-1+y)*x^2+(y-2)*x+1 collect(f,y)得到(x+x^2)*y+1-x^2-2*x expand函數 expand(f)將f展開,寫成和的形式 syms x expand((x-1)^3)得到x^3-3*x^2+3*x-1 horner函數 horner(f)將f寫成鑲嵌套形式 syms x horner(x^3-6*x^2)得到(-6+x)*x^2 factor函數 factor(f)將f轉換成低階有理多項式的乘積 syms x f=x^3-6*x^2+11*x-6 factor(f)得到(x-1)*(x-2)*(x-3)simplify(f)函數 綜合化簡 simple(f)函數的最簡形式 syms x f=2*sin(x^2)+cos(3*x)simple(f)如果不想看到中間過程,可z=simple(f)有時使用兩次simple命令可以得到最簡式 如果想知道哪個簡化命令得到最后結果,可以加一個參數how [z,how]=simple(f)
符號表達式的替換 subs(f,new,old)f='a*x^2+b*x+c' subs(f,'t','x')得到a*(t)^2+b*(t)+c subs是一個符號函數,返回一個符號變量
subexpr函數 有時matlab返回的符號表達式難以理解,用subexpr函數,可以將表達式中重復出現的子式用一個符號表示,從而簡化表達形式 c=sym('c','real');x=sym('x','real');s=solve(x^3-x+c)a=subexpr(s)得到sigma =-108*c+12*(-12+81*c^2)^(1/2)a =
[ 1/6*sigma^(1/3)+2/sigma^(1/3)] [-1/12*sigma^(1/3)-1/sigma^(1/3)+1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))] [-1/12*sigma^(1/3)-1/sigma^(1/3)-1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))]
pretty函數有時也能起到同樣的作用。Pretty(f)顯示函數的習慣書寫形式
線性方程組的求解
求解線性方程組,用反斜杠 a=hilb(3)b=[1 2 3]' ab
矩陣的特征值和特征向量
用eig(v,d)函數,[v,d]=eig(A);其中d將返回特征值,v返回相應的特征向量,缺省第二個參數將只返回特征值
syms a b c real A=[a b c;b c a;c a b];[v,d]=eig(A);
為了觀察更清楚,使用以前學過的替換函數,這里不用默認的sigma,而改用M,顯式的代替繁瑣的表達子式
vv=subexpr(v);vs=subs(vv,'m','sigma')運行結果為 vs =
[ 1, 1, 1] [-(c+(m)-a)/(c-b),-(c-(m)-a)/(c-b), 1] [-(a-(m)-b)/(c-b),-(a+(m)-b)/(c-b), 1]
再用m替換d中的表達子式 dd=subexpr(d);ds=subs(dd,’m’,’sigma’)運行結果為ds =
[(m), 0, 0] [ 0,-(m), 0] [ 0, 0, c+a+b] note 求特征值也可用以下命令
f=poly(A)poly函數 用來求A的特征多項式 d=solve(f)solve(f)函數用來求多項式的解
svd()函數 求矩陣的奇異值分解,將矩陣分解為兩個正交矩陣和對角矩陣的乘積 a=sym(hilb(2))[u,s,v]=svd(a)
代數方程和方程組
代數方程的求解可用solve(f)命令,如果f不含=,matlab將給表達式置零。方程的未知量在默認的情況下由findsym決定或顯式指出 syms a b c x solve(a*x^2+b*x+c)以x為默認變量 solve(a*x^2+b*x+c,a)指定對a為變量 求含有等號的方程的解(一定要加單引號)f=solve(‘cos(x)=sin(x)’)
x=solve('exp(x)=tan(x)')如果不能求得符號解,就計算可變精度解。求解方程組與單方程類似 解一個三元一次方程
v=solve('a*u^2+v^2','u-v=1','a^2-5*a+6')結果為v =
a: [4x1 sym] u: [4x1 sym] v: [4x1 sym] 一些常用的符號運算 極限運算limit limit(f)求x到0的極限
limit(f,x,a)或limit(f,a)求x到a的極限
limit(f,a,’left’)limit(f,a,’right’)求x到a的左極限和右極限 limit(f,inf)求x趨于無窮的極限 符號求和symsum(s)symsum(s)以默認的findsym決定的變量求和 symsum(s,v)以s中指定的變量v求和
symsum(s,a,b)symsum(s,v,a,b)從a到b的有限項求和 syms k n symsum(k)從0到k求和
symsum(k,0,n-1)從0到n-1求和 symsum(1/k^2,1,inf)無限項求和 泰勒級數taylor(f)taylor(f)表示求f的5階talor展開,可以增加參數指定展開的階數(默認式5),也可以對于多元函數指定展開的變量,還可以指定在哪個點展開 syms x t taylor(exp(-x))taylor(log(x),6,1)在1點的6階taylor展開 taylor(x^t,3,t)對t的3階taylor展開 積分變換
fourier變換和逆變換fourier(f)
fourier分析可以將信號轉換為不同頻率的正弦曲線。可對離散數據進行分析,也可對連續時間系統進行分析,特別在信號和圖形處理領域。離散變換(DFT)作用于有限數據的采集,最有效的是快速fourier變換(FFT)
F=fourier(f)獨立變量x,返回關于參數w的函數 F=fourier(f,v)返回函數F關于符號對象v的函數
F=fourier(f,u,v)對關于u的函數f進行變換,而不是缺省的w,返回函數F是關于v的函數 syms t v w x fourier(1/t)fourier(exp(-t)*sym('Heaviside(t)'),v)fourier(diff(sym('F(x)')),x,w)Fourier逆變換
f=ifourier(F)缺省獨立變量w,返回關于x的函數對w進行積分 f=ifourier(F,v)返回函數f是關于符號對象v的函數,而不是缺省的x f=ifourier(F,u,v)是關于u的函數f進行變換,而不是缺省的x,返回函數f是關于v的函數 Laplace變換和逆變換laplace(f)應用于連續系統(微分方程)中,可以用來求解微分方程的初值問題 laplace(F)缺省獨立變量t,缺省返回關于s的函數L laplace(F,t)返回關于t的函數L,而不是缺省的s laplace(F,w,z)對函數F的自變量w積分,返回關于z的函數L 逆變換
F=ilaplace(L)缺省獨立變量s,返回關于t的函數F F=ilaplace(L,y)返回關于y的函數F,而不是缺省的t F=ilaplace(L,y,x)對函數L的自變量y積分,返回關于x的函數F Z-變換和逆變換ztrans(f)標量符號f的Z-變換 F=ztrans(f)缺省獨立變量n,返回關于z的函數
F=ztrans(f,w)返回關于符號變量w的函數F,而不是缺省的z F=ztrans(f,k,w)關于k的符號變量作Z-變換返回關于符號變量w的函數 逆變換iztrans(F)f=iztrans(F)或(F,k)或(F,w,k)
符號繪圖函數
符號函數簡易繪圖函數ezplot(f)f可以包含單個符號變量x的字符串或表達式,默認畫圖區間(-2pi,2pi),如果f包含x和y,畫出的圖像是f(x,y)=0的圖像,缺省區間是-2pi Ezplot(f,xmin,xmax)或ezplot(f,[xmin,xmax])繪制在xmin [x,y]=fplot(fun,lims,…)只返回用來繪圖的點,并不繪圖,可以自己調用plot(x,y)來繪制圖形。syms x subplot(2,2,1),fplot('humps',[0,1])f='abs(exp(x*(0:9))*ones(10,1))' subplot(2,2,2),fplot(f,[0,2*pi])subplot(2,2,3),fplot('sin(1./x)',[0.01,0.1],1e-3)matlab繪圖 二維圖形的繪制 plot 在(x,y)坐標下繪制二維圖像 支持多個x-y二元結構 plot3 在(x,y,z)坐標下繪制三維圖形 loglog 在(x,y)對數坐標下繪制二維圖形 semilogx 在x為對數坐標,y為線性坐標的二維坐標中繪圖 semilogy 在x為線性坐標,y為對數坐標的二維坐標中繪圖 plotyy 在有兩個y軸的坐標下繪圖 plot用法 plot(x,y,'--rs','linewidth',2,'markeredgecolor','k',...'markerfacecolor','g','markersize',10)plotyy用法 plotyy(x1,y1,x2,y2)以x1為標準,左軸為y軸繪制y1向量,x2為基準,右軸為y軸,繪制y2向量 plotyy(x1,y1,x2,y2,fun)用字符串fun指定的繪圖函數(plot ,semilogx,semilogy,loglog,stem)plotyy((x1,y1,x2,y2,fun1,fun2)t=0:pi/20:2*pi;y=exp(sin(t));plotyy(t,y,t,y,'plot','stem')stem為二維桿圖 [ax,h1,h2]=plotyy(?)返回左右兩y軸的句柄(分別為ax(1)ax(2),以及在兩坐標軸中生成的圖形對象的句柄,分別為h1 h2 t=0:900;A=1000;a=0.005;b=0.005;z2=cos(b*t);z1=A*exp(-a*t);[haxes,hline1,hline2]=plotyy(t,z1,t,z2,'semilogy','plot');axes(haxes(1))ylabel('semilog plot')對數坐標 axes(haxes(2))ylabel('linear plot')set(hline2,'linestyle','--')其他二維圖形繪圖指令 bar(x,y)二維條形圖 hist(y,n)直方圖 histfit(y,n)帶擬和線的直方圖,n為直方的個數 stem(x,y)火柴桿圖 comet(x,y)彗星狀軌跡圖 compass(x,y)羅盤圖 errorbar(x,y,l,u)誤差限圖 feather(x,y)羽毛狀圖 fill(x,y,’r’)二維填充函數 以紅色填充 pie(x)餅圖 polar(t,r)極坐標圖 r為幅值向量,t為角度向量 t=0:0.1:8*pi;r=cos(3*t/2)+1/2;polar(t,r),xlabel('polar 指令')quiver(x,y)磁力線圖 stairs(x,y)階梯圖 loglog(x,y)對數圖 semilogx semilogy 半對數圖 matlab三維作圖 plot3(x,y,z)三維線條圖 t=0:pi/50:15*pi;plot3(sin(t),cos(t),t,'r*')與plot相似 v=axis 返回各個軸的范圍 text(0,0,0,'origin')在某個坐標點加入文字 plot3 增加維數可以一次畫多個圖,使所個二維圖形眼一個軸排列 三維網線圖的繪制 mesh(x,y,z)網格圖 mesh(x,y,z,c)四維作圖,(x,y,z)代表空間三維,c代表顏色維 mesh(…,’property name’,property value,…)設置曲面各屬性的值 [x,y,z]=sphere(12);mesh(x,y,z),hidden off 曲面設置為透明 meshc(x,y,z)畫網格圖和基本的等值線圖 meshz(x,y,z)畫包含零平面的網格圖 waterfall(x,y,z)與mesh一樣,只是在效果上它的網格線只在x軸一個方向出現,呈瀑布狀水線 兩個變量的標量指令meshgrid(x)或meshgrid(x,y)(p179)將兩個一維向量生成兩個二維向量,以便進行z=f(x,y)運算,算出z的所有值,z為x y的標量指令 [X,Y]=meshgrid(x)meshgrid(x,x)的簡略式 [X,Y]=meshgrid(x,y)[X,Y,Z]=meshgrid(x,y,z)用于三維圖形的繪制 [x,y]=meshgrid([-2:0.1:2]);z=x.*exp(-x.^2-y.^2);plot3(x,y,z)surf(x,y,z,c)著色表面圖 surf(x,y,z)隱含著c=z surf(z)隱含著x,y的值為surf指令根據z的尺寸自動生成 surfc 畫出具有基本等值線的曲面圖 surfl 畫出一個具有亮度的曲面圖 shading flat 網線圖的某整條線段或曲面圖的某個貼片都著一種顏色 shading interp 某一線段或貼片上各點的顏色由線或片的頂端顏色經線性插值而得 曲面圖不能設成網格圖那樣透明,但需要時,可以在孔洞處將數據設成nun 等高線的繪制 在二維空間繪制等高線contour contour(x,y,z,n)繪制n條等值線(n可省略) contour(x,y,z,v)在向量v所指定的高度上繪制等高線(可省)c=contour(x,y,z)計算等值線的高度值 c=contourc(x,y,z,n)計算n條等高線的x-y坐標數據 c=contourc(x,y,z,v)計算向量v所指定的等高線的x-y坐標數據 clabel(c)給c陣所表示的等高線加注高度標識 clabel(c,v)給向量v所指定的等高線加注高度標識 clabel(c,’manual’)借助鼠標給點中的等高線加注高度標識 三維空間繪制等高線contour3(x,y,z)[x,y,z]=peaks(30);contour3(x,y,z,16,'g')二元函數的偽彩圖pcolor(x,y,z)是指令surf的二維等效指令,代表偽彩色,可與contour單色等值線結合畫彩色等值線圖 [x,y,z]=peaks(30);pcolor(x,y,z);偽彩色 shading interp 顏色插值,使顏色平均漸變 hold on,contour(x,y,z,20,'k')...畫等值線 colorbar('horiz')水平顏色標尺 c=contour(x,y,z,8);clabel(c)標注等高線 矢量場圖(速度圖)quiver 用于描述函數z=f(x,y)在點(x,y)的梯度大小和方向 [X,Y]=meshgrid(x,y)X,Y為Z陣元素的坐標矩陣 [U,V]=gradient(Z,dx,dy)U,V分別為Z對x對y的導數,dx dy是x y方向上的計算步長 quiver(X,Y,U,V,s,’linespec’,’filled’)U,V為必選項,決定矢量場圖中各矢量的大小和方向,s為指定所畫箭頭的大小,缺省時取1,linespec為字符串,指定合法的線形和彩色,filled用于填充定義的繪圖標識符 [x,y]=meshgrid(-2:.2:2,-1:.15:1);z=x.*exp(-y.^2);[px,py]=gradient(z,.2,.15);contour(x,y,z);hold on,quiver(x,y,px,py),axis image 多邊形的填色fill(x,y,c)c定義顏色字符串,可以是’r’,’b’等,也可以用RGB三色表示[r,g,b]值為0-1 圖形的四維表現 matlab常用到的永久變量。 ans:計算結果的默認變量名。i j:基本虛數單位。 eps:系統的浮點(F10a9Bg個oht): inf: 無限大,例1/0 nan NaN:非數值(N航a nmnb謝)pi:圓周率n(n=3.1415926..)。realmax:系統所能表示的最大數值。realmin: 系統所能表示的最小數值,nargin: 函數的輸入參數個數: nargout:函數的輸出多數個數 ①matlab的所有運算都定義在復數城上。對于方根問題運算只返回處于第一象限的解。 ⑦matlab分別用左斜/和右來表示“左除和“右除”運算。對于標量運算而言,這兩者的作用沒有區別:但對于矩陣運算來說,二者將產生不同的結果。多項式的表示方法和運算 p(x)=x^3-3x-5 可以表示為p=[1 0 –3 5],求x=5時的值用plotval(p,5)也可以求向量:a=[3 4 5],plotval(p,a)函數roots求多項式的根 roots(p)p=[1 0-3 5];r=roots(p)由根重組多項式poly(根)q=poly(r)real(q)有時會產生虛根,這時用real抽取實根即可 conv(a,b)函數 多項式乘法(執行兩個數組的卷積)a=[1 2 3 4];b=[1 4 9 16];c=conv(a,b)多項式的加減法,低階的多項式必須用首零填補,使其與高階多項式有同樣的階次 多項式除法 [q , r]=deconv(c , b)表示b/c q為商多項式,r為余數 多項式的導數 polyder(f)f=[ 2 4 5 6 2 1];s=polyder(f)MATLAB常用的基本數學函數 abs(x):純量的絕對值或向量的長度 angle(z):復 數z的相角(Phase angle) sqrt(x):開平方 real(z):復數z的實部imag(z):復數z的虛 部 conj(z):復數z的共軛復數 round(x):四舍五入至最近整數 fix(x):無論正負,舍去小數至最近整數 floor(x):地板函數,即舍去正小數至最近整數 ceil(x):天花板函數,即加入正小數至最近整數 rat(x):將實數x化為分數表示 rats(x):將實數x化為多項分數展開 sign(x):符號函數(Signum function)。 當x<0時,sign(x)=-1; 當x=0時,sign(x)=0;當x>0時,sign(x)=1。 > 小整理:MATLAB常用的三角函數 sin(x):正弦函數 cos(x):馀弦函數 tan(x):正切函數 asin(x):反正弦函數 acos(x):反馀弦函數 atan(x):反正切函數 atan2(x,y):四象限的反正切函數 sinh(x):超越正弦函數 cosh(x):超越馀弦函數 tanh(x):超越正切函數 asinh(x):反超越正弦函數 acosh(x):反超越馀弦函數 atanh(x):反超越正切函數 變數也可用來存放向量或矩陣,并進行各種運算 若要輸入矩陣,則必須在每一列結尾加上分號(;),如下例: A = [1 2 3 4;5 6 7 8;9 10 11 12]; MatLab 知識小結 matlab常用到的永久變量。ans:計算結果的默認變量名。i j:基本虛數單位。 eps:系統的浮點(F10a9Bg個oht): inf: 無限大,例1/0 nan NaN:非數值(N航a nmnb謝)pi:圓周率n(n=3.1415926..)。realmax:系統所能表示的最大數值。realmin: 系統所能表示的最小數值,nargin: 函數的輸入參數個數: nargout:函數的輸出多數個數 ①matlab的所有運算都定義在復數城上。對于方根問題運算只返回處于第一象限的解。 ⑦matlab分別用左斜/和右來表示“左除和“右除”運算。對于標量運算而言,這兩者的作用沒有區別:但對于矩陣運算來說,二者將產生不同的結果。 多項式的表示方法和運算 p(x)=x^3-3x-5 可以表示為p=[1 0 –3 5],求x=5時的值用plotval(p,5)也可以求向量:a=[3 4 5],plotval(p,a)函數roots求多項式的根 roots(p)p=[1 0-3 5];r=roots(p)由根重組多項式poly(根)q=poly(r) real(q)有時會產生虛根,這時用real抽取實根即可 conv(a,b)函數 多項式乘法(執行兩個數組的卷積)a=[1 2 3 4];b=[1 4 9 16];c=conv(a,b)多項式的加減法,低階的多項式必須用首零填補,使其與高階多項式有同樣的階次 多項式除法 [q , r]=deconv(c , b)表示b/c q為商多項式,r為余數 多項式的導數 polyder(f)f=[ 2 4 5 6 2 1];s=polyder(f) 多項式的曲線擬合 x=[1 2 3 4 5]; y=[5.6 40 150 250 498.9]; p=polyfit(x,y,n)數據的n次多項式擬合 poly:矩陣的特征多項式、根集對應的多項式 x2=1:0.1:5;n取1時,即為最小二乘法 y2=polyval(p,x2);計算多項式的值(polyvalm計算矩陣多項式)plot(x,y,'*',x2,y2);grid on 最小二乘法 x=[1 2 3 4 5]; y=[5.6 40 150 250 498.9];plot(x,y,’*’),lsline 多項式插值(p158) YI=interp1(x,y,XI,’method’)一維插值 (XI為插值點的自變量坐標向量,可以為數組或單個數。 method為選擇插值算法的方法,包括: linear(線性插值)cubic(立方插值)spline(三次樣條插值)nearst(最近臨插值) 例如:人口預測 year=1900:10:1900; number=[78 91 105 ?.每十年的人口數]; x=1900:1:2000; y=interp1(year,number,x,’spline’);plot(year,numeber,’*’,x,y);grid on 一維博里葉變換插值使用函數interpft實現,計算含有周期函數值的矢量的傅里葉變換 然后使用更多的點進行傅里葉變換的逆變換,函數的使用格式如下:y=interpft(x,n)其中x是含有周期函數值的矢量,并為等距的點,n為返同等間距點的個數。 求解一元函數的最小值 y=fminbnd('humps',0.3,1)humps為一內置函數 求解多元函數的最小值 函數fminserch用于求多元函數的最小值。它可以指定一個開始的矢量,并非指定一個區間。此函數返回一個矢量為此多元函數局部最小函數值對應的自變量 紋理成圖功能 由warp函數的紋理成圖功能實現平面圖像在空間三維曲面上的顯示。將文件名為flowers.tif的圖像分別投影到圓柱形和球星表面上 i=imread('flowers.tif');[x,y,z]=cylinder; subplot(1,2,1),warp(x,y,z,i);[x,y,z]=sphere(50);subplot(1,2,2),warp(x,y,z,i);warp(x,y,z,i); 求函數的零點 求函數humps在[1,2]區間上的零點 fzero(‘humps’,[1,2]); 也可以給一個初始值 fzero(‘humps’,0.9); 對于多項式可直接由roots求其根 roots(‘4*x^3+……’);也可以用solve c=sym('c','real');x=sym('x','real');s=solve(x^3-x+c) 函數定積分 q=quadl(‘humps’,0,1)求humps函數在0 1區間上的定積分,也可以用quad語句 二重積分 首先計算內積分,然后借助內積分的中間結果再求出二重積分的值,類似于積分中的分步積分法。Result=dblquad(‘integrnd’,xin,xmax.,ymin,ymax)integrnd為被積函數的名稱字符串 符號積分運算int(f)最精確的是符號積分法 計算s=∫12[∫01xydx]dy syms x y 中間為空格,不能為逗號 s=int(int(‘x^y’,’x’,0,1),’y’,1,2)引號可省略 vpa(s)顯示s的值 內積分限為函數的二重積分 I=∫14[∫√y2(x2+y2)dx]dy 符號法I=vpa(int(int(‘x^2+y^2’,’x’,sqrt(y),2),’y’,1,4) 微分運算(diff) 微分是描述一個函數在一點處的斜率,是函數的微觀性質、因此積分對函數的形狀在小范圍內的改變不敏感,而微分很敏感。—個函數的小的變化,容易產生相鄰點的斜率的大的改變。由干微分這個固有的困難.所以盡可能避免數值微分.特別是對實驗獲得的數據進行微分。在這種情況,最好用最小二乘曲線擬合這種數據,然后對所得到的多項式進行微分;或用另一種方法對點數據進行三次樣條擬合,然后尋找樣條微分,但是,有時微分運算是不能避免的,在MATLAB中.用函數diff汁算一個矢量或者矩陣的微分(也可以理解為差分)。a=[1 2 3 3 3 7 8 9];b=diff(a)一次微分 bb=diff(a,2)二次微分 實際上diff(a)=[a(2)-a(1),a(3)-a(2),??,a(n)-a(n-1)] 對于求矩陣的微分,即為求各列矢量的微分,從矢量的微分值可以判斷矢量的單調性、是否等間距以及是否有重復的元素。符號微分運算(diff)syms x t a f =cos(a*x)df =diff(f)由findsym的規則,隱式的指定對x進行微分 dfa=diff(f,'a')指定對變量a進行微分 dfa=diff(f,'a',3)三次微分 diff函數不僅作用在標量上,還可以在矩陣上,運算規則就是按矩陣的元素分別進行微分 syms a x A=[cos(a*x),sin(a*x),-sin(a*x),cos(a*x)];dA=diff(A)微分方程dsolve 在matlab中,符號表達式中包含字母D用來表示微分運算,D2,D3分別對應第二,第三階導數,D2y表示d2y/dt2 把t缺省了 y=dsolve(‘Dy=f(y)’)單個方程,單個輸出 [u,v]=dsolve(‘Du=f(u,v)’,’Dv=g(u,v)’)2個方程,2個輸出 s=dsolve(‘Dx=f(x,y,z)’,’Dy=g(x,y,z)’,’Dz=k(x,y,z)’) s.x s.y s.z 3個方程,架構數組 dsolve('Dx=-a*x')結果:C1*exp(-a*t)沒給定初值,所以結果中含參變量 x=dsolve('Dx=-a*x','x(0)=1','s')結果exp(-a*s)給定了初值,獨立變量設為s 計算多元函數的梯度 fx=gradient(f)f是一個矢量返回f的一維數值梯度,fx對應于x方向的微分。 [x,y]=meshgrid(-2:.2:2,-2:.2:2);z=x.*exp(-x.^2-y.^2);[px,py]=gradient(z,.2,.2);contour(z),hold on 畫等值線 quiver(px,py) matlab字符串運算 利用sym命令創建表達式 f=sym(‘cos(x)+sin(x)’)或 syms x , f=cos(x)+sin(x)diff(f)求其導數(也 可 直 接 用 命 令 f=diff(‘cos(x)+cos(y)’) 當字符表達式中含有多于一個的變量時,只有—個變量是獨立變量。如果不告訴matlab哪一個變量是獨立變量,則可以通過findsym命令詢問 利用findsym命令查詢獨立變量 f=sym('sin(a*x)+b') findsym(f,1)給出獨立變量(一個變量,如果為2則給出2個變量)findsym(f)給出所有變量 符號表達式的化簡和替換 collect函數 collect(f,v)表示將f表示為關于符號變量v的多項式形式,即關于v合并同類項,v缺省,則用findsym確定的缺省變量 syms x y f=x^2*y+y*x-x^2-2*x+1 collect(f)得到(-1+y)*x^2+(y-2)*x+1 collect(f,y) 得 到 (x+x^2)*y+1-x^2-2*x expand函數 expand(f)將f展開,寫成和的形式 syms x expand((x-1)^3)得 到 x^3-3*x^2+3*x-1 horner函數 horner(f)將f寫成鑲嵌套形式 syms x horner(x^3-6*x^2)得 到 (-6+x)*x^2 factor函數 factor(f)將f轉換成低階有理多項式的乘積 syms x f=x^3-6*x^2+11*x-6 factor(f)得到(x-1)*(x-2)*(x-3)simplify(f)函數 綜合化簡 simple(f)函數的最簡形式 syms x f=2*sin(x^2)+cos(3*x) simple(f)如果不想看到中間過程,可z=simple(f)有時使用兩次simple命令可以得到最簡式 如果想知道哪個簡化命令得到最后結果,可以加一個參數how [z,how]=simple(f) 符號表達式的替換 subs(f,new,old)f='a*x^2+b*x+c' subs(f,'t','x')得到a*(t)^2+b*(t)+c subs是一個符號函數,返回一個符號變量 subexpr函數 有時matlab返回的符號表達式難以理解,用subexpr函數,可以將表達式中重復出現的子式用一個符號表示,從而簡化表達形式 c=sym('c','real');x=sym('x','real');s=solve(x^3-x+c)a=subexpr(s) 得到 sigma = -108*c+12*(-12+81*c^2)^(1/2)a = [ 1/6*sigma^(1/3)+2/sigma^(1/3)] [-1/12*sigma^(1/3)-1/sigma^(1/3)+1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))] [-1/12*sigma^(1/3)-1/sigma^(1/3)-1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))] pretty函數有時也能起到同樣的作用。Pretty(f)顯示函數的習慣書寫形式 線性方程組的求解 求解線性方程組,用反斜杠 a=hilb(3)b=[1 2 3]' ab 矩陣的特征值和特征向量 用eig(v,d)函數,[v,d]=eig(A);其中d將返回特征值,v返回相應的特征向量,缺省第二個參數將只返回特征值 syms a b c real A=[a b c;b c a;c a b];[v,d]=eig(A); 為了觀察更清楚,使用以前學過的替換函數,這里不用默認的sigma,而改用M,顯式的代替繁瑣的表達子式 vv=subexpr(v);vs=subs(vv,'m','sigma')運行結果為 vs = [ 1, 1, 1] [-(c+(m)-a)/(c-b),-(c-(m)-a)/(c-b), 1] [-(a-(m)-b)/(c-b),-(a+(m)-b)/(c-b), 1] 再用m替換d中的表達子式 dd=subexpr(d);ds=subs(dd,’m’,’sigma’)運行結果為ds = [(m), 0, 0] [ 0,-(m), 0] [ 0, 0, c+a+b] note 求特征值也可用以下命令 f=poly(A)poly函數 用來求A的特征多項式 d=solve(f)solve(f)函數用來求多項式的解 svd()函數 求矩陣的奇異值分解,將矩陣分解為兩個正交矩陣和對角矩陣的乘積 a=sym(hilb(2))[u,s,v]=svd(a) 代數方程和方程組 代數方程的求解可用solve(f)命令,如果f不含=,matlab將給表達式置零。方程的未知量在默認的情況下由findsym決定或顯式指出 syms a b c x solve(a*x^2+b*x+c)以x為默認變量 solve(a*x^2+b*x+c,a)指定對a為變量 求含有等號的方程的解(一定要加單引號) f=solve(‘cos(x)=sin(x)’) x=solve('exp(x)=tan(x)')如果不能求得符號解,就計算可變精度解。求解方程組與單方程類似 解一個三元一次方程 v=solve('a*u^2+v^2','u-v=1','a^2-5*a+6')結果為v = a: [4x1 sym] u: [4x1 sym] v: [4x1 sym] 一些常用的符號運算 極限運算limit limit(f)求x到0的極限 limit(f,x,a)或limit(f,a)求x到a的極限 limit(f,a,’left’)limit(f,a,’right’)求x到a的左極限和右極限 limit(f,inf)求x趨于無窮的極限 符號求和symsum(s) symsum(s)以默認的findsym決定的變量求和 symsum(s,v)以s中指定的變量v求和 symsum(s,a,b)symsum(s,v,a,b)從a到b的有限項求和 syms k n symsum(k)從0到k求和 symsum(k,0,n-1)從0到n-1求和 symsum(1/k^2,1,inf)無限項求和 泰勒級數taylor(f) taylor(f)表示求f的5階talor展開,可以增加參數指定展開的階數(默認式5),也可以對于多元函數指定展開的變量,還可以指定在哪個點展開 syms x t taylor(exp(-x)) taylor(log(x),6,1)在1點的6階taylor展開 taylor(x^t,3,t)對t的3階taylor展開 積分變換 fourier變換和逆變換fourier(f)fourier分析可以將信號轉換為不同頻率的正弦曲線。可對離散數據進行分析,也可對連續時間系統進行分析,特別在信號和圖形處理領域。離散變換(DFT)作用于有限數據的采集,最有效的是快速fourier變換(FFT)F=fourier(f)獨立變量x,返回關于參數w的函數 F=fourier(f,v)返回函數F關于符號對象v的函數 F=fourier(f,u,v)對關于u的函數f進行變換,而不是缺省的w,返回函數F是關于v的函數 syms t v w x fourier(1/t) fourier(exp(-t)*sym('Heaviside(t)'),v)fourier(diff(sym('F(x)')),x,w)Fourier逆變換 f=ifourier(F)缺省獨立變量w,返回關于x的函數對w進行積分 f=ifourier(F,v)返回函數f是關于符號對象v的函數,而不是缺省的x f=ifourier(F,u,v)是關于u的函數f進行變換,而不是缺省的x,返回函數f是關于v的函數 Laplace變換和逆變換laplace(f)應用于連續系統(微分方程)中,可以用來求解微分方程的初值問題 laplace(F)缺省獨立變量t,缺省返回關于s的函數L laplace(F,t)返回關于t的函數L,而不是缺省的s laplace(F,w,z)對函數F的自變量w積分,返回關于z的函數L 逆變換 F=ilaplace(L)缺省獨立變量s,返回關于t的函數F F=ilaplace(L,y)返回關于y的函數F,而不是缺省的t F=ilaplace(L,y,x)對函數L的自變量y積分,返回關于x的函數F Z-變換和逆變換ztrans(f)標量符號f的Z-變換 F=ztrans(f)缺省獨立變量n,返回關于z的函數 F=ztrans(f,w)返回關于符號變量w的函數F,而不是缺省的z F=ztrans(f,k,w)關于k的符號變量作Z-變換返回關于符號變量w的函數 逆變換iztrans(F)f=iztrans(F)或(F,k)或(F,w,k) 符號繪圖函數 符號函數簡易繪圖函數ezplot(f)f可以包含單個符號變量x的字符串或表達式,默認畫圖區間(-2pi,2pi),如果f包含x和y,畫出的圖像是f(x,y)=0的圖像,缺省區間是-2pi syms x t ezplot('t*cos(t)','t*sin(t)',[0,4*pi])繪制符號圖像函數fplot(fun,lims,tol,’linespec’,n)其中lims=[xmin,xmax]或[xmin,xmax,ymin,ymax] tol為指定相對誤差,默認0.001 ‘linespec’指定繪圖的線型 n指定最少以n+1個點繪圖 [x,y]=fplot(fun,lims,…)只返回用來繪圖的點,并不繪圖,可以自己調用plot(x,y)來繪制圖形。syms x subplot(2,2,1),fplot('humps',[0,1])f='abs(exp(x*(0:9))*ones(10,1))' subplot(2,2,2),fplot(f,[0,2*pi])subplot(2,2,3),fplot('sin(1./x)',[0.01,0.1],1e-3)matlab繪圖 二維圖形的繪制 plot 在(x,y)坐標下繪制二維圖像 支持多個x-y二元結構 plot3 在(x,y,z)坐標下繪制三維圖形 loglog 在(x,y)對數坐標下繪制二維圖形 semilogx 在x為對數坐標,y為線性坐標的二維坐標中繪圖 semilogy 在x為線性坐標,y為對數坐標的二維坐標中繪圖 plotyy 在有兩個y軸的坐標下繪圖 plot用法 plot(x,y,'--rs','linewidth',2,'markeredgecolor','k',...'markerfacecolor','g','markersize',10)plotyy用法 plotyy(x1,y1,x2,y2)以x1為標準,左軸為y軸繪制y1向量,x2為基準,右軸為y軸,繪制y2向量 plotyy(x1,y1,x2,y2,fun)用字符串fun指 定的繪 圖 函 數 (plot ,semilogx,semilogy,loglog,stem)plotyy((x1,y1,x2,y2,fun1,fun2)t=0:pi/20:2*pi;y=exp(sin(t)); plotyy(t,y,t,y,'plot','stem')stem為二維桿圖 [ax,h1,h2]=plotyy(?)返回左右兩y軸的句柄(分別為ax(1)ax(2),以及在兩坐標軸中生成的圖形對象的句柄,分別為h1 h2 t=0:900;A=1000;a=0.005;b=0.005;z2=cos(b*t);z1=A*exp(-a*t); [haxes,hline1,hline2]=plotyy(t,z1,t,z2,'semilogy','plot');axes(haxes(1)) ylabel('semilog plot')對數坐標 axes(haxes(2))ylabel('linear plot')set(hline2,'linestyle','--')其他二維圖形繪圖指令 bar(x,y)二維條形圖 hist(y,n)直方圖 histfit(y,n)帶擬和線的直方圖,n為 直方的個數 stem(x,y)火柴桿圖 comet(x,y)彗星狀軌跡圖 compass(x,y)羅盤圖 errorbar(x,y,l,u)誤差限圖 feather(x,y)羽毛狀圖 fill(x,y,’r’)二維填充函數 以紅色填充 pie(x)餅圖 polar(t,r)極坐標圖 r為幅值向量,t為角度向量 t=0:0.1:8*pi;r=cos(3*t/2)+1/2; polar(t,r),xlabel('polar 指令')quiver(x,y)磁力線圖 stairs(x,y)階梯圖 loglog(x,y)對數圖 semilogx semilogy 半對數圖 matlab三維作圖 plot3(x,y,z)三維線條圖 t=0:pi/50:15*pi; plot3(sin(t),cos(t),t,'r*')與plot相似 v=axis 返回各個軸的范圍 text(0,0,0,'origin')在某個坐標點加入文字 plot3 增加維數可以一次畫多個圖,使所個二維圖形眼一個軸排列 三維網線圖的繪制 mesh(x,y,z)網格圖 mesh(x,y,z,c)四維作圖,(x,y,z)代表空間三維,c代表顏色維 mesh(…,’property name’,property value,…)設置曲面各屬性的值 [x,y,z]=sphere(12); mesh(x,y,z),hidden off 曲面設置為透明 meshc(x,y,z)畫網格圖和基本的等值線圖 meshz(x,y,z)畫包含零平面的網格圖 waterfall(x,y,z)與mesh一樣,只是在效果上它的網格線只在x軸一個方向出現,呈瀑布狀水線 兩個變量的標量指令meshgrid(x)或meshgrid(x,y)(p179) 將兩個一維向量生成兩個二維向量,以便進行z=f(x,y)運算,算出z的所有值,z為x y的標量指令 [X,Y]=meshgrid(x)meshgrid(x,x)的簡略式 [X,Y]=meshgrid(x,y)[X,Y,Z]=meshgrid(x,y,z)用于三維圖形的繪制 [x,y]=meshgrid([-2:0.1:2]);z=x.*exp(-x.^2-y.^2);plot3(x,y,z)surf(x,y,z,c)著色表面圖 surf(x,y,z)隱含著c=z surf(z)隱含著x,y的值為surf指令根據z的尺寸自動生成 surfc 畫出具有基本等值線的曲面圖 surfl 畫出一個具有亮度的曲面圖 shading flat 網線圖的某整條線段或曲面圖的某個貼片都著一種顏色 shading interp 某一線段或貼片上各點的顏色由線或片的頂端顏色經線性插值而得 曲面圖不能設成網格圖那樣透明,但需要時,可以在孔洞處將數據設成nun 等高線的繪制 在二維空間繪制等高線contour contour(x,y,z,n)繪制n條等值線(n可省略) contour(x,y,z,v)在向量v所指定的高度上繪制等高線(可省) c=contour(x,y,z)計算等值線的高度值 c=contourc(x,y,z,n)計算n條等高線的x-y坐標數據 c=contourc(x,y,z,v)計算向量v所指定的等高線的x-y坐標數據 clabel(c)給c陣所表示的等高線加注高度標識 clabel(c,v)給向量v所指定的等高線加注高度標識 clabel(c,’manual’)借助鼠標給點中的等高線加注高度標識 三維空間繪制等高線contour3(x,y,z)[x,y,z]=peaks(30);contour3(x,y,z,16,'g')二元函數的偽彩圖pcolor(x,y,z)是指令surf的二維等效指令,代表偽彩色,可與contour單色等值線結合畫彩色等值線圖 [x,y,z]=peaks(30); pcolor(x,y,z);偽彩色 shading interp 顏色插值,使顏色平均漸變 hold on,contour(x,y,z,20,'k')...畫等值線 colorbar('horiz')水平顏色標尺 c=contour(x,y,z,8);clabel(c)標注等高線 矢量場圖(速度圖)quiver 用于描述函數z=f(x,y)在點(x,y)的梯度大小和方向 [X,Y]=meshgrid(x,y)X,Y為Z陣元素的坐標矩陣 [U,V]=gradient(Z,dx,dy)U,V分別為Z對x對y的導數,dx dy是x y方向上的計算步長 quiver(X,Y,U,V,s,’linespec’,’filled’)U,V為必選項,決定矢量場圖中各矢量的大小和方向,s為指定所畫箭頭的大小,缺省時取1,linespec為字符串,指定合法的線形和彩色,filled用于填充定義的繪圖標識符 [x,y]=meshgrid(-2:.2:2,-1:.15:1);z=x.*exp(-y.^2); [px,py]=gradient(z,.2,.15);contour(x,y,z); hold on,quiver(x,y,px,py),axis image 多邊形的填色fill(x,y,c) c定義顏色字符串,可以是’r’,’b’等,也可以用RGB三色表示[r,g,b]值為0-1 圖形的四維表現 1.function [center, r] = solve_circle(pt1, pt2, pt3) 2.%Effect: solve the circle which across points 'pt1', 'pt2' and 'pt3' 3.%Inputs: 4.%pt1, pt2, pt3: [x, y] 5.%center: the circle center [x0;y0] 6.%r: the radius of the circle 7.%Author: Su dongcai at 2012/1/2 8.A = zeros(2, 2);B = zeros(2, 1);9.[A(1, :), B(1)] = circle2line(pt1, pt2);10.[A(2, :), B(2)] = circle2line(pt2, pt3);11.center = AB; 12.r = norm(pt1'(y2^2 + y2^2)18.%(a-x2)^2 +(b-y2)^2 = r^2 | 19.%Inputs: 20.%pt1, pt2: [x1, y1], [x2, y2] 21.%Outputs: 22.%A: 2[x1-x2, y1-y2] 23.%B:(x1^2 + y1^2)pt2); 26.B = norm(pt1)^2-norm(pt2)^2; close all;clear;clc;>> i=imread('rice.png');%>> imshow(i);>> background=imopen(i,strel('disk',15));>> i2=imsubtract(i,background);%>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);%>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);%>> figure,imshow(bw);>> [labeled,numobjects]=bwlabel(bw,4);graindata=regionprops(labeled,'all'); close all;clear;clc;i=imread('rice.png');background=imopen(i,strel('disk',15));i2=imsubtract(i,background);i3=imadjust(i2,stretchlim(i2),[0 1]);level=graythresh(i3);bw=im2bw(i3,level);[labeled,numobjects]=bwlabel(bw,4);data=regionprops(labeled,'all'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.2 close all;clear;clc;>> i=imread('r.jpg');%>> figure,imshow(i);>> imgray=rgb2gray(i);>> figure,imshow(imgray)>> background=imopen(imgray,strel('disk',15));>> i2=imsubtract(imgray,background);%>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);%>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);%>> figure,imshow(bw);>> imnobord=imclearborder(bw,4);%>> figure,imshow(imnobord);>> [labeled,numobjects]=bwlabel(bw,4);>> rgb_label=label2rgb(labeled,@spring,'c','shuffle');>> figure,imshow(rgb_label);>> graindata=regionprops(labeled,'all');hold on;for k=1:numobjects lab=sprintf('%d',k);text(graindata(k).Centroid(1),graindata(k).Centroid(2),lab,'Color','k');end hold off;%剔除碎米粒 >> idxdown=find([graindata.Area]<150);%剔除碎米粒 little=ismember(labeled,idxdown);figure,imshow(little); [lab_little,num_little]=bwlabel(little,4);rgb_little=label2rgb(lab_little,@spring,'c','shuffle');figure,imshow(rgb_little); little_data=regionprops(lab_little,'all');hold on;for k=1:num_little lab=sprintf('%d',k);text(little_data(k).Centroid(1),little_data(k).Centroid(2),lab,'Color','k');end hold off;%>> graindata(idxdown,:)=[];%剔除碎米粒 %剔除連接米粒 >> idxup=find([graindata.Area]>250);%剔除連接米粒 big=ismember(labeled,idxup);figure,imshow(big); [lab_big,num_big]=bwlabel(big,4);rgb_big=label2rgb(lab_big,@spring,'c','shuffle');figure,imshow(rgb_big); big_data=regionprops(lab_big,'all');hold on;for k=1:num_big lab=sprintf('%d',k);text(big_data(k).Centroid(1),big_data(k).Centroid(2),lab,'Color','k');end hold off;%>> graindata(numup,:)=[];%剔除連接米粒 %獲取完整米粒 idxsuit=find([graindata.Area]>=150&[graindata.Area]<=250);suit=ismember(labeled,idxsuit);figure,imshow(suit);%獲取完整米粒 [lab_suit,num_suit]=bwlabel(suit,4);suit_data=regionprops(lab_suit,'all');hold on;for k=1:num_suit signature=sprintf('%d',k);text(suit_data(k).Centroid(1),suit_data(k).Centroid(2),signature,'Color','r');end hold off;%獲取完整米粒 whos graindata whos little_data whos big_data whos suit_data >> graindata >> mean([graindata.Area])>> mean([graindata.Eccentricity])>> mean([graindata.MajorAxisLength])>> mean([graindata.MinorAxisLength])>> mean([graindata.EquivDiameter])>> figure,hist([graindata.Area],20);>> figure,hist([graindata.Eccentricity],20);>> figure,hist([graindata.MajorAxisLength],20);>> figure,hist([graindata.MinorAxisLength],20);>> figure,hist([graindata.EquivDiameter],20); data=[graindata.Area] data=[graindata.Centroid] data=[graindata.BoundingBox] data=[graindata.SubarrayIdx] data=[graindata.MajorAxisLength] data=[graindata.MinorAxisLength] data=[graindata.Eccentricity] data=[graindata.Orientation] data=[graindata.ConvexHull] data=[graindata.ConvexImage] data=[graindata.ConvexArea] data=[graindata.Image] data=[graindata.FilledImage] data=[graindata.FilledArea] data=[graindata.EulerNumber] data=[graindata.Extrema] data=[graindata.EquivDiameter] data=[graindata.Solidity] data=[graindata.Extent] data=[graindata.PixelIdxList] data=[graindata.PixelList] Area 計算各個連通區域中的象素總數 BoundingBox 包含相應區域的最小矩形 Centroid 給出每個區域的質心 MajorAxisLength 與區域具有相同標準二階中心矩(又叫標準差)的橢圓的長軸長度 MinorAxisLength 與區域具有相同標準二階中心矩的橢圓的短軸長度 Eccentricity 與區域具有相同標準二階中心矩的橢圓的離心率 Orientation 與區域具有相同標準二階中心矩的橢圓的長軸與x軸的交角 Image 二值圖像,與某區域具有相同大小的邏輯矩陣。 FilledImage 與上相同,唯一區別是這是個做了填充的邏輯矩陣!本例中和上面的沒有區別,只有 區域有空洞時才有明顯差別。 FilledArea 是標量,填充區域圖像中的 on 像素個數 ConvexHull 是p行2列的矩陣,包含某區域的最小凸多邊形 ConvexImage 二值圖像,用來畫出上述的區域最小凸多邊形 ConvexArea 是標量,填充區域凸多邊形圖像中的 on 像素個數 EulerNumber 等于圖像中目標個數減去這些目標中空洞的個數 Extrema 8行2列矩陣,八方向區域極值點 EquivDiameter 是標量,等價直徑:與區域具有相同面積的圓的直徑.計算公式為:sqrt(4*Area/pi) Solidity 是標量,同時在區域和其最小凸多邊形中的像素比例。計算公式為: Area/ConvexArea,這也是個仿射特征,實際上反映出區域的固靠性程度。 Extent 是標量,同時在區域和其最小邊界矩形中的像素比例。計算公式為:Area除以邊界矩 形面積,這也是個仿射特征,實際上反映出區域的擴展范圍程度。 PixelIdxList p元向量,存儲區域像素的索引下標 PixelList p行ndims(L)列矩陣,存儲上述索引對應的像素坐標 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 基于特定原則的區域選擇 當你要基于特定準則條件選擇某個區域時,將函數 ismember 和 regionprops 聯合使用是很有用處的。例如:創建一個只包含面積大于80的二值圖像,用以下命令 idx = find([stats.Area] > 80);BW2 = ismember(L,idx);regionprops函數的擴展思路 在regionprops函數的基礎上,你可以使用它提供的基本數據來擴展它的功能,比如我就將區域的曲率數據和骨架數據作為它的另外屬性值來開發,從而希望它能用來做更細致的特征提取。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.2 P221圖像粒度測定(雪花)>> i=imread('snowflakes.png');>> figure,imshow(i);>> %(2)>> clahei=adapthisteq(i,'numtiles',[10 10]);>> clahei=imadjust(clahei);>> imshow(clahei);>> gi=imadjust(im2double(i),[],[0 1]);>> figure,imshow(gi),title('adjusted grayscale image');>> %(3)>> se=strel('disk',10);>> topi=imtophat(gi,se);>> figure,imshow(topi),title('top-hat image');>> %(4)>> for counter=0:22 remain=imopen(clahei,strel('disk',counter));intensity_area(counter+1)=sum(remain(:));end >> figure,plot(intensity_area,'m-*'),grid on;>> title('sum of opening(pixels)');>> title('sum of opening values in opened image as a function of radius');>> xlabel('radius of opening(pixels)');>> ylabel('pixel value sum of opened objects(intensity)');>> >> >> >> for counter=0:20 remain=imopen(topi,strel('disk',counter));surfarea(counter+1)=sum(remain(:));end >> figure,plot(surfarea,'m-*'),grid on;>> set(gca,'xtick',[0 2 4 6 8 10 12 14 16 18 20]);>> title('surface area of opened objects as a function of radius');>> xlabel('radius of opening(pixels)');>> ylabel('surface area of opened objects(pixels)');>> %(5)>> intensity_area_prime=diff(intensity_area);>> figure,plot(intensity_area_prime,'m-*'),grid on;>> title('Granulometry(size distrubution)of snowflakes');>> set(gca,'xtick',[0 2 4 6 8 10 12 14 16 18 20 22]);>> xlabel('radius of snowflakes(pixels)');>> ylabel('sum of pixel values in snowflakes as a function of radius');>> derivsurfarea=diff(surfarea);>> figure,plot(derivsurfarea,'m-*'),grid on;>> title('granulometry(size distribution)of stars');>> xlabel('radius of stars(pixels)');>> ylabel('loss of pixels between two successive openings'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.2 花椒檢測 clc;clear;close all;i=imread('gj.jpg');imshow(i);icanny=edge(i,'canny');imshow(icanny);se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(icanny,[se90 se0]);figure,imshow(bwsdil),title('dilated');ifill=imfill(bwsdil,'holes');figure,imshow(ifill); %bwero=imerode(bwsdil,[se90 se0]);%figure,imshow(bwero);%i2fill=imfill(bwero,'holes');%figure,imshow(bwero);%imshow(i2fill); %bwnobord=imclearborder(bwsdil,4);%figure,imshow(bwnobord);bwnobord=imclearborder(ifill,4);figure,imshow(bwnobord);se=strel('disk',5);bwc=imclose(bwnobord,se);bwco=imopen(bwnobord,se);figure,imshow(bwc);figure,imshow(bwco);%mask=bwsdil&bwco;%figure,imshow(mask);clc [labeled,numobjects]=bwlabel(bwco);numobjects jdata=regionprops(labeled,'all');%jdata jarea=[jdata.Area];mean(jarea)max(jarea)min(jarea)hist(jarea,255)jdata.Eccentricity %std([jdata.Eccentricity])/(Mean([jdata.Eccentricity])jstd=std([jdata.Eccentricity])jmean=Mean([jdata.Eccentricity])jcv=jstd/jmean >> std([jdata.Area])/ mean([jdata.Area])%面積的變異系數 >> std([jdata.Eccentricity])/ mean([jdata.Eccentricity])%橢圓的變異系數 >> std([jdata.MajorAxisLength])/ mean([jdata.MajorAxisLength])>> std([jdata.MinorAxisLength])/ mean([jdata.MinorAxisLength])>> std([jdata.EquivDiameter])/ mean([jdata.EquivDiameter]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.06.06 rice.png close all;clear;clc >> i=imread('rice.png');imshow(i);background=imopen(i,strel('disk',15));figure,imshow(background);i2=imsubtract(i,background);figure,imshow(i2);i3=imadjust(i2,stretchlim(i2),[0 1]);figure,imshow(i3);level=graythresh(i3);bw=im2bw(i3,level);figure,imshow(bw);imnobord=imclearborder(bw);[label,numobjects]=bwlabel(imnobord,4);numobjects rgb_label=label2rgb(label,@spring,'c','shuffle');figure,imshow(rgb_label);graindata=regionprops(label,'all');graindata >> numdown=find([graindata.Area]<150);>> graindata(numdown,:)=[];>> numup=find([graindata.Area]>250);>> graindata(numup,:)=[];>> graindata >> std([graindata.Area])/ mean([graindata.Area])%面積的變異系數 >> std([graindata.Eccentricity])/ mean([graindata.Eccentricity])%橢圓的變異系數 >> std([graindata.MajorAxisLength])/ mean([graindata.MajorAxisLength])>> std([graindata.MinorAxisLength])/ mean([graindata.MinorAxisLength])>> std([graindata.EquivDiameter])/ mean([graindata.EquivDiameter])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.06.06 rice的堊白度檢測 >> clear;close all;clc;>> rgb=imread('r.jpg');>> close all;>> imshow(rgb);>> i=rgb2gray(rgb);>> j=medfilt2(i,[5 5]);>> figure,imshow(i);>> figure,imshow(j);>> imhist(j,256);>> t=0.3;>> v=imadjust(j,[t 1],[],1);>> imhist(v,256);>> t_c=0.6;>> bw_v=im2bw(v,0.01);>> chalk=imadjust(v,[t_c 1],[],1);>> bw_chalk=im2bw(chalk,0.01);>> figure,imshow(v);>> figure,imshow(bw_v);>> figure,imshow(chalk);>> figure,imshow(bw_chalk);>> degree_chalkness=bwarea(bw_chalk)/bwarea(bw_v)*100 >> bw=im2bw(j,t);>> figure,imshow(bw);>> se=(ones(3,3));>> bw1=imerode(bw,se);%兩次腐蝕 >> figure,imshow(bw1);>> bw2=imerode(bw1,se);>> figure,imshow(bw2); >> [l,num]=bwlabel(bw2);%標記腐蝕后的大米圖像 >> t_chalk=100;%設置堊白面積的下限 >> compare=(l)&(chalk>t_chalk);%>> compare=(bw2)&(bw_chalk>t_chalk);>> [r,c]=find(compare);%標記堊白米粒的位置 >> result=bwselect(l,c,r);%顯示只含有堊白米粒的圖像 >> figure,imshow(result); >> [l_chalk,num_chalk]=bwlabel(result);%標記堊白米粒圖像,便于計數 >> rate_chalky_grains=num_chalk/num*100;>> rate_chalky_grains %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.17 bwmorph函數 >> help bwmorph BWMORPH Perform morphological operations on binary image.BW2 = BWMORPH(BW1,OPERATION)applies a specific morphological operation to the binary image BW1.BW2 = BWMORPH(BW1,OPERATION,N)applies the operation N times.N can be Inf, in which case the operation is repeated until the image no longer changes.OPERATION is a string that can have one of these values: 'bothat' Subtract the input image from its closing 'bridge' Bridge previously unconnected pixels 'clean' Remove isolated pixels(1's surrounded by 0's)'close' Perform binary closure(dilation followed by erosion)'diag' Diagonal fill to eliminate 8-connectivity of background 'dilate' Perform dilation using the structuring element ones(3)'erode' Perform erosion using the structuring element ones(3)'fill' Fill isolated interior pixels(0's surrounded by 1's)'hbreak' Remove H-connected pixels 'majority' Set a pixel to 1 if five or more pixels in its 3-by-3 neighborhood are 1's 'open' Perform binary opening(erosion followed by dilation)'remove' Set a pixel to 0 if its 4-connected neighbors are all 1's, thus leaving only boundary pixels 'shrink' With N = Inf, shrink objects to points;shrink objects with holes to connected rings 'skel' With N = Inf, remove pixels on the boundaries of objects without allowing objects to break apart 'spur' Remove end points of lines without removing small objects completely.'thicken' With N = Inf, thicken objects by adding pixels to the exterior of objects without connected previously unconnected objects 'thin' With N = Inf, remove pixels so that an object without holes shrinks to a minimally connected stroke, and an object with holes shrinks to a ring halfway between the hold and outer boundary 'tophat' Subtract the opening from the input image Class Support-------------The input image BW1 can be numeric or logical.It must be 2-D, real and nonsparse.The output image BW2 is logical.Examples--------BW1 = imread('circles.png');imview(BW1)BW2 = bwmorph(BW1,'remove');BW3 = bwmorph(BW1,'skel',Inf);imview(BW2)imview(BW3) See also erode, dilate, bweuler, bwperim.Reference page in Help browser doc bwmorph BW1 = imread('circles.png');figure,imshow(BW1)BW2 = bwmorph(BW1,'erode');figure,imshow(BW2) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %邊界提取 b=bwmorph(bw,'remove');b=bwperim(bw,8);%又叫邊界象素測定 b=edge(bw,'canny');%又叫邊界提取 %去除孤立象素點 nosinglepixel=bwmorph(bw,'clean');%去除小面積物體 nosmall=bwareaopen(bw,CNN);%閾值處理再取反 bw=~im2bw(i,graythresh(i)); %開運算(消除小物體)與閉運算(填充物體內細小空洞)se=strel('disk',6);iopen=imopen(bw,se);iclose=imclose(bw,se);%腐蝕與膨脹聯合操作 %(1)創建結構元素 se=strel('rectangle',[40 30]);%(2)使用結構元素腐蝕圖像 bw1=imread('circbw.tif');bw2=imerode(bw1,se);imshow(bw2);%(3)逆操作,回復矩形原來大小 bw3=imdilate(bw2,se);figure,imshow(bw3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.18花椒子 %直接對灰度圖進行canny運算 >> i=imread('nut.bmp');>> figure,imshow(i);>> ig=rgb2gray(i);>> figure,imshow(ig);%igcanny=edge(ig,'canny');%igcfill=imfill(igcanny,'hole');igcanny_thresh=edge(ig,'canny',(graythresh(ig)*.1));igcfill=imfill(igcanny_thresh,'hole');>> figure,imshow(igcfill); %先對灰度圖濾波,再進行canny運算 >> imed=medfilt2(ig);%中值濾波后對圖像邊界有一定的損傷!!>> imedcanny=edge(imed,'canny');>> imedfill=imfill(imedcanny,'hole');>> figure,imshow(imedfill);>> nosmall=bwareaopen(imedfill,150);>> figure,imshow(nosmall); %注意:若對灰度圖像先拉氏銳化,在canny提取邊界,效果不大好!!%結論:無需拉氏銳化,也不必中值濾波,可直接canny提取邊界!!>> ifill=igcfill|imedfill;>> figure,imshow(ifill);>> nosmall=bwareaopen(ifill,150);>> figure,imshow(nosmall); %當t=0.55時,閾值處理再canny運算的效果 >> imhist(ig);>> t=0.55;>> v=imadjust(ig,[0 t],[],1);>> vcanny=edge(v,'canny');>> vfill=imfill(vcanny,'hole');>> figure,imshow(vfill);>> ifill=igcfill|vfill;>> figure,imshow(ifill);>> nosmall=bwareaopen(ifill,150);>> figure,imshow(nosmall); %當t=0.6時,閾值處理再canny運算的效果的效果 >> t=0.6;>> v=imadjust(ig,[0 t],[],1);>> vcanny=edge(v,'canny');>> vfill=imfill(vcanny,'hole');>> figure,imshow(vfill);>> ifill=igcfill|vfill;>> figure,imshow(ifill);>> nosmall=bwareaopen(ifill,150);>> figure,imshow(nosmall); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %處理花椒子 >> i=imread('nut.bmp');%figure,imshow(i);ig=rgb2gray(i);figure,imshow(ig);>> imed=medfilt2(ig);imedcanny=edge(imed,'canny');imedfill=imfill(imedcanny,'hole');%figure,imshow(imedfill);nosmall=bwareaopen(imedfill,150);>> figure,imshow(nosmall);>> [labeled,numobjects]=bwlabel(nosmall,4);>> rgb_label=label2rgb(labeled,@spring,'c','shuffle');%>> figure,imshow(rgb_label);>> nutdata=regionprops(labeled,'all');>> min([nutdata.Solidity]) >> rectangle('Position', [253.5000 207.5000 26.0000 28.0000])%畫矩形 >> rectangle('Position', [250.5000 50.5000 27.0000 26.0000])>> figure,imshow(nutdata(1).Image)%只顯示1號物體的圖像 >> figure,imshow(nutdata(1).ConvexImage)%畫出1號物體的凸多邊形 >> std([nutdata.Eccentricity])/ mean([nutdata.Eccentricity])std([nutdata.Area])/ mean([nutdata.Area])std([nutdata.Solidity])/ mean([nutdata.Solidity])>> std([nutdata.Centroid])/ mean([nutdata.Centroid])std([nutdata.MajorAxisLength])/ mean([nutdata.MajorAxisLength])std([nutdata.MinorAxisLength])/ mean([nutdata.MinorAxisLength])std([nutdata.Orientation])/ mean([nutdata.Orientation])std([nutdata.EquivDiameter])/ mean([nutdata.EquivDiameter])std([nutdata.Extent])/ mean([nutdata.Extent])std([nutdata.Extrema])/ mean([nutdata.Extrema]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %處理花椒皮 close all;clc;clear;>> i=imread('p.bmp');imshow(i);ig=rgb2gray(i);figure,imshow(ig);imed=medfilt2(ig);imedcanny=edge(imed,'canny');figure,imshow(imedcanny);>> se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);figure,imshow(bwsdil),title('dilated');ifill=imfill(bwsdil,'holes');figure,imshow(ifill);>> bwero=imerode(ifill,[se90 se0]);>> figure,imshow(bwero);>> nosmall=bwareaopen(bwero,150,4);>> figure,imshow(nosmall);>> nobord=imclearborder(nosmall,4);>> figure,imshow(nobord);>> [labeled,numobjects]=bwlabel(nobord,4);>> numobjects >> pdata=regionprops(labeled,'all');>> max([pdata.Solidity])>> std([pdata.Solidity])/mean([pdata.Solidity]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %處理混合圖像 >> clear;clc;close all;>> i=imread('m.bmp');%>> figure,imshow(i);>> ig=rgb2gray(i);figure,imshow(ig);imed=medfilt2(ig);%>> figure,imshow(imed);imedcanny=edge(imed,'canny');%>> figure,imshow(imedcanny);>> se90=strel('line',2,90);se0=strel('line',2,0);bwsdil=imdilate(imedcanny,[se90 se0]);%figure,imshow(bwsdil),title('dilated');ifill=imfill(bwsdil,'holes');%figure,imshow(ifill);bwero=imerode(ifill,[se90 se0]);%figure,imshow(bwero);>> nosmall=bwareaopen(bwero,150,4);%figure,imshow(nosmall);nobord=imclearborder(nosmall,4);figure,imshow(nobord);>> [labeled,numobjects]=bwlabel(nobord,4);>> numobjects >> rgb_label=label2rgb(labeled,@spring,'c','shuffle');figure,imshow(rgb_label);>> mexdata=regionprops(labeled,'all');hold on;%以下內容畫在同一figure中 centr=[mexdata.Centroid];%尋找重心位置 nums=1:numobjects;for k = 1:numobjects soli=mexdata(k).Solidity;soli_string=sprintf('%2.2f',soli);%等價于轉字符串 % signal=num2str(nums(k));signal=sprintf('%d',k);%直接使用打印語句打印序號 text(centr(2*k-1),centr(2*k),signal)%按序標記物體 text(centr(2*k-1)-30,centr(2*k)-30,soli_string)%標注每個Solidity值 end for k=1:numobjects plot(mexdata(k).ConvexHull(:,1),mexdata(k).ConvexHull(:,2),...'b','Linewidth',2)end %畫出1和2號物體的外接矩形 %>> rectangle('position',[9.5000 224.5000 62.0000 63.0000])%>> rectangle('position',[65.5000 141.5000 34.0000 39.0000])%畫出每個物體的外接矩形 bb=[mexdata.BoundingBox];for k=1:numobjects rectangle('position',[bb(4*k-3)bb(4*k-2)bb(4*k-1)bb(4*k)])end %>> figure,imshow(mexdata(1).Image)%只顯示1號物體的圖像 %>> figure,imshow(mexdata(1).ConvexImage)%畫出1號物體的凸多邊形 %>> figure,imshow(mexdata(2).Image)%只顯示2號物體的圖像 %>> figure,imshow(mexdata(2).ConvexImage)%畫出2號物體的凸多邊形 %畫出單個物體的凸多邊形的填充圖形 for k=1:numobjects figure,imshow(mexdata(k).ConvexImage)end %只顯示Solidity>0.92的物體的圖像 >> idx = find([mexdata.Solidity] > 0.92);>> BW2 = ismember(labeled,idx);>> figure,imshow(BW2) >> mexdata=regionprops(labeled,'all');>> %只顯示Solidity<0.92的物體的圖像 idx = find([mexdata.Solidity] < 0.92);bw2 = ismember(labeled,idx);figure,imshow(bw2)%mexdata.Solidity; >> numdown=find([mexdata.Solidity]<0.92);mexdata(numdown,:)=[];>> mexdata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.19 %roipoly函數的用法 I = imread('eight.tif');c = [222 272 300 270 221 194];r = [21 21 75 121 121 75];BW = roipoly(I,c,r);imview(I), imview(BW) %可以使用下面的方法創建相應的向量: regionprops(L,'Area');allArea = [stats.Area]; %創建一個只包含面積大于80的二值圖像 idx = find([stats.Area] > 80);BW2 = ismember(L,idx); %只顯示某個下標所對應的物體圖像 bw2=ismember(L,N);figure,imshow(bw2); %在調用regionprops之前必須將二值圖像轉變為標注矩陣 L = bwlabel(BW);%或者 L = double(BW); %將matlab數據寫到excel中 a=ones(3);success = xlswrite('c:/matlab/work/myworkbook.xls',a,'A2:C4')%將行矩陣轉換為列矩陣 a=[1 2 3 4 5 6];b=transpose(a); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %2006.6.22球形物體的檢測和標識(循環檢測和標識算法)clc;clear;close all;%Step 1: Read image %Step 2: Threshold the image %Step 3: Remove the noise %Step 4: Find the boundaries %Step 5: Determine which objects are round >> RGB = imread('pillsetc.png');imshow(RGB)>> I = rgb2gray(RGB);threshold = graythresh(I);bw = im2bw(I,threshold);imshow(bw)>> % remove all object containing fewer than 30 pixels bw = bwareaopen(bw,30);>> figure,imshow(bw)>> % fill a gap in the pen's cap se = strel('disk',2);bw = imclose(bw,se);>> figure,imshow(bw)>> % fill any holes, so that regionprops can be used to estimate % the area enclosed by each of the boundaries bw = imfill(bw,'holes');>> figure,imshow(bw)>> [B,L] = bwboundaries(bw,'noholes');>> % Display the label matrix and draw each boundary figure,imshow(label2rgb(L, @jet, [.5.5.5]))>> hold on for k = 1:length(B)boundary = B{k};plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)end >> stats = regionprops(L,'Area','Centroid');>> stats = regionprops(L,'Area','Centroid');threshold = 0.94;% loop over the boundaries for k = 1:length(B)% obtain(X,Y)boundary coordinates corresponding to label 'k' boundary = B{k};% compute a simple estimate of the object's perimeter delta_sq = diff(boundary).^2;perimeter = sum(sqrt(sum(delta_sq,2))); % obtain the area calculation corresponding to label 'k' area = stats(k).Area; % compute the roundness metric metric = 4*pi*area/perimeter^2; % display the results metric_string = sprintf('%2.2f',metric);% mark objects above the threshold with a black circle if metric > threshold centroid = stats(k).Centroid;plot(centroid(1),centroid(2),'ko');end text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...'FontSize',14,'FontWeight','bold');end >> title(['Metrics closer to 1 indicate that ',...'the object is approximately round']); 實訓小結 為期一周的MATLAB實訓在學習與忙碌中度過了,時間雖短,但我們卻真真切切的學到了知識,在現實工作中可以運用的知識。 在第一節課,我們便了解到MATLAB是世界上最流行的、應用最廣泛的工程計算和仿真軟件,它將計算、可視化和編程等功能同時集于一個易于開發的環境。MATLAB主要應用于數學計算、系統建模與仿真、數學分析與可視化、科學與工程繪圖和用戶界面設計等。對MATLAB的系統結構和特點等,老師也向我們做出了大致的講解,同時,我們知道了MATLAB程序的一些最基本的應用和運算,并能夠進行一些簡單的編程。就這樣,實訓的第一天大家都在期待和興奮中度過。 接下來的時間,主要是以大家自學和練習為主,老師進行輔導和考察。在學習過程中,不懂的可以相互之間小聲的討論,也可向老師請教,但必須確保自己真正學到了知識,認真的看書并進行編程練習。一天的學習接近尾聲時,就是老師考察大家一天的收獲的時候了,老師總會出一些小題目讓大家編出它的程序,雖然有的題目對我們來說還是有些難度的,但是在老師的指點下我們還是編出程序的,當我們看到自己編的程序運行正確時,總是會萬分的興奮,充滿成就感。 就這樣,僅僅一個星期的實訓就結束了,雖然不能十分熟悉和運用MATLAB的所有程序,但是我們卻打下了一定的基礎,在以后,當我們真正開始深入學習這門學問時,我們對它將不會再那么陌生,學起來也將輕松許多。這次實訓為我們提供了一個很好的學習機會,唯一不足的就是時間有點短,我們不能在這段時間里學到更多的知識,因此,在這一周打下的基礎上,我們需要用自己的努力去自學,以獲取更多的知識。 知識是無窮無盡的,知識的獲取需要一顆上進的心,老師將我們領進了門,下面的路就應該我們自己去走,即是充滿荊棘,也要努力奮斗往前沖。 擬合以及插值還有逼近是數值分析的三大基礎工具,通俗意義上它們的區別在于:擬合是已知點列,從整體上靠近它們;插值是已知點列并且完全經過點列;逼近是已知曲線,或者點列,通過逼近使得構造的函數無限靠近它們。 新建訓練使用輸入數據X和目標數據Y,如下所示,X是3個輸入變量,20個樣本,Y是1個輸出變量,20個樣本(注意,輸入和輸出的樣本數一定要相同,matlab 神經網絡工具箱中默認一行是一個變量,列代表樣本) matlab命令窗口輸入,nnstart,啟動神經網絡工具箱。 點擊Fitting app,得到如下 點擊Next,得到如下,并選擇Inputs和Targets數據: 在下圖設置完validation和testing之后,點擊Next 注意,這里的Training、Validation和Testing的意義如下所示: training是訓練數據,拿來擬合模型,就是用這部分數據來建立模型,這個相信大家都明白。 validation是驗證數據,剛才說training建了一個模型,但是模型的效果僅體現了訓練數據,但不一定適合同類的其他數據,所以我們會在建模前會將數據分成兩部分,一部分為訓練數據,一部分為驗證數據(兩部分數據的比例大致為7:3,這取決于你驗證的方法,詳細說明我從網上摘了下放在本次說明的最下邊,但愿你能看懂);另外,你也可能訓練多個模型,但不知哪個模型性能更佳,這時可以將驗證數據輸入不同模型進行比較。 testing是測試數據,它跟前兩者的最大區別在于:training和validation數據均是同一時期的數據,如都是5-7月數據,但既然是測試,我們就需要用跨期的數據來驗證模型的穩定性,此時,可采用8月單月數據或9月單月數據對建好的模型進行測試,看性能有沒有下降或偏移。 設置Number of Hidden Neurons之后,點擊Next 設置完training algorithm之后,點擊Training 多次點擊Retrain,直到下圖紅圈中的三個MSE值達到盡可能小的值為止。點擊Next。 上圖紅框中Training后面的MSE數據代表用來參與神經網絡訓練training的那部分數據,把輸入數據帶入神經網絡模型后,輸出數據與目標數據偏差平方和的均值,validation后面的MSE數據表示,用來進行validation數據,把輸入數據帶入之后,輸出數據與目標數據之間的偏差平方的平均值。testing后面的數據表示用來進行testing的MSE數據,把輸入數據帶入之后,輸出數據與目標數據之間的偏差平方的平均值。 下圖點擊“Next” 點擊Matlab Function,把訓練形成的神經網絡函數保存下來 出現下圖之后,保存 然后用這個函數,就可以對新的輸入進行預測了。比如新建了一個輸入如下所示: 使用函數myNeuralNetworkFunction(X1)得到如下預測結果: 注意,有的時候,X1設置為X的第一列,myNeuralNetworkFunction(X1)的到的值與myNeuralNetworkFunction(X)第一個值不同,理論上應該相同,想不明白,后來發現,重啟matlab,重新做一遍就好了,可能是哪個地方我操作不當導致程序錯亂了。第二篇:MatLab 知識小結
第三篇:matlab圖像處理小結
第四篇:MATLAB實訓小結
第五篇:matlab的nntool工具箱小結