5 l8 l0 }! [2 {+ O$ c! w) V第一章 绪论& f; d- K, e; w" w. [" S+ U1 c3 P
( t+ T; w9 a! ?/ T( O o
图形图像处理起源于20世纪20年代,当时通过海底电缆从英国伦敦到美国纽约采用数字压缩技术传输了第一幅数字照片,用来改善图像的质量。此后由于遥感等领域的应用,使得图形图像处理技术逐步得到发展。一直到20世纪50年代,随着大型数字计算机和太空科学研究计划的出现,人们才注意到图像处理的潜力。1964年在美国航空总署的喷气推进实验室开始用计算机技术改善从太空探测器获得的图像。当时利用计算机技术处理由太空船“徘徊者七号”(Ranger 7)发回的月球照片,以校正电视摄影机所存在的几何失真或响应失真。这标志着第三代计算机问世后数字图像处理开始得到普遍应用。 9 C1 j4 F' Q& b7 }, S$ e . `2 I; G: K" {( Q* ~; q近年来随着计算机与信息技术的高速发展,数字图像处理技术也得到了快速的发展,目前已成为计算机科学、医学、生物学、工程学、信息科学等领域各学科之间学习和研究的对象。$ X& f1 T) T% E
. F* k ~' Q1 a4 Z ^1.1 数字图像. T% x8 n% b3 v: I# w
# M4 |7 |# s* k ?
图像是用各种观测系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用于人眼并进而产生视知觉的实体。其最广义的观点是指视觉信息。例如照片、图画、电视画面以及光学成像等。人类的大部分信息都是从图像中获得的。% @" o$ z& T) g3 n" m
" M( c* Q/ ]: L+ V
用计算机进行图像处理的前提是图像必须以数字格式存储,人们把以数字格式存放的图像称之为数字图像。而我们常见的照片、海报、广告招贴画等都属于模拟图像。若要将模拟图像数字化后生成数字图像,需要使用诸如扫描仪之类的数字化设备。模拟图像经过扫描仪进行数字化后,或者由数码照相机拍摄的图片,在计算机中均是以数字格式存储的。 0 h1 Y! X! j0 g! Y , D; X' U# B: |为了把图像数字化,必须进行在空间点阵上的抽样和灰度量化两个方面的工作。被抽样的点称为像素,抽样的精度随图像的种类而不同。这样一来,所谓数字图像就是灰度值的二维数组。一个单色静止图像可以用一个二维的光强度函数f(x,y)来表示,其中x与y表示空间坐标,而在任意点(x,y)的f值与在该点图像的亮度(或灰度)成正比。一个数字图像是图像f(x,y)在空间坐标和亮度上都数字化后的图像。可将数字图像视作一个矩阵,矩阵行与列的值决定一个点,而对应的矩阵元素值就是该点的灰度。这种矩阵的元素就是像素,所对应的灰度就是像素值。 " S. t/ ~3 K0 `8 E I 2 Q8 i" _7 w3 ?, s3 F. u表1.1是以数据结构的观点进行分类的图像种类。即在光谱方向、空间方向、时间轴方向上增加维数的图像,可以用多个二维数组来表示。在这里,不管是一个数组还是其集合,总是要组成用计算机容易处理的形式。因此在传送和复制时,只要在计算机内部进行处理,就不会被破坏而能保持完好的再现性。这是数字处理的一大优点。% v8 s8 ?3 p' N1 F# m" A7 h+ ]+ Y# E
4 h( M9 I. w% f6 f8 U' e- I表1.1 图像的种类8 \$ i1 k: E6 }0 p; B# T8 A
) v- c) C" c: F. d+ e- s3 n种 类 6 s3 l+ ^" d3 r- t0 E& l. n8 H @ / {7 W) ?! f% ^6 S. n: M1 x $ p. a* Y+ N7 H. y5 E9 V0 M1 y. E
/ v3 K m+ E# I
形 式 % f% q* k9 {1 `* Y2 C , Q D: p. ~7 t& o$ t* b: D! U 7 P& L; s9 F' R+ A
( p1 M7 z4 @1 ?3 L备 注 0 Y2 g5 R0 k( \& F ( D# r Q8 ~7 u- a, r0 V二值图像+ L9 h$ r" o2 ^, W$ l! ?% \; m
8 R, _/ j6 ?; T+ J) n 1 q/ I, g* Y6 P' @( O F 4 @1 a! u2 M0 F$ c% b+ Of(x,y)=0,1 7 k; q/ x" y9 b, _5 c! O * j7 L: p) [* Y5 B0 s # R' [/ c B" x$ ] : F. C1 h) M3 f* x5 B# ]3 |文字,曲线,指纹等 & T0 c. p, t! v x- n# i6 A$ e6 y5 ^' L, t7 q& G5 W& v* Y p
灰度图像 3 j) M) m/ S) W/ K, k& {8 n: v, V- a9 w1 d4 B/ {# p
( s& ?8 G3 z# j' t# \/ }. @2 N2 q
* N! f) B1 a. F" xsubplot(1,2,1),imshow(I); " Q6 X* |/ S, T: x( |. q' c1 M* J. Z/ z: f$ w. L1 h! f P
subplot(1,2,2),imshow(J);+ E+ R$ s4 s3 D" j, J. l3 @2 _
! f* _* @& w; _# }; d1 i$ _: K
. k; ?) F1 n* ~ o$ g 6 o# ^+ z& i2 w& y: [: S 2 c# X, @: F1 E4 w v
5 O7 n0 @7 j' ^$ J+ j# R
* @2 E* q6 Q& i$ W! P * C+ y7 u$ Z0 M- \ : _+ I- h: ~% b9 K; N" t. w ( Z5 U8 W! \- E3 I5 w' lMATLAB在数字图像处理中的应用 5 L4 @1 ^& d- G9 H( |$ p0 R$ B+ O3 G4 D( e V* a
' L9 z" T9 Y1 i' d
! z$ o0 A" v9 K9 I0 b) t# r2 c% T2.1 几个基本术语 : P' b# L5 r- o3 B( C/ _ ! g% t. B( O# [* P: J; V5 b' T 5 {0 R4 Z: \* f+ n& B: `4 H: X
, _, X( o) F7 H U 在运用MATLAB进行数字图像处理之前,我们必须明确几个基本术语:6 P: y$ }% K. k5 a2 D9 s: d; z1 d
5 Z* @) ?/ x7 V1 a# |9 ^
1)位图:是根据图像的尺寸和分辨率创建和保存的图像,由扫描输入。- N8 @- ^/ a Q0 V. u" \% }/ g
( @) K0 ?+ z) C: c2)矢量图:使用专用软件绘制的,以数学方程式的方式保存的图像,所以矢量图的清晰度与分辨率无关。3 b1 c* q7 u& X
) j+ m% @" m$ ~9 K
3)象素:是图像在计算机显示中的度量单位,可以变化,可大可小。 / O, E( K% d# l r- X, d 8 G4 ?# q" b7 | a5 P9 }6 H4)分辨率:是用于度量图像在显示器中清晰程度的一个参数,分辨率越高,图像越清晰。分辨率是与象素相关的,即单位长度上的象素数就是分辨率。由此可知,分辨率越高,象素的几何尺寸就越小。 8 ^& U$ X& a4 {) F * b0 b M m! M7 ~* {8 Z5)图像文件的大小:指一幅图像在计算机中保存时所占用的磁盘空间,其大小与所用的颜色模式有关。灰度图像中的每一个灰度象素只占用一个字节(8位),RGB图像中红、绿、蓝各占用一个字节。另外,图像文件的大小也直接与其分辨率有关,原因是当分辨率增加时,一幅图像所包含的象素量急剧增加。* Q- I Z. j; L; m( j/ R" X
5 i1 \1 ^3 o$ f
6)句柄:通俗地说就是对象的代号或标志,它能使计算机方便地从众多对象中找到所需要的对象并对之加以相应的操作。MATLAB中的句柄图形对象包括轴、文本、菜单、控制框、图像等。, [, r8 \( K' c c; v4 d5 E" d: e/ }
- [, N6 Z" J8 A$ M! K
2.2 MATLAB 图像文件格式简介 8 F6 M% F* O* P% L3 K! Q4 v . X1 D* j" N; g; \5 M ]3 n 针对MATLAB的数字图像处理功能,我们讨论它可以处理的几种图像文件格式:2 P, F+ \$ E* f
}$ a% v {( k' T. |A)PCX格式。可处理1、4、8、16、24位等图像数据。文件内容包括文件头 、图像数据、扩展调色板数据。 ! O$ E% Q& O3 d9 C) R 4 F6 c. M) g& A% M3 y/ fB)BMP格式,即位图文件,整幅图可视为一个数字矩阵。它包括1、4、8、24位非压缩图像,8位RLE(行程编码)图像。文件内容包含文件头、位图信息数据块和图像数据。选择BMP格式保存一幅灰度模式图像时,可选择以Windows格式保存。而且在选中4位或8位位图时,还可选压缩(RLE)项,在用RLE方式压缩保存后图像将毫无损失。这是用得最广的图像格式之一,在本文中都对这种格式的图像进行操作。8 y# H; a) i3 k+ R! U8 x& X
8 h g9 P9 L1 u6 A
C)HDF格式。有8位,24位光栅图像数据集。7 i1 _0 ^6 ^2 x9 D
; ^; c4 a9 f- sfigure; ; @+ W* Y2 I& M. P+ F$ Y' s1 D' F7 o4 D& t. Z+ H# |, n
imshow(I2) ; z9 K! C! O, q4 G) w# C& n+ x4 i- q% g9 }) D# f+ \1 r
title('压缩后的图像')+ `+ c# ]/ Z0 G) K
2 G% h% R2 d. O& h1 B8 e( I应用到的函数: / V- X8 B1 Z! P! P5 H : Y, z5 i7 A- V9 _I=imread('图像文件名') :读取图像数据,保存在矩阵I中;" }$ d3 g- x4 k
2 x7 J. `! u+ m
imshow(I) :显示灰度图像I,其他用法见matlab帮助; : _, p- ]! ^3 H0 X) e/ W! j9 @ 7 b: M! k) K) j8 Q- jI2=im2double(I1) :把图像数组I1转换成double精度类型;3 n2 H! j* `+ g! Q! k
3 A+ e+ p. z) z/ K, H0 UD=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。 / \; i! H. W, u; j7 v7 b1 k/ U, Y : F X. b* n; g一个n*n的变换矩阵T被定义成:! l- V4 B" n5 D( s4 L
& m& g" Q& O# T" w! _% X8 H
Tpq=1/sqrt(n) }2 e3 ]7 N+ _$ h1 N# @% E$ h$ x7 [% k
' _- _! O( }: Q3 d/ {: z
,当p=0,0<=q<=M-1;6 z$ p' H: m5 F4 C
+ O$ H& D+ z k* `Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n] l6 r& l' \- Q" z
+ m9 ?7 f+ A( l$ O9 o, ?3 n4 t; v
,当1<=p<=M-1,0<=q<=M-1。 ' \; b6 d3 y6 V. O+ c" {9 l% D* I* G3 z
B=blkproc(A,[m n],fun,P1,P2...) :块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。 " ^! ]% Q7 J/ Z- Y' Q5 U- F8 [ " f9 Y* l/ H( Wfigure:强制生成一个新的个绘图窗口; ) @6 G3 Q6 B$ \: |7 J, ]0 \ 6 p# J. i4 C/ x非线性方程求解 + I1 c2 }1 d* w: l4 M5 h6 ^ g7 d : g! `5 |. A3 Zfsolve(fun,x0,options), q: [& I, U Y0 [( b. \, V6 C, k
/ s& ]7 s( U: {; C2 u- a其中fun为待解方程或方程组的文件名; & k" O, ?2 f: _* j3 x) o% b( D! j8 G) S
x0位求解方程的初始向量或矩阵; * }- G* V- t* \: x1 m 0 e' O4 Z% D3 n, [# G+ w Doption为设置命令参数. t# D9 D: {# A' M7 Q4 u8 J( Y
2 e8 U$ P/ x7 |) H
建立文件fun.m:. v/ g1 x: H! b) U/ C
" @' g3 f; W; ufunction y=fun(x)3 u3 F1 j# Z$ u5 k( b
# g$ d+ d& N! k3 W4 uy=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... & L1 E/ p2 c0 {8 B3 M V8 s2 x
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; - l% g$ m, e; k; _; ~ N* G5 @! g# e# w
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))* O* L) z0 c$ h# F1 Q9 z; Y
/ S& s: {* y: q z. G- w注:- O1 _0 z. \; p% z b
( P* _3 B* C4 { a0 }
...为续行符 5 A. M. c( Z8 X6 e % z5 z& R( u( `8 K6 G8 h/ zm文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。, r5 ]1 S$ l! A. X' g/ I
) n2 o, E) L* e7 ] ^3 M1 |不定积分与定积分5 O: ^* Z" i6 H" A0 Q* q5 H
9 v- \2 Q, M- d$ c' c* [
不定积分:int(fun,var), L+ u) Y7 @; \. K* K" E
3 h! ~& u) ]) d0 B6 P0 b+ G: V& m例:求∫sinaxsinbxsincxdx " ^1 B" F* d5 m# S. }1 o- z1 E( z* t E: |6 }
syms a b c x& ?% Y; v& K/ }4 z- J: ^
# j: U) V, t8 O4 [* z. p4 by=sin(a*x)*sin(b*x)*sin(c*x);3 ^3 W0 ]0 N3 ~4 P
/ y, T% Q: T; {: Y. K0 ^; ^2 Kint(y,x);" V) Q5 `- x; t. @" s" g! @, b( L* _
' @; h6 g8 t# N7 k8 y
pretty(ans)# v# }# Z! W8 X9 C1 p' T
1 b6 b' d/ f. I- S: c
定积分:int(fun,var,a,b) L' c. z% y$ ?% C, \
* L. }8 X9 o/ I4 O9 {其中a,b分别为上下限 , {) \6 W/ I. _ ; n* O' X ?. W% d$ r6 p/ P求解线形方程 . X& M& X: c+ S * l, ]5 |3 V% Z0 V' Gsolve,linsolve ) P) a5 Q, O5 f$ V# r" E' C1 ?5 T; ]* |* n5 d$ Z4 a3 w6 p
例: / i, g, S6 ^7 g* z' q& x" y. @7 R9 @, b' Z( N$ C L
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; : k- l6 i0 r' l0 d( Q# n8 p7 `- e6 d! l. o* \9 K* B5 L6 {
%矩阵的行之间用分号隔开,元素之间用逗号或空格 6 h! D/ g4 C, ? ; J* r" O% H$ y) n' z& _B=[3;1;1;0] . Z ? I; _. |" X/ C6 [$ J- {$ y ; Z( m' `: d0 RX=zeros(4,1);%建立一个4元列向量 ; _ ~' `3 ?0 x7 N) P- r( Y5 N- d
X=linsolve(A,B); Z ]( h" U$ g
6 |* i5 L- }0 @3 s6 W% k
diff(fun,var,n):对表达式fun中的变量var求n阶导数。; ]0 ?+ l- M7 Q+ Z; E# T/ K1 I
: T' t, H$ T+ ?8 g
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式 o$ l4 S& t4 e. C 3 F1 _( E& A3 ndiff(F); %matlab区分大小写 / i0 o- q3 U8 Z0 I ( ], W5 a- c: s9 t1 Bpretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 d' A. [$ g5 Y
- u# W7 u5 F# h# R8 c3 h求极限 ) [! o/ b3 ]+ T2 Z& d9 e% V. E F9 @& K- a0 D
limit:7 h! }( f. H# f0 t5 B6 C+ P
; c/ S: y& d( z% @* I4 |: q9 v& s例:limit(F,x,a,left);对表达式F求极限,变量为x,从左边趋近a。: U$ N4 k0 p: T" o
. Z- O$ \( P' w) ^
inf:正无穷; % M+ s/ [+ b! p: {* }, G# N* R3 @( G8 d7 v
-inf:负无穷。5 e; p; a _/ f2 c
4 }0 O1 E+ N/ ?, v% ^5 Dmatlab之基本绘图函数 ) Q) g @2 q7 i+ @, ? p4 @) W# v/ |8 D. a
clear:清空内存中的变量;. K) U L7 @' i" c" j) E
' r0 K+ G6 e4 x. ~. ~3 Z
figure:强制生成一个新的个绘图窗口; ' p7 r. N* f5 X, Y4 m! d* h. ]) P, P) r# A8 b! C& \6 u4 d8 ?. W
syms x y t :声明变量;% Q2 a3 Q. ?$ I7 a
& c, i' a. u9 E5 f2 T
fplot(函数表达式,绘图区间); 6 Y" m2 m% ~5 I% t# f$ V! |% f, k0 c* q- c4 w- G
plot(横坐标向量,纵坐标向量,颜色/线形等参数)4 z: g0 @" s' e, A
: z# F0 U9 X2 [ M% V
ezplot(函数表达式):简单的fplot,easy fplot' b+ u. C- V; y6 S
3 q5 e, X9 f% e! Z
axis([xmin xmax ymin ymax ...]):设置坐标轴显示范围3 V# I4 ]" K9 N" p0 h
! r V: `$ G* N z 4 B$ X% p6 a8 K- X' c ; _' |- g9 L' I/ h _- D, pMATLAB常见问题集 ' P: B( u. h9 {+ Q4 f9 Z' x9 c . u: @: S9 t+ @. d/ Z( P Z 6 g; \ j j H8 c* O# Y
. @, Y, \+ o+ G; V$ XMatlab的常见问题+ |7 L; X& G6 H" B# u+ v
' C8 k! Z* A; Z% x6 W. xProduct: MATLAB 6.0 ==> Current Version - b ^8 N) q( r; X$ A& B ) C3 d! _$ U3 C3 m% B9 kPlatform: Windows 6 g0 J8 d! m$ K7 f2 C 9 i# c. z9 h$ @1 T, A4 fProblem Description 0 O( }: ?0 D7 Z. ]; R 6 j+ l. v5 d, t) Z/ K9 H' D XWhy do I encounter problems when running MATLAB 6.0 (R12) on Hebrew5 H0 }2 O9 _" }
. w2 e/ ]; S$ f# Uor6 S% I; ^5 Q$ ~+ _' V
: C- l9 K- x3 s! |5 c0 B$ ]8 s- N
Traditional Chinese (Taiwan) Windows? I try to start MATLAB but after ) o5 I% E0 z% r( M2 L5 u4 K5 X. n. O0 Z. n4 Z: K3 g
the splash screen disappears, MATLAB exits., C1 ~2 w8 J# J- l: Q* |+ f
0 | e# v# j$ Y
PLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a# f: Y. D g& [& e* J% y! F
' H+ v& ]6 B% u% Nsimilar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0, % G2 D' Z% n/ q( Q- ]8 Y" i0 z / s: D2 m9 {' |, D7 z1 z; _see solution 7213.$ N9 v3 l: h. _* I
9 s/ g& C) X3 n, o. uSolution:6 E: }: g3 f0 K: u- G
2 R+ b) |$ Z" T6 ]; yThis problem is caused by a bug in one of the font properties files we ship * @: w8 x: \5 Y9 P $ s' t5 S0 z7 Cwith MATLAB. The font.properties file is used by Java to map the standard ; W0 h7 l1 E* R/ M$ W' ?1 g* N9 @! X5 ]* x+ |+ b
Java font names to system fonts for a particular language operating system.+ y1 s( ^) ~& j
* G1 D. x3 c# @( k8 O1 [1 f
However, we made a few assumptions that do not hold for the Hebrew or% e' [- j5 C7 E5 {7 a" L9 U8 L$ ?( k
- y* L4 K2 r3 B3 a3 j* CTraditional Chinese Windows, causing this problem.! {$ e$ m* P( D; `
. E# N& {( R6 w6 Q' o4 e$ G
We have created a fixed version of the mwt.jar file that you can use to' d0 v0 I. Q. Z7 c# |
% c# t/ d) p2 [9 g* ?correct this. To use the fix, first rename your mwt.jar file as mwt.old.6 s/ W( \" w% {7 {# M7 H
9 U! [2 q0 ~, S# x
This file is found in the $MATLAB\java\jar directory, where $MATLAB is your ; H7 H/ u1 S, ], n) z 2 U5 C* k4 I% h" {MATLAB root directory. Then download the newer mwt.jar file from:2 l1 E4 P" [/ A
0 g* U- D9 V) Z! c$ L: R$ Dftp://ftp.mathworks.com/pub/tech-support/solutions/s26990 & \9 }2 l- r/ q+ C ' e/ ~) G- z, d; N4 Hand place it in your $MATLAB\java\jar directrory. Then restart MATLAB; + @5 w6 ^* d: J. _) p) A- w, I/ D/ e9 R! W) ^- `; F% l' E
this should correct the problem you're seeing. + y" E2 [3 y: s1 ]$ X5 d' t . k2 h* b& c4 \$ H4 A& `3 m+ p; }1 y2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? + E$ H5 p1 ^7 S8 t2 C2 X. Q4 L+ V( @4 }/ m% ?
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools # 4 H {. n4 E+ O% c: ^, w) ]5 w! D2 q) _, ~9 _
参见第一节问题7)4 x5 W) F* S" Q: ]: U6 S4 V& U
+ P+ }0 w1 v M) p, {3)如何在给定句柄的axis里绘图?0 r8 b/ H. i6 U9 |7 v) Q$ ^
6 H+ t- F1 w- c; S7 R0 b1 y/ C' bp(1)为斜率a,p(2)为截距b ; b! x$ h2 g+ B; F3 V5 i b - n* y% g, ]: s! j k$ n. _2 A9 j多元线性回归即用y=a1*x1+a2*x2+..+am*xm来拟合数据点{x1i,x2i,…xmi,yi}* W' x+ f. g) ^, E ^
' U3 |* _, s2 B* F) u4 y
(i=1~n)3 m5 b: `& [1 l7 g" I
4 T3 D" u- c2 i; B# H( d M|x11,x21,…xm1| , L2 M( R* O5 A" {8 H ' }2 E. z4 U5 J8 _9 IA=|x12,x22,…xm2|- o; I; d$ l$ l& X- H' m, J. V0 Y5 M- N
) u P: V2 G6 q+ Q- d# P
|…………… | 3 [, N j- ~# l) [# P3 g' y $ O" u5 K2 r- Y|x1n,x2n,…xmn| 5 o' c2 W: R5 ^2 \- z- S- J( @0 G! N# U. H! W0 c Z
Y={y1,y2,y3,…,yn}' 6 q' @+ j* v1 G) i+ r' m- N : _3 h7 g1 s3 ^8 B8 E则系数{a1,a2,…,am}'=pinv(A)*Y * z1 N- f" G3 |( c! ~ _1 P s. T5 Z% o3 f5 g在matlab中使用 & X$ i9 j) ^: R5 c$ l( ^ 2 `+ u2 n+ r9 }0 N( [2 E. kcoeff=A\Y2 z' ^1 L5 d9 [
+ V# k! \$ U* H+ m7 ^& Z则可以得到最小二乘意义上的拟合系数' {4 H& P: Z$ v9 h) z7 d
8 t5 `( X4 }2 i- j4 F2 A
7)Matlab中如何作圆回归? O1 u6 T0 ?9 C \9 J5 l
* n- A I. H4 u2 l% B) U
:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab# a! V" K0 ~, L1 d/ f 6 j" T1 z: J5 p) P: z: t' P& ?Q5.5: How can I fit a circle to a set of XY data? % {7 O( Z- D8 }: h5 f$ c" a O" P% [# |! x+ _, q: V0 {; O
=================================================5 e# ^4 O5 p! c* l
, u. o7 v2 Y$ h8 { ~
An elegant chunk of code to perform least-squares circle fitting was 5 g2 A; v0 q/ C+ r, x5 _; J6 M# D0 s
written by Bucher Izhak and has been floating around the newgroup for# z) F. S z: B( s9 T+ z- G
0 g; a) m0 o3 c& X! Asome time. The first reference to it that I can find is in:: i, ~# ~9 A+ \3 Y
# e5 ?$ H& j$ H! c/ Efunction [xc,yc,R,a] = circfit(x,y) / D6 O1 w1 C$ T$ n" p7 n$ P- }1 G) {) W: m, R$ ^, N5 N4 w
%CIRCFIT Fits a circle in x,y plane# }5 p0 Z' x+ y& G& p
. D8 w2 `1 T% O$ }" ]8 l" H2 ]; ?% , H1 S$ c5 R+ m2 I) _/ b! P- [, G+ G! L& f0 K3 V, q2 h
% [XC, YC, R, A] = CIRCFIT(X,Y) ) C# L5 G% O+ J2 Y8 {% c; G ; a' S/ t, D1 d+ V6 q! E7 `% Result is center point (yc,xc) and radius R.A is an optional! ~4 A6 A. Y: N) \5 q
; ]% \/ O& S/ I& P% output describing the circle's equation:$ K H7 r `2 f, B
, d4 r) c) X% X9 {+ O/ P%" L- u( V: H( u/ f/ ^* Y9 {( \- u/ u1 l
2 n* p( o p# W# m$ E' K
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0 3 U2 w4 N* f( P; D, [2 l 5 A1 h: k* R# m) ]' y4 B6 a7 S" ?% by Bucher izhak 25/oct/1991# T/ I b. Q/ i& s! M3 C% _
& I% q3 K" A" s% z+ t
n=length(x); xx=x.*x; yy=y.*y; xy=x.*y;8 m0 ^* J$ q- V$ m" T
' W2 |4 Q$ G. y, X, Q( UA=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];/ |) v. M4 l9 l1 F, w# P/ |
) M. u; {8 d3 e. HB=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)]; ! F' U3 g2 O7 x2 v7 I+ _8 V/ `2 ~+ z* P% u9 z
a=A\B;3 d8 @2 ~- X: L" m
6 p* W' @2 M D- G% Z1 wxc = -.5*a(1); 9 ~" N, O0 j! p2 V5 E 4 l* h" n/ A) L" B/ ]yc = -.5*a(2); 7 |' r* B& \$ t9 S0 ]! F+ U - m4 i$ Z+ [. ^% z, [: QR = sqrt((a(1)^2+a(2)^2)/4-a(3)); # O, {4 \( {+ p 1 ]( b+ I5 T4 ^7 l9 b: X; JTom Davis provided a more sophisticated approach that works for more! B2 N* s/ e) S
! ^4 j5 y+ n7 W4 z, l4 I* q1 u- o
cases in and Code included. : Y9 Q4 }( y* T! K7 A 2 j8 H" H: l; X4 H8 c/ w; N8)Matlab中如何绘制箭头?; i/ Z6 Z) n1 p0 J
* E E* M! @% ]4 ?. E:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, SMTH/MathTools #8 l: W3 ]1 C$ M% |0 P& D$ v
5 a) V o# N2 P2 K; V$ \Mathematica中绘制隐函数用ImplicitPlot[] 7 m) P- M) v& i4 Y 7 ~2 v5 e; y1 S0 g' p7 R. W8 ~或者ImplicitPlot3D[]# C$ P5 e7 a/ Y; g) V* @
$ a% \3 ?$ n. Q% T
Maple中为implicitplot(),implicitplot3d(), V# O1 m8 S7 `1 q0 Z1 V$ _
0 X3 e: P9 D; b. b' Q0 h7 j$ z
参见 ! Y$ c/ C, _+ d$ w3 a$ o $ b7 _ F+ K9 M$ o3 d9 Bhttp://engineering.dartmouth.edu ... oad/source/Implicit : O! x& c+ D$ M0 S1 ?0 v, Q* G1 f+ I* D
Plot3D.htm & Q7 E) b% p. `0 y$ a* C* G' x2 ?" ]. d# q- o+ h
19)Matlab中什么函数可以删除矩阵的某一行或列?4 L; r8 I' I: w" {& e& I
; z" a( F9 ^+ Y: ]* P
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # 6 U+ t- V, J$ q2 B Z7 S; m$ Y& z& c9 x) g
A(j,=[]; %删除A的第j行3 G2 {# Q% u4 e: c3 L
Q9 _* l8 n! Q+ E2 Z: D
A(:,i)=[]; %删除A的第i列 2 h% \6 v( |% J$ e& k# h& M! B C( \/ L. x g6 o1 t* S
20)Matlab中能开的最大数组是由什么决定的?" G( @% r- Y1 L6 q' ]6 u4 q- x
. O3 q9 i* y% T" J+ \1 z1 k
:# chenft (mike),2002/6/1, SMTH/MathTools # 7 n4 G: r( p3 J( J ~1 d( i + H, W' C, S1 T3 G5 W1 t% m9 yI have had similar problems. Below is an explanation I received from Ian% w6 s+ [" g. D Y9 v
/ i% \3 E ^5 ~! uBoyd ; q- X; q1 N. n3 \, m5 x0 r1 S# W
from Mathworks (just giving credit where credit is due) that explains4 U! I1 ?! c, v) P
; f4 e7 P0 } S1 i1 h: Q- |what's happening. You solution is to run matlab with the -nojvm mode. & v9 F) W+ h$ f0 k! z, d' h# a% z: E8 C. m% n
"The heap memory system in J***A consists of data and handle elements.5 K2 H% e2 i" n j i# N: k! O3 y
, L! r8 Y6 C# R; f+ q
When you allocate a variable you get a handle and data. As long as data . W& [& n; H; W) j# W: l( v4 w- B8 `3 D
has an) i7 I h& O9 T6 [, ?& R0 Q, O
" w% U" u# `. `* o% w
associated handle, the JVM considers it valid and will not clean it up. ' ]4 R+ L' c$ h6 G4 f1 {1 G; O 5 y+ k; \9 a8 h$ iHowever, when you call the clear function in MATLAB, all handles are ) u# a6 l G% v1 F 8 g2 O V% @( T2 t2 f7 sdestroyed, and the data associated is now invalid. This means that the # k" Q5 H& v# s |9 u 7 O* `& _" G8 L- L! k' C$ o) _J***A # U. ]) |9 D' W* M& x# H" X8 l 8 X: Q7 ~( b' r7 Mengine can free up that data (garbage collection), but does not mean3 V: u# v {$ y4 d. P# j8 ?
: d" u1 V o7 Q7 Lthat it will clean it up at that moment. # [0 s7 q; \) o+ D; W* x* x' d, g 2 }2 n, z& l, @Calling the PACK command encourages J***A to run the garbage collector 4 ~' [9 e( o6 q5 ]0 w+ n + X3 g* E/ Z6 a0 d7 h n/ jand de-fragment the memory. But it does not force it to (This is part X p8 P. x$ z
; b' \" Z6 {- t3 k: ^of the J***A design). Even though the memory is 'freed' on the heap, ; C# R0 _3 G2 [+ }0 Z9 ^' M, [' `. `: B) ~, \ ^' U7 _* N
it is not actually free to the OS, it is only free to the JVM. Here2 b) T- h f. e7 X7 E3 j
* ~/ W2 }% m- g X: a2 a
is one way to think of it:6 O z6 N' w9 t2 j% n
5 E- \+ c5 P. @* y' r3 a% c4 m
[MATLAB] 2 E; A0 A6 {7 }# h0 [$ J! J0 V + h; x& h2 k- i[J***A]- t+ W" s E( [# [" K3 p
' }" K* t! ^+ q: ^, h0 { ?, [% T4 b
[OS] . y2 J' J& V: r. z! L8 e. G) u* R* k) D+ w# d5 Y
MATLAB runs on J***A (virtual machine), and Java runs on the OS (physical) v0 U- q( W. y v
6 }6 X$ U O9 ]# ^3 Z5 N' L
machine). So when MATLAB is running in J***A mode memory allocations. d) E& j8 ^: E/ q# o
; S/ i. ]( V0 j, B3 q( V
are requested from the JRE, not the OS.& y$ L) X/ H- V# C( p8 q1 c
3 P v) J) N! R* _' r5 OOne problem you may be running into is that the default maximum J***A heap : E( R- z) n8 N1 X, G8 L H p Z2 k- |$ j9 nsize is relatively low ( <= 64 M, so that is all the memory one session& a- i: v! g/ N# q- M. a
) s( \6 i. @% ~, y; o/ }
of MATLAB will ever get on your system.& p0 b$ q) t$ b
! l. s- n' u7 y% h1 KThe good news is that you can increase this value. You will need to create6 I- j" B) n; M1 u- X9 B, Y
$ H) p; _' p+ |9 I& U! T& E7 T4 |a java.opts file in $MATLAB/bin/$ARCH (or in the current directory when7 |3 M. I' E' [) I
) d, _7 `* z+ A3 t* s
you9 C; y! J- U0 R" f5 U$ l
9 Q) `7 @! r0 k) p' w+ Fstart MATLA and put the following command:9 e+ z/ `7 Y+ c+ ]# `' ~" \
. S+ j- ~+ p/ r* L4 u: e%%%BEGIN CODE%%% ( q2 b* v6 c l- e0 ] ' ~1 R* Y9 A4 o& XmaxHeapSize = 268435456 $ z2 H+ }" j, M" z+ Z k. h, z# _+ n: s0 g S
%%%END CODE%%%4 F4 Q W6 l5 o( s
* B% a& N) b* S4 m3 ^2 MThis will give you 256MB of JVM memory and you can adjust the parameter4 l+ ~) H, w& w; n* G+ S9 [
4 K, G q6 H9 P8 \( Y* Das needed. 1 X2 E, |0 M& ? 1 H4 ^# r# [& H+ g3 DNote: $MATLAB is the root directory and $ARCH is your system + J: w: Q( d+ k; _' B u + I0 y- H4 [: R" W zarchitecture. This solution works on Windows as well as Solaris, Linux,! p/ R' E. j4 Z" I2 z- \) H; k: I( P }
0 ]; r& R1 ` B6 K6 x6 A
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with9 U# L6 d# Q6 i3 q
7 c) Z6 Q* h; z8 e- ~% n! ua different syntax. ) b( f$ n& K$ e8 k6 E, L 2 T* _, i6 E. vFor the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are:) U' T: {# V/ D; d
3 V! I, T* w9 ^6 IminHeapSize = 16000000 ' u- Z4 W; r% e7 B& [* W" I: ]) R7 k2 z/ a
maxHeapSize = 640000003 H1 f# K0 M" ]
; q% J- ?9 W s) }) \3 l
These are the structure field names in that correspond to -ms and , c) k D5 I9 m1 K1 N P7 } [& E0 f% e
-mx, and the settings above are roughly 16MB and 64MB. " N8 A0 H, t5 W8 T 3 {0 M, Y8 G4 V$ \6 m# s# [To investigate the Java heap a bit, ask via the following:3 _: l2 ^# }/ e; c& u
! y3 G& r- e9 q2 N3 r. q; D>> java.lang.Runtime.getRuntime.freeMemory n# i3 U# J0 I$ X
' b# j1 l' W' G! N) [$ `) g; p" ^
When the free memory hits zero, Java will double the heap size (up to the & } M% {2 ~: R" H) H i3 V; R& _0 ]3 b' Omaximum setting). 7 ]) P0 J1 Y4 i9 e! C# K2 x% F5 J' i8 a9 ~$ w6 F+ P* g
If you choose to run without Java, you will remove the overhead of the 5 v k: s b2 N7 H G& N% ]/ V/ m |% H# j# R. N" e* d: W, i Y; j8 Mmiddle man, but you will also lose some MATLAB functionality (mostly/ e( a' m. ], o0 N: H" M! b2 I
! ^' C) U7 F6 }/ a, ]- xgraphics and the Editor). You will still have most of the computational + n6 S& H" _# l/ {# g. p, f 6 l9 B2 p8 t, T0 v1 `# rpower though.1 z5 R' j# Y+ O* t5 E
$ c! e6 H$ B. m7 q9 ?2 Q2 r
Without J***A, memory management will come directly from the OS, and a 7 u# b8 O: O2 X. Z% f( ]' o" @9 W- l+ j8 a! [( a# E* Z
CLEAR operation will result in memory being freed back to the OS.& \! s6 K$ P8 i, @; a9 L" u
% I1 Q! b# }$ J21)如何在Matlab中添加新的工具箱?, D5 v: g: Z, }. B1 z% N/ u
0 p A! z( X: @+ P3 j& [
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #. t2 \. A) p: e# {
, C, U: L+ \* a" Q, t8 w' s
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。 g# C. b1 C1 }. ?4 g
0 _0 K! d1 M% b f* K2 P( o( ]# b如果是单位圆,可以使用rectangle('Curvature', [1 1])! w2 C1 o4 x% R4 \8 Z& J$ U i9 l
& S5 y+ r' j% g. P& k
29)Matlab下如何定义整形 : H8 }9 y1 g* l6 v" W' ?/ L7 O8 D1 I9 }# a0 Z; O7 w& R
:#修改:fhorse (马不停蹄),2002/6/21,SMTH/MathTools #, i! S. O/ l, B+ H
- m" B, @# l* w3 t0 l9 N
Matlab默认的矩阵数据结构都是双精度浮点型,即64位来表示一个数 + a" c+ T5 F) v+ A) m+ K1 F0 X8 v, A% Y; T
字,大多数的函数和操作都定义在double数据结构,如果你需要 : n" d& B5 S" Y) W- h, c* H* A! b. v) ^4 ^0 ?3 t
把double的数据转换为整形,然后再参与运算,需要使用 & E$ H5 C; T" a9 m9 M; X+ G" w3 r3 }% Q: W1 q# M
double(int32(x))或者floor/round/ceil等函数5 e; m2 ]6 K O0 I( c$ r, q
$ K0 n+ L1 L. Z, e
如果为了节省内存,只进行赋值、打印等简单操作,可以参 8 [# F: C; ^5 M o' P! J& k" J & M2 K2 g" k/ E见uint8/uint16/uint32命令的帮助4 }7 \9 D7 a, U$ {
7 m( e& H: {0 L+ [30)Matlab如何产生均匀分布的白噪声?6 i: p; y4 Y) W, ?
8 W3 m" O+ b" n: T; A! \1 A
:#misc,2002/6/21,SMTH/MathTools # 1 |3 D1 a' z O X5 }; ~8 f# E; P8 y" ~. @. q2 l
help rand 均匀分布百噪声! h- g) R& v& |7 F) v. Q! p3 v
% ` _5 H9 `" s2 f. N0 phelp randn高斯分布百噪声 , ~& @* b4 e; V4 S 5 d+ h7 _2 k( D: x2 ^" D31)在Matlab中debug的时候能否跟踪变量的?# ] D6 D3 G4 N+ B
( D, n9 f; z! M8 d9 T' d
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # ; ]* R- G" ~) i" `: c4 z9 m7 a, D) a) m
可以,如果使用medit,设置断点后可以用鼠标移到所看的变量上,显 / ]: F$ Z/ q0 p/ Z% F $ Z7 W. S" |. M( g3 @示当前的值,或者在命令窗口打该变量名直接回车。如果在代码中实4 b, ~% |+ Q5 v6 ~% B3 c& x
) f1 o. t5 R. r& E7 v3 a
现调试断点等功能,参/ G6 z+ ~# Q6 X! J, F8 e/ r7 H9 a
3 c! y& C$ u# W( K见dbstop,dbcont,dbstep,dbclear,dbtype,dbstack,dbup,dbdown,dbstatus, ) f1 Z+ l7 s1 F ( o" J% B/ D" kdbquit ) I" c! A% X: T1 Z* N6 e2 r. {5 j/ {- `, |9 m1 f% N- p
32)请问在Matlab中怎样输入特殊符号啊或者上标、下标?, k2 c3 |, t9 Z
. r; t( U7 ]: I8 G:#FangQ(Qianqian.Fang@Dartmouth.Edu),southerner(笑着),2002/6/6,SMTH/MathTools#' N* _8 N1 `( w
$ s1 l8 f2 v7 v# d8 ^
matlab的text/title/xlabel/ylabel对象支持简单的TeX排版语法,如希腊字 3 B7 q, H5 z7 q, C9 v7 M6 D0 U* r' F, O3 @( W: L0 b
母,上下标等例如' w8 d, {# }) k! G d. }9 N- G( U
; l, d7 z; j/ f2 _) f
text(0.5,0.5,'\alpha^\beta_2'); 4 E7 x9 `- e, r) O+ X' O( @ 4 H& J3 i; D4 F. S33)Matlab中如何后台运行一个DOS程序?4 o: d. F6 |+ |7 n
7 O# k/ V4 x( h:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/6/4. BigGreen/en_Matlab# F6 c& f8 f3 ~! E% X3 ?7 W E0 X. @' K4 ]8 O2 N2 d$ C& B
这里是一个后台执行一个需要外部输入的DOS命令的例子,需要的输 2 n7 R4 l' Z% Y$ x$ l5 Q% O, ]: ~% o2 K, h/ E- d. }9 K* k! P
入实事先都写在同目录下的input.txt文件中: / i' D) H0 L/ t) o2 w* B0 _6 r* o3 s
dos('myexe < input.txt &'): }7 `2 Y+ G0 I/ ~; i
& C. N" y: X9 I; z, V* o6 p: P- e34)Matlab如何加载输入文件(批处理模式) ?% U" \8 j- m4 b' d2 Z+ ?% q
$ _) ^* F' y _* s( q n; b1 k( H
:#翻译自:comp.sys-soft.Matlab FAQ. BigGreen/en_Matlab#3 m- M! r9 y0 _- B$ T
! I9 M L5 H9 ?) HPC上可以使用matlab /r参数来在matlab启动的时候直接加载运行m文件/ X/ _0 m) a3 H- p* E' }! N
* a' t6 ?' s4 L8 e' I
,在UNIX上,使用$ a4 \/ y, {6 S. K6 e( W% L
- E" e. s. o, Y
matlab < MyMFile > MyOutputFile- r& y) ` |- I4 P( U6 z
: H5 x F& E6 h6 V1 R" r; l8 O
来外部执行MyMFile, , `4 q' m1 f/ b* i. J( r) K: q4 A# x$ I* O8 _' w3 d' i/ e$ D
以上执行方式都可以通过脚本文件实现批处理 ! t/ w6 F' H7 e' {% I : N5 h' `, Z- c# _% Y35)Matlab如何启动时执行规定的文件?% d# Z: I; I" X, T% T& t' v
* n& S6 C7 w; E& y- E# P8 Y( }1 Q4 k- M:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/5/29.BigGreen/en_Matlab# ) [/ V; n2 S2 v( l% j/ x: d4 q. k% H e. \. ?8 ]' [1 w3 ~
参见上一个问题的回答' U, O' A! ?! p. W$ ]! f! v; S4 |
2 I* E' Y( R5 Z
36)如何在Matlab GUI中使用图形背景?- W0 x5 U2 G h1 a/ m5 n; y7 D
3 J8 w% ^; U7 d @1 _7 ~* y
:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/5/29.BigGreen/en_Matlab#; q; v/ S k3 @* @9 j9 o
. t x; `! N- f' _3 iQ(k+1) ; G7 o* M% J4 a5 s+ h ) h$ D) b9 p8 O5.判断(abs(Q(k+1)-Q(k))3 r. R0 ~& @3 |5 i) s/ z, i
7 K) O( S: k8 i: p% T
QuasiMonteCarlo或者Oscillatory]" V, S2 |$ A' M7 M; j: c$ b W
; n( {3 Q7 O+ [0 N! C J3 H4 R39)为什么我的Matlab程序这么慢?- i" E; ?' K# R v
* N) w# B9 k. E4 m5 h:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/6/22. BigGreen/en_Matlab# 0 o) v* Z& P/ T 5 R: `. D8 v* B7 p, ^; Z" v我们工学院的收发室的门上贴着一张小纸条,写的是! B- L. p. K5 w+ Q
' ?4 g) M E+ H: ~. }
"Our policy is always blaming the computer"2 d/ c( J5 w3 ]% |