标题: matlab图像处理 [打印本页] 作者: YShangJ 时间: 2012-2-8 20:12 标题: matlab图像处理 网 5 Z7 ]) ]! b2 Y3 D) ~! D! A( @ 1 n Y! b2 x6 b: Q% N& a/ R+ r, U0 ?第一章 绪论: {% a1 ]0 n" m+ u% z
* J6 ?& C+ I O& ~- }$ M
图形图像处理起源于20世纪20年代,当时通过海底电缆从英国伦敦到美国纽约采用数字压缩技术传输了第一幅数字照片,用来改善图像的质量。此后由于遥感等领域的应用,使得图形图像处理技术逐步得到发展。一直到20世纪50年代,随着大型数字计算机和太空科学研究计划的出现,人们才注意到图像处理的潜力。1964年在美国航空总署的喷气推进实验室开始用计算机技术改善从太空探测器获得的图像。当时利用计算机技术处理由太空船“徘徊者七号”(Ranger 7)发回的月球照片,以校正电视摄影机所存在的几何失真或响应失真。这标志着第三代计算机问世后数字图像处理开始得到普遍应用。 : k: O7 o6 F$ ^" W. u; i. \, o Q
近年来随着计算机与信息技术的高速发展,数字图像处理技术也得到了快速的发展,目前已成为计算机科学、医学、生物学、工程学、信息科学等领域各学科之间学习和研究的对象。3 c, q' q9 d& r6 P) r5 T( E' T
, [* t& B% m+ x" i
1.1 数字图像8 w, d! _7 t" _- y' o( n- \6 p) `
( V5 q. f+ m* k图像是用各种观测系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用于人眼并进而产生视知觉的实体。其最广义的观点是指视觉信息。例如照片、图画、电视画面以及光学成像等。人类的大部分信息都是从图像中获得的。6 M. A7 }8 V5 b. ^% L% c
! U v4 j3 f6 \. ~1 K9 K
用计算机进行图像处理的前提是图像必须以数字格式存储,人们把以数字格式存放的图像称之为数字图像。而我们常见的照片、海报、广告招贴画等都属于模拟图像。若要将模拟图像数字化后生成数字图像,需要使用诸如扫描仪之类的数字化设备。模拟图像经过扫描仪进行数字化后,或者由数码照相机拍摄的图片,在计算机中均是以数字格式存储的。* ~% D0 s( d) F
5 l% Q8 u( P" Z- a9 FI64=double (I8)/255; d) O. \. _- Q0 [. ~6 O3 _ $ N/ c5 {1 k: H: ?' F/ l2 l反之,imread根据文件中的图像种类作不同的处理。当文件中的图像为灰度图像时,imread把图像存入一个8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个8位RGB矩阵中。 D4 ]% k( z' b, B9 k, N$ l( n1 b- Q. r* _" A# X2 w* j
本软件的处理统一针对BMP格式的灰度图。在编程时图像读入与输出均要求转换为uint8型,中间运算处理过程则要用double型。 3 U; z( C2 h9 m6 y 3 |9 }( Y, j+ C. {2.5 从零开始学用MATLAB" ~- r1 B6 u7 {: E0 D* |
2 W- ]6 `4 U4 s5 D
) } R0 h1 N$ f1 V
]! G8 |; l1 R) x0 A( K
MATLAB对于我来说是一门全新的语言,一般在编辑框中编程存盘后在命令框内运行,在Figure框中显示图像。在用它作数字图像处理的过程中,最常碰到的问题有: " U1 V7 ^$ ?* G $ L r, D, u2 @① 图像读入 imread (‘文件名.格式’,’格式’),必须是上文提过的MATLAB支持的7种格式之一,而用Photoshop制作的PSD图像保存了所有通道和图层的信息,不能直接用MATLAB来处理。显示图像用imshow (h) 语句,h 为图像句柄;在一幅图片中显示子图用subplot规定子图的位置和大小,用subimage(h)输出子图。输出图像若需要永久保存,则可用imwrite (h,map, ’filename.bmp’,’bmp’), 写入存储器。注意在该语句前要设置调色板,即map=(gray(256))。+ n( @- a* G5 D- J5 c2 c1 h
. E, p9 K$ O. _
② 结构化程序语句写法不同于C语言。比如if, for 之后要用end 表示这一块结束。有关条件的语句都不用加括号,而用冒号来表示递增,如2 n/ F2 e7 L! }9 ~
9 @2 r4 @3 G2 f8 n3 | w
for i=1:3:10) D9 E" H. `/ v1 G% V0 d' S! a
* [3 I) l5 @0 M- {8 P' B
表示 i从1以步长3递增到10,即做三次循环。 8 {7 b" `! n! p, } . i* z; V/ V9 V# k③ 要注意图像格式的转化。须知不同的图像格式对应不同的处理方式,如果处理与格式不符,将引起错误。比如范例中的图片lena256.bmp表现为灰度图,但其实质仍为RGB图像。如果不用语句rgb2gray将其转化为256级灰度图,经变换后图像会变红或变蓝。 j# V: n, [# w! F4 F5 r 9 Y2 s4 }5 y( x! v' W* v% o$ v$ ~④ 数组的定义方式与C语言不同。由于C语言中含N个元素的一维数组A的下标从0到N-1,数组定义为A[N];同样的数组,MATLAB规定的下标是从1到N,所以不能再用A[N]来表示数组,只能用它表示数组的第N个元素。赋值时用A代表数组。6 [, n* N0 r' S# {; C6 T2 ` ?9 I
, Z/ t$ h; L* g" x+ \8 q. ?
⑤ 由于在本演示软件中,涉及较多点运算,所以运行速度较慢。等待时未知其是否顺利运行。这时最好在最外层循环加上计数标志,即变量名,这样对程序运行的影响不大,却可以知道程序的运行情况,有助于查错。但如果在内层循环加标志的话,将大大减慢运行速度。 1 N- l! O) o0 j" {( o $ N5 M3 a; z' C7 O⑥ 尽管MATLAB允许未定义使用数组,但在实际应用中这样经常出错,特别是遇到在double和uint8型之间的转换时。所以最好还是养成用前定义的习惯,避免出现不必要的错误。 - y1 R& `3 R/ j3 N+ s7 D8 h- O, ?3 P4 T! ?
⑦ 在做完一定量的运算后,一般要用Clear清除内存变量,以防影响后面的程序运行。7 \- M6 M: E; q3 s! s# _8 ~8 i( n2 Y
; U/ ^4 B4 `$ Q. d. O W ( ?, t h+ I% r. X! Y
% v; o$ i9 f. \5 bmatlab调试工具+ n9 v. @- y6 S2 {- l9 @8 w
9 g! t8 C2 W0 q. {6 k2007-05-31 09:32% T# C, y5 d1 D b5 k# Y
! \+ a2 B0 f9 P% Q9 s在开发函数M文件过程中,不可避免地出现错误,即故障。MATLAB提供了很多函数和方法,帮助调试函数。 & Y1 c' h' j- M% B; H% [ 6 c3 b* [/ ^: M4 G在MATLAB表达式中,有两类错误:语法错误和运行错误。当MATLAB计算一个表达式的值或一个函数被编译到内存时会发现语法错误。一旦发现语法错误,MATLAB立即标志这些错误,并提供有关所遇到的错误类型,以及发生错误处M文件的行数。给定这些反馈信息,就很容易纠正这些错误。 ) G5 W( Z, m; O' J9 h ! s4 j* c9 e n# [而另一方面,即使MATLAB标志了运行错误,但找出错误一般比较困难。当发现运行错误时,MATLAB把控制权返回给命令窗口和MATLAB的工作空间。失去了对发生错误的函数空间的访问权,因此,用户不能询问函数工作空间中的内容排除问题。1 e- q/ K+ `. |" l4 K# ~/ h6 [
o3 A# Z; N+ E+ J- [8 S8 T2 |% n
根据作者的经验,当一些操作结果导致空矩阵或NaNs时,最容易发生运行错误。所有有关NaNs的操作都返回NaNs值。因此,如果有可能出现NaNs结果,则当出现NaNs时,最好运用逻辑函数isnan来执行一些缺省操作。因为空矩阵为零维,所以对空矩阵寻址常常导致错误。函数find表示了可产生空矩阵结果的一般情况。如果函数find的空矩阵输出用于索引其它数组,所返回的值也将是空的。这样,空矩阵具有传播性质。例如:3 E. K" a) a6 o# [
# p g0 ^. i7 f+ o0 F! H2 I>>x=pi*(1 : 4) % example data% m/ h! n' _4 D# c% v* a+ @ S
6 R4 s }% ?! d/ F/ ?
>>i=find(x>20) % use find function! W9 V; L. b; k) ]5 b
$ S4 V5 @5 J% b. d R; x
>>y=2*x(i) % propagate the empty matrix8 G6 \6 C. ?+ O! ?- W6 i
: p/ P! i2 r5 H1 w/ A" S很清楚,当希望y具有有限维数和值时,可能发生运行错误。当执行一个操作或使用可返回空结果的函数时,逻辑函数isempty有利于为空矩阵定义一个缺省值,这样避免运行错误。 4 T5 n T! d' }/ O( M5 g! h5 T- A9 k$ H
有几种调试函数M文件的方法。对于简单的问题,可直接使用下列的方法组合:7 {" A; }- `( D& w* ?& E; r
! X& O2 w; R# t2 C& b2 a
1、去掉文件中所选择的行的分号,以便中间结果显示在命令窗口中。6 _* X4 P: N# U. T4 Q7 K7 X
1 z0 x6 g+ L4 [8 E# D2、在文件中加入显示感兴趣的变量的语句# G$ z" E$ M0 x2 t m
1 l' n/ d( M! G" [. G# T5 Q: U1 h
3、把keyboard命令放在文件中所选择的地方,给键盘暂时控制权。这样,可以查询函数空间并按需要改变其值。0 [2 F* t7 V8 M0 X$ Y
! C5 v% s1 _3 D8 i3 Y4、在M文件开始,在function语句前加上%,将函数M文件改变为脚本M文件。当MATLAB执行该脚本M文件时,该空间就是MATLAB工作空间。这样,当发生错误时可以询问。 u. f- W( B# ~5 |* e) ?5 W5 B9 S
当M文件大,递归调用或者多次嵌套(即调用其它M文件函数,被调用M文件函数又调用其它M文件函数,等等)时,用MATLAB的调试函数会更方便。与上述所列方法相反,这些调试函数不要求将有问题的M文件进行编辑。表16.1所给出的这些函数类似于其它高级编程语言中所提供的函数。有关进一步的信息,以及它们的使用实例,参阅《MATLAB用户指南》。 7 I$ }5 h( _6 K6 X3 X2 F b . e6 [$ e1 o' ? B/ [2 y$ W+ F表16.18 Y. @% i8 c1 y( Y, p; ^+ {
3 h3 T- s! N8 ~6 H* n- W/ ~
MATLAB调试函数 ' k8 v% |; J( X. o I( m8 ?' P3 f 5 z0 U+ @" g! f$ |; Y8 Rdbclear: ) X0 N/ z( E. y( c3 [ % P2 e W; c& E, O+ u% v / S# N0 T8 y: I取消断点* b+ T, P4 O7 e" V. f' k8 F# S* T
# n" w e2 M! s ?Solution Number: 26990& R8 d6 a, i# D s6 U y' o
9 K9 L+ M2 q5 i5 t# ]1 e! R
Date Last Modified: 2001-01-30 # r& ^ S4 Z" k- d$ B5 |( h, w7 y4 `. J
Product: MATLAB 6.0 ==> Current Version5 R1 S- _: H3 M) ]* `7 f; x( k
4 q+ D( h3 A x6 v3 r5 B
Platform: Windows0 L* f. b' g: F2 ^
: @9 c ]6 i1 a5 ]( H" F
Problem Description* x% T+ O3 B3 H, r2 w" G% N$ E- `
+ _2 n. q6 ~& ]" W M K& uWhy do I encounter problems when running MATLAB 6.0 (R12) on Hebrew 4 G/ @! r/ T; l/ s1 `2 P% | o
or& h9 }. i1 S* g* K* l, V# v# s
% T5 c3 Z0 V L; P JTraditional Chinese (Taiwan) Windows? I try to start MATLAB but after " h3 v. ]" A% K3 H4 z9 b: b4 O8 {1 k$ z! y9 A
the splash screen disappears, MATLAB exits. 8 \7 T* b9 j9 S" K2 e3 B, O$ U; P* J/ K0 Z
PLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a# ~- a' o7 U" @/ @. w6 `8 V! q
5 R' V4 o+ F/ X3 ?2 Ssimilar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0,/ P- H" A, ~- B
g0 `3 r7 l# J7 [1 ^1 _" Z0 U& K
see solution 7213. ( m" t$ {" |; E8 O w ' U l4 T m8 {" [% TSolution: 0 S. U$ e- I" y9 A5 G0 L% Q ^0 U* a: c7 W' E8 e$ ^( f
This problem is caused by a bug in one of the font properties files we ship2 @' V! l1 V' z6 }; g3 _
* y ?- x, _8 Z. g4 U0 G3 W
with MATLAB. The font.properties file is used by Java to map the standard8 J) U4 V1 M: D6 b
$ y" ~) g' w5 I' B9 D: W5 b
Java font names to system fonts for a particular language operating system. 2 M3 ]& ~9 g9 Q! j1 v+ T' } ( u9 f" s) ?3 g8 \4 rHowever, we made a few assumptions that do not hold for the Hebrew or * f" n6 U9 ^$ i5 ^ " S- f$ N: c g% e( v; r; RTraditional Chinese Windows, causing this problem. 7 @+ ]/ K% K$ `" ^% F! s" D3 e# x 6 _8 s$ ~; a U- VWe have created a fixed version of the mwt.jar file that you can use to ) r4 H: K6 J+ s, I, i3 W1 l6 c) i, Q! P# G
correct this. To use the fix, first rename your mwt.jar file as mwt.old.9 e4 n- i) V+ {
( c/ @. e" d0 v, H: n% SThis file is found in the $MATLAB\java\jar directory, where $MATLAB is your , n3 g. n+ `4 F5 M! e ( W; c* M; U& E, ~9 g' rMATLAB root directory. Then download the newer mwt.jar file from:3 [" v+ P; k: J/ f
# Y' W1 q. z x$ n0 r9 s ftp://ftp.mathworks.com/pub/tech-support/solutions/s26990 4 v# Z! |3 D0 O1 E U) Y9 N6 @! a) D) T" O. k
and place it in your $MATLAB\java\jar directrory. Then restart MATLAB;1 c" \, m' d3 E7 O1 S
9 S$ F, R! l; ?: _; Kthis should correct the problem you're seeing. # r3 f6 g4 F& V. X7 z9 E' {( D+ n9 S* E$ X& @, F& x
2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? ( W0 I" ~7 _3 ~- W L1 K# w/ S7 e3 F1 M- y/ v. z
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools #7 P0 m* t4 T- A' O
$ k4 s0 |6 F) s- C2 o1 I
参见第一节问题7); l, j1 W. H e/ E
5 b% j. S$ S- ~' I( z) P; |2 R
3)如何在给定句柄的axis里绘图? 3 [4 O+ X) U% M) g0 n) T2 h6 S9 P& ?- C0 J+ J* x' [
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # " P# U1 ^2 X' r5 [! t& _' e4 Q" H5 f7 z: V3 i8 |* G6 B
plot(data,'parent',haxis); ; b" I( f, Z3 E; C6 U* O6 q ^4 l & w2 H) X0 V/ C! N或者 * m. O/ ~: D6 i+ e1 l2 a: K, i; y: I+ ? q; a0 r3 w
hbar=bar(data); : G3 @- `; I/ v- E! }6 E$ w: e8 c% o5 }% P6 e$ k7 x5 @( F
set(hbar,'parent',haxis);. z$ L1 x9 |3 I
4 `3 E! W8 ?, u5 r) w, D+ O9 @
4)由Matlab符号运算得到的公式怎么才能将数据代进去运算? . r2 N7 p% x3 J2 a( T* t+ `0 m* R% B6 O2 ~6 N! b
:#ramjet (德芙)2002/3/3, SMTH/MathTools #5 `- f2 A/ Z- V, a
4 a5 A4 d* R$ L8 ?4 P
使用subs(),或先将值赋予一个符号变量,然后用eval() 0 f; t' {. a# x6 l% R) v: J- Z+ y/ D8 m$ h: i( B* S0 H* u+ B
5)在Matlab中如何求最值点?如何求一维数组的极值? ; j+ K2 n" x9 t, O% _* C4 y- Z $ t. F7 f1 y. c9 X9 V:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/18, SMTH/MathTools# $ U5 M: Y0 ^) `! A8 k$ ]* r/ l; R" S; Y. D' }/ [) h! y
最值: ' [6 U. W% K( P9 c. V( e3 R0 V" o5 \' Z6 c: n
一维或多维数组最值用max(data()* ~8 B5 } ^0 `- a, f
1 T. l+ g m$ I& r: d5 Q8 L
如果想返回最值所在的位置,用[Y,I]=max(data)( D+ I9 I% r5 z
3 q0 u, H) q+ q:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2001/4/21,UESTC/Math# : W3 ]6 G0 X, J, W, D0 @, `& e7 H3 e0 C( E) Y, M9 ^9 n
极值: # X4 |/ V, |/ j" R; L' x' o3 k. C: @) W" ^
data是你的数据,! h" ?0 \" S5 W/ L: ?5 ~
" `$ G7 w; ]6 v# T/ w3 G
find(diff(sign(diff(data)))==-2)+12 m! n6 o( N7 O* Y1 o
L) S& m/ I1 K! _) w @# ]' Ufind(diff(sign(diff(data)))==2)+1 3 k/ ]; l9 m# G , T; g$ J0 f7 R找到极小值的位置" X$ p% e9 `* i: l% o) K& F
* z! X# q% Z* l
data(find(diff(sign(diff(data)))==-2)+1)和5 l- s- f" B. j- x) b+ E, o
& G& }4 w( c3 ?% i
data(find(diff(sign(diff(data)))==2)+1)9 ]/ B8 L- U; W a9 n. B
- R: V; C# e, }% H6 [' w$ }+ D* h$ {
返回的是极大值和极小值( w% K7 k7 z n- h7 c$ [
! E/ G9 r# W; P+ `( Q# k
6)Matlab中如何作线性拟合/线性回归/多元线性回归?3 ^7 {2 K/ T M$ [5 ^
, @1 a" g3 p; t s" \$ F& t
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools # v& F x4 `7 i% H5 W& ^& B7 W( E& K7 p x# l/ [" b( e6 _
即用y=a*x+b来拟合一组数据{{x1,y1},{x2,y2}…{xn,yn}} 5 i+ f, L' }! c1 U. V2 i0 m) F2 ?2 O P" ?5 k
matlab中使用polyfit( K( c5 @5 e5 ]3 v- E( E
! p( q9 i3 z8 X; V, Y% g0 F V4 ix=data(:,1); ' r, K$ G9 k U% I6 w ; `4 B4 {8 X) s& X# X# My=data(:,2); 2 x2 D4 n# K, w4 k+ R1 d$ d5 g: D ; D5 ]% W) P2 h; Sp=polyfit(x,y,1);/ T' \6 @, v3 C! U, e
6 ]: S/ ~$ |( L. j
p(1)为斜率a,p(2)为截距b5 Z% L6 {, L! b2 h) u# ^6 A/ j# m
$ l/ F' m. H& R. ]" f5 I
多元线性回归即用y=a1*x1+a2*x2+..+am*xm来拟合数据点{x1i,x2i,…xmi,yi}$ A! M& w. o' Z$ q
( Z- H/ s. b, S, x(i=1~n)% N) h! [; B8 X1 |, Z
' d4 Y/ v" y( z* t
|x11,x21,…xm1| 0 w* m: ^" K+ ?- I/ l : Q/ C+ } l/ R( I, Q* R) R, AA=|x12,x22,…xm2| I, v p+ g* _2 ?8 f4 {" U
1 C. s1 y' }' G5 _9 W! R( I
|…………… |9 X# {: ]% O2 @2 s2 `) W
4 @+ s- `5 q! c X/ {|x1n,x2n,…xmn|2 q: M; z& h' P3 o. y' E
4 Y4 o6 k) v& c$ B6 r
Y={y1,y2,y3,…,yn}' 8 y6 |9 t/ n; d) s0 @+ C4 M! D' w3 [/ X" N- Q: N% B6 _7 Q
则系数{a1,a2,…,am}'=pinv(A)*Y* N: Z% j Z$ l4 F0 a1 k# t# W3 W
) u- \2 ?7 x$ x: ^ C在matlab中使用 ! W4 R& l* k& ^8 U) g9 C: X2 c5 n) W 6 `; I. T b0 X- g! B) K2 K. f$ dcoeff=A\Y 3 {5 a5 _3 X8 q& J* h6 f2 i ( ~' I, `1 O- S( W2 R( t则可以得到最小二乘意义上的拟合系数 " R7 y/ z0 D: |' g& j' M6 M; P+ |; p: n. d4 R8 _
7)Matlab中如何作圆回归? 7 A% p' J$ ?# q 6 L$ f4 ~9 ~+ m- A" `0 R3 d:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab#9 D1 k5 B* F% T, p) c/ V
# }. a* ~2 @$ D. Z/ V3 ^6 P" aQ5.5: How can I fit a circle to a set of XY data? 0 _) F& P. X- p7 c% X* M 3 u/ a8 O- q* I$ y4 ~8 Q=================================================& |$ D% l; L3 C2 v8 R
?" r0 o* g& E3 M$ tAn elegant chunk of code to perform least-squares circle fitting was ) Y/ g. E! P3 V9 l2 [ & a$ S# s) y0 @! M. ?written by Bucher Izhak and has been floating around the newgroup for% Q0 l! I6 d2 v" ]: ~" [
- _" H3 X7 ]( Hsome time. The first reference to it that I can find is in: ( w& }$ j$ \, h! v& n0 A) g+ A& q @% S
function [xc,yc,R,a] = circfit(x,y)0 a' P# H7 j5 c- u! s) o
3 z+ L# ^; Q2 N1 N
%CIRCFIT Fits a circle in x,y plane" a1 g: L# W% m4 l5 O% [
; y8 U' m% V2 | B5 X
%! G' Y4 j, _7 i8 A7 `" S
) w( T A: k9 F$ \: Q g
% [XC, YC, R, A] = CIRCFIT(X,Y) 0 c+ `9 G8 z6 Z0 S. z3 U) ] T! `9 R9 H n7 D" ?$ @8 i, e3 h
% Result is center point (yc,xc) and radius R.A is an optional# |/ }1 ^. ?3 P/ r$ x' |+ t+ a' [
0 O$ O" ?/ v; N/ C. [2 M- ?( C3 @% output describing the circle's equation:4 q" ^: k% C% Q" |- R C! [
) t/ ^8 l( W% `; u! [
% - w& z, B) F0 [ / P% b) j9 Q" i2 j/ O$ A% x^2+y^2+a(1)*x+a(2)*y+a(3)=0( R& }$ y# h( p; L) a
/ {0 ~0 J) T0 b+ n
% by Bucher izhak 25/oct/1991+ |# Z3 w! n* V# }& a
7 y: I7 O6 \ u3 {; `% f
n=length(x); xx=x.*x; yy=y.*y; xy=x.*y; . [, L& }7 Y1 [* G# Z+ B. a1 j2 E 0 x! }$ ~0 p/ B TA=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)]; . I' q) N/ E* U$ h4 g" J % x4 d# R- U* m. e" EB=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)];8 y5 U; R2 Y& }% H) s1 C0 j
9 @) g. ^4 q- e% V
a=A\B;; \! K: P* y/ o8 e* E
5 T2 C k' K" p$ P. m
xc = -.5*a(1); + }) B8 k0 Q, W: \# ~% l. J o $ ^5 y- @2 Z6 E8 P" pyc = -.5*a(2); + }* X0 t( K, i+ i0 G- }$ V* t& h) \, I) Z% {- _ V
R = sqrt((a(1)^2+a(2)^2)/4-a(3));6 c& u2 L3 Y( Y
) S! j0 D* l5 V4 }" K0 \* lTom Davis provided a more sophisticated approach that works for more . Q3 l+ ?# a" \/ Z; u; d! h( K" S& N I T ) Y7 L& G2 L2 p4 S# `) F9 \cases in and Code included. ! v0 {9 V9 } {: e( ^/ c: F0 v' N0 E7 j
8)Matlab中如何绘制箭头? $ m- x/ C: a( `3 s9 q6 Q, K7 P" m) b
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, SMTH/MathTools # . S8 J- Q8 x+ \6 S& ], f ! ^/ Q/ y/ q! ?# r3 I0 x到http://www.mathworks.com/matlabcentral/fileexchange/index.jsp 6 G& G6 W0 L/ q6 N7 V2 a2 ]+ _0 `" Y5 r' w6 ]
2-D Plotting and Graphics中查找arrow.m,或者; _. Y0 r7 Y m5 G1 _$ H8 d
9 M+ {( z7 y n: A7 K2 ] http://www.mathworks.com/matlabcentral/spotlight/arrows.shtml ) Z U9 p6 b$ Z/ Z& F, p5 O# q& _; S http://www.math.umd.edu/~jec/matcomp/matcompmfiles/mfiles.html, P# S" O/ o8 l" O! [4 [- q( d
$ b: n4 H# F4 o6 K4 W* b5 h2 r4 I
9)Matlab中如何作二维数据的插值? 1 V8 F9 |1 }9 t3 c" c + O2 p5 O1 H: D! R% I:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools # : ~$ P% e0 Y& \5 V2 s( `, K& I+ T
对于一维、二维、三维规则数据点阵使用interp1/interp2/interp3,% T( Q n! Q1 S
% T, a3 i3 n2 ~+ _: e* o; e
二维、三维非规则数据用griddata/griddata3% P1 u7 W0 [! l+ s |- W9 R1 b
& k, G5 Q2 H( b; n
10)Matlab中如何绘制三维数据阵? 7 O: ?) p4 Z2 K 0 R p* y* N2 [( N2 Y! ~7 I8 P:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #$ r, ^: S2 h5 ?% N8 v4 c1 s
2 Y- d* i. P9 c4 P如果使用matlab,打开帮助窗口,在目录树上找到 2 H( n, m6 b3 d6 Z6 \( S" ~2 X1 ]& _1 y+ M8 Z7 X
MATLAB\Using Matlab\3-D Visualization: Volume Visualization Techniques ; S8 w* T6 Z* H x7 r/ _' }# S 2 E. ^/ K5 _4 n; S# {" N如果图形复杂,建议使用Tecplot,参见Tecplot手册中数据格式,将你8 g* m" |% q, x
" |. o5 L* i7 G; P" G+ R, b
的三维数据读入Tecplot,双击zone,可以设置mesh/contour/surface* I4 M; a: G, ~* J9 j( s
; m& m( P7 c6 i! A) l4 Q
transparency等。 % R0 }6 o- k+ U" ^( D' D3 I {5 r2 z* t8 U3 K# m
在Field菜单中有3D Iso-surface Details和3D Slice Details,可以绘制等值6 T: C6 X% b6 d, {/ U2 X
! Q& y% j+ c; ?$ d- a# ?* F
面和任意平面的截面图。; U$ U! E* }0 E. t) h' ?
) u0 C( Y' d" d# c
11)Matlab中如何注解一大段代码?! M4 H- ~% `. t6 b! C1 k0 P
: j8 ^4 Y! O5 U# ?' B' m6 |7 \
:#misc,2002/6/21, SMTH/MathTools #) Y. W+ R2 W$ j9 p- w; m7 p- |: @) r
3 e8 D8 v1 ], h9 v* V/ W
if(0)! J @. p" u: N) _' \7 {
2 E# L# ~/ u( D
大段的代码& O# \. p! h K/ D: u# u2 v% l
, B% b. U0 u) v R# f3 d9 r如果只在命令窗口进行交互操作,请参见demo中的例子,主要是 2 I% c: I. I; Y" E0 I, G. R) b5 F 0 {8 I' |! j" E. w' E通过input命令和pause/clear/disp等实现的,还有一些窗口资源可以使 5 s/ t3 R0 z7 p6 I" B! p& I! V! V5 u. s6 s: d+ ?& g- s E
用:' O2 ?3 n+ }8 Y) b) N6 c
3 h) U- O" [7 ?2 _uigetfile,uiputfile,uiwait,uisetcolor,uisetfont, uiopen,uisave 0 k; w0 A* v# m/ `2 t# H) Q 9 @4 M+ l/ U% @; iinputdlg,msgbox,helpdlg,questdlg,warndlg,errordlg 7 Y0 c a! {2 ^+ q6 P5 G$ s8 C/ ~. @) o4 z
16)Matlab中为什么只能在小数点后显示四位?4 s& e6 ? Q) p% C' c; y. r. J, o7 L1 u
& u" S. `8 J1 ^' O. j( d:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #0 z7 v0 x0 n0 u! U* X. [; O3 O
& B+ `7 N; Y, ~) R$ P8 N8 F# Y
用format命令来改变命令窗口数字的显示格式和精度,但不会影4 X+ U$ i5 ^# t& R6 U. q
! [1 r8 @; m" n# r
响matlab的计算精度,matlab的矩阵运算默认都是双精度浮点型运算。2 K2 ?* f7 O- L5 `& \1 d
% g# U+ Q) X; y ~6 e/ B
17)Matlab如何在命令窗口按照格式输出? g0 A7 s8 E, P3 c+ ~3 P 5 H7 E' F8 f0 T:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,SMTHTools #; A0 ^( b6 \: x
8 ^3 M/ H& y9 `fprintf(1,"your_format_string",var1,var2,…);$ R/ S) x3 V. f% H
q6 R6 Z- H/ TPlot3D.htm % x" @" q& I# W. x$ S% f' h3 n/ d. t, |/ t: E
19)Matlab中什么函数可以删除矩阵的某一行或列?; t7 Q& H" Y" Z* ^( |2 P5 w2 K
" K( x, V" t. j; w* i6 `) Q:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # % V5 M. b! S m3 N! ^; B+ r+ g( Z* f1 Z' m! Y5 }# E' s
A(j,=[]; %删除A的第j行 # J& s2 `; t, I" Z, P; @. K# R. H1 G6 @6 N! H% z- F
A(:,i)=[]; %删除A的第i列 H7 c( \8 h4 q
* m* q) K6 N) t* [20)Matlab中能开的最大数组是由什么决定的? * j, E* b4 L+ W4 j r: Y/ d! x) L: _6 h; D
:# chenft (mike),2002/6/1, SMTH/MathTools #2 v; J' H' ^7 R
* e5 ]2 q N( ~ z% ~2 j. {$ ~2 E
I have had similar problems. Below is an explanation I received from Ian ' W4 Y) }/ f% y7 c2 c) n) D% G, k0 y6 a
Boyd$ B2 H8 q3 h% J1 w
* u i# I2 ]1 J5 R! S) dfrom Mathworks (just giving credit where credit is due) that explains2 b3 G; v4 q/ _# N7 U ?/ A) T
! F# @% t4 i1 X8 S* Z) C6 q& C
what's happening. You solution is to run matlab with the -nojvm mode. G! b- A& l1 I& ` ~0 l * s7 @* w7 J% J* I% N"The heap memory system in J***A consists of data and handle elements. 4 g2 a4 ^. l4 A: q. y) d! K+ Y2 h/ a7 B5 U2 X% d0 N, R: b
When you allocate a variable you get a handle and data. As long as data 1 e: u8 y! O& G4 B0 D {/ ]& j0 _0 u( _& }6 e
has an ^% i: t9 c( N0 g9 H, u) ~6 E8 W f" M
associated handle, the JVM considers it valid and will not clean it up.3 @5 p7 Q2 b& D- U# R
( J0 i; r8 e/ S7 X% @However, when you call the clear function in MATLAB, all handles are2 A( W% X/ |1 d$ B4 j$ Q
! b2 K, V6 @: t) F7 q6 Vdestroyed, and the data associated is now invalid. This means that the( ?7 C1 X+ N4 S& P. B
5 C" a5 t4 o) q. e3 y
J***A % Q. X# p: K1 \9 k0 D! P: X5 J# l
engine can free up that data (garbage collection), but does not mean . C: W' k. ]% B. w/ t- n! D! i . ~! Q7 H& B) m/ R/ U" Ithat it will clean it up at that moment. ! m1 C3 h5 i$ e* G" n- O4 ^- [+ y
Calling the PACK command encourages J***A to run the garbage collector3 a9 W) u# V+ M( d
: o' F* D l) M" o; K( i
and de-fragment the memory. But it does not force it to (This is part & k4 k5 Y2 C" u6 N1 }4 j, T 6 l! e8 V: ~1 b- f x6 W3 n p1 c- qof the J***A design). Even though the memory is 'freed' on the heap," M. x0 A+ p: F8 a& X
* M: Z: B `' d y& c& @& Jit is not actually free to the OS, it is only free to the JVM. Here% C6 h9 U, Z- n, T
8 ^0 A, y+ d' ? H; Y m& n- m
is one way to think of it:) q# `8 y, [* m4 ]
: Q$ d% a. _; ~( I[MATLAB] ! o, `1 }7 D& `5 c9 h" M, `8 a- h0 w% K4 ~$ r/ `
[J***A] 5 m+ O I+ ^2 Z) }; n/ {7 v 7 {2 t7 w8 V' a& o[OS]# _! j3 v7 _. w: S9 ~
$ ]+ }& a3 L2 lMATLAB runs on J***A (virtual machine), and Java runs on the OS (physical6 G, g0 ?& B6 U$ ?5 z1 ^- ~
$ O# A" T3 c# v2 F: {6 W) D/ |0 s6 N& j
machine). So when MATLAB is running in J***A mode memory allocations . x7 m, r" F$ r# @. |: x + v1 ~* s9 `* d; ^, C3 _9 aare requested from the JRE, not the OS. 4 v; Q7 G+ V, Z1 B1 i$ K% U . D- E4 z3 Q7 t; K) g/ MOne problem you may be running into is that the default maximum J***A heap7 i. y: y0 i' O9 N. j9 }8 o$ n' `* F# b
; ~0 n1 [0 ^9 ^ ?
size is relatively low ( <= 64 M, so that is all the memory one session ; b0 j+ s& a7 h( ^1 H " Q2 B* w! I8 K# T+ |of MATLAB will ever get on your system. 7 ^+ P- ]6 q8 G* ^2 ]! Q6 B. c, K# ?7 r& ~4 x0 K+ r
The good news is that you can increase this value. You will need to create0 y' w1 J4 f' C1 X) }! G( n+ y3 N8 f Q
, e/ h5 Q1 w0 v* U" |9 F; Z' Va java.opts file in $MATLAB/bin/$ARCH (or in the current directory when - O( G' O& ^- Q" b& L+ d6 C' ?: e9 X7 z3 Y3 Z! G ] L
you + {9 w+ M6 c: |" S8 B# F/ o% g: e6 B/ O W" k# u7 s- c
start MATLA and put the following command: ! O0 r: Q# Z! [# j# O( I b' N& i4 D% x- P# f# D
%%%BEGIN CODE%%% 8 I' h3 M: e) B4 z 5 d( J% y! p! S6 d- n; BmaxHeapSize = 268435456, @. g9 ~$ q# m
3 y H& d" J) S
%%%END CODE%%%& w+ W& Z9 R: R) S
2 n( R9 h0 {4 v6 ^
This will give you 256MB of JVM memory and you can adjust the parameter" B+ Y/ [5 w* W! t! S. m
! D. |0 Y: b6 K% u; k/ pas needed.2 F& p' X) D: S4 c5 x
- Q* F3 O+ A) W7 ?- A, [Note: $MATLAB is the root directory and $ARCH is your system , [+ d3 M' g) k8 D7 t' I+ ~ 7 A3 M, r' R% Iarchitecture. This solution works on Windows as well as Solaris, Linux, . F# H& Y- R) S: ?2 B4 t5 m& B# R/ b1 A
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with# D9 Z5 y7 y! M$ `5 P+ N& r
* w9 u3 c1 C# M6 O/ y0 Za different syntax.0 c2 k, Y3 g+ h* d& I
8 y- y- ?# u6 w% d) ]4 oFor the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are: ) {3 e- m ^. n, w$ h' u o" r$ M0 L# T! }. [
minHeapSize = 16000000 5 O( F' p) r! P / r) X) [. }7 tmaxHeapSize = 64000000 + L z4 ^3 d: o! e2 n: \; u; W w' r9 g$ f: E/ Z5 C
These are the structure field names in that correspond to -ms and6 m; U c1 s. a. s4 s# u3 y
\1 W; J; ^8 m+ e& T$ b9 J. ~-mx, and the settings above are roughly 16MB and 64MB.% K" Z# `8 i: O0 I4 T
* o3 n, I) p" e: B$ t4 ~To investigate the Java heap a bit, ask via the following:" C& }3 m( M7 S" y& {) E: A
) `# R! U$ `; r$ y* R>> java.lang.Runtime.getRuntime.totalMemory & @& V& A' v6 P7 r 1 b5 h$ b8 i' }" `5 J0 j>> java.lang.Runtime.getRuntime.freeMemory) k. a% Z0 i1 y' y! Q7 f
0 w, S; X7 e( C3 u5 TWhen the free memory hits zero, Java will double the heap size (up to the # u. f. E+ B0 N( x% _' M a U, M3 a; i' d. \" U; J' x' f( D' `( Zmaximum setting).: N+ N3 K( f" ]" c% g- I
8 C# F3 W" E. t! h* p0 H
If you choose to run without Java, you will remove the overhead of the ( _$ y. V8 t2 c6 e4 `& r ` ! I& g) r7 a0 f6 zmiddle man, but you will also lose some MATLAB functionality (mostly 9 {: o4 N% n- K5 [# P; s# U2 q+ s, s / ?1 w+ t* u" Bgraphics and the Editor). You will still have most of the computational 2 d) a' }. W- k$ D8 O3 K 3 k: h. \' d; F1 ?7 \0 npower though.5 q* {9 R+ B6 q& U( E0 V, ~! q/ n
5 ?2 U6 M1 L# c6 C: c
Without J***A, memory management will come directly from the OS, and a' W. g6 A/ y* E$ c2 N
3 B/ \/ r, a% aCLEAR operation will result in memory being freed back to the OS. : F1 {' m# ^% P- f0 f0 l ! r4 K* s4 T! H ]+ x* C21)如何在Matlab中添加新的工具箱?) Z$ F9 ~, f, y- X$ Q
E9 t. o9 _) E0 c:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #/ m* n, |6 U( L% t/ q7 K* x) x
~1 J0 L' ]* D6 e5 V2 b如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。 / l5 b6 g7 `& }( J6 c1 M ; T% e, @' o! S7 c如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某 % `: p# e9 `/ R% C $ q" M* E0 j, C; O+ I1 {; c个目录,然后用addpath(对于多个目录的使用genpath())或者pathtool添, J) b* t5 }$ K4 e
9 b; f1 L8 T5 m加工具箱的路径,然后用which newtoolbox_command.m来检验是否可2 _- r5 c' l/ U3 V: A' G2 Q
/ N2 {, ]2 O) L6 o( G8 k7 ^3 p6 qnnz(A)返回A中非0元素的个数 ' I7 {' p! d; f& A2 B6 ~- H' ~& k! u0 q. D+ f
27)Matlab中如何中断运算? / m; c* G, A5 z3 S3 }0 s7 m4 ~. }" a$ |4 _$ I
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # ( M8 G# X- f* M* K ! c+ Y; L/ W- X1 T3 M. q在命令窗口按Ctrl+C,在UNIX/LINUX会立即中断运算,在Windows可& T. l! l# H$ n4 T; Y
2 r" Q9 z' c# Q; a. D能由于操作系统的原因,有时会出现死机和等待的情况。. Z! G1 G+ k$ k% } w
" K T- V3 Z# e4 X
28)Matlab中有没有画圆或椭圆的函数? , U+ ^4 q: {9 B' {& y/ T5 M, ]3 M0 N
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #1 C7 ?* O n# \) M, O
8 D4 s* f! q W, [' r& K没有,Matlab没有提供直接绘圆的图元函数,需要自己写代码,其实 r( T; Q6 B) n" j4 l* z
- M% u; @1 }& w6 W就两句:. k; }! C( i: m; _, t
$ E7 W8 { w- x3 j7 N0 @: ?
sita=0:pi/20:2*pi;7 D D: V( C4 F3 K