' M1 i1 k+ c; i由于图像技术得到了极大的重视和长足的发展,人们需要对它们进行综合研究和集成应用,由此出现了图像工程。图像工程的概念在1982年首先提出,当时主要包括有关图像的理论技术,对图像数据的分析管理以及各种应用。图像工程的内容非常丰富,根据抽象程度和研究方法等的不同,可分为图像处理、图像分析和图像理解三个层次。换句话说,图像工程是既有联系又有区别的图像处理、图像分析及图像理解三者的有机结合,另外还包括它们的工程应用。' }3 R. n' I9 Q8 [ e
9 k% S1 q9 K7 _$ ~其中imwrite(…,Param1,Val1,Param2,Val2…)可以让用户控制HDF、JPEG、TIFF等一些图像文件格式的输出特性。 V3 S& ~; i' R8 }% h - d m3 Z( k8 Q: a ]6 A% Y 在MATLAB中,默认的保存类型是uint8。由于PNG和TIFF格式支持16位的图像,所以保存这类图像时,保存类型就是uint16。 % l7 B3 P. B2 p" z" h. Y0 y 4 T0 V7 D0 b+ z2.2.4 图像的显示2 j' P& x$ {( \2 r+ q; w- B
0 Z7 i/ P, o$ ]# C2 |3 A+ O6 x1 ^# ^+ ~
显示图像的最基本的手段是使用image函数。该函数还产生了图像对象的句柄,并允许对对象的属性进行设置。此外,imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色图的方式显示。) y) C- I, L$ L: D
8 l; d3 \3 g( a8 s# ^+ r$ J! }! `imshow函数比image和imagesc更常用,它能自动设置句柄图像的各种属性。imshow可用于显示各类图像。对于每类图像,调用方法如下:7 @. F' M" G6 G6 O# k$ r+ x3 e- F
' z* p' |- S! ^. [
l imshow filename:显示图像文件。 5 B0 x$ `- h Q. n/ z 1 A% t* m- @/ X9 x" G4 ~l imshow(BW):显示二值图像,BW为黑白二值图像矩阵。 $ H9 p+ `, ^1 n9 L+ b; T" ^- @$ P7 q5 ?/ z8 ^
l imshow(X,map):显示索引图像,X为索引图像矩阵,map为色彩图示。% ]% q. i4 m3 {( `
0 o- J% L1 v5 y" G4 @& o' h# r- R
l imshow(I):显示灰度图像,I为二值图像矩阵。 3 N0 Z5 V$ a& f" u+ G) t ) m& @6 _* {7 N& \! {$ \l imshow(RGB):显示RGB图像,RGB为RGB图像矩阵。: w1 y+ c5 @+ d# y9 D7 p M
X' g9 A; W9 V* w: g/ C$ _l imshow(I,[low high]):将非图像数据显示为图像,这需要考虑数据是否超出了所显示类型的最大允许范围,其中[low high]用于定义待显示数据的范围。 ' @8 z: l- C" ^$ E) Z7 k ) H. M0 H0 g* Z1 |% j! O" D有关图像显示的函数或其辅助函数,除了上述的以外,MATLAB还提供了一些用于进行图像的特殊显示的函数。 ' C% ^% Z: b7 u( q. O3 W" V8 p+ f' v' t% {
l colorbar:为图像的显示增加一个颜色条,这一用法对于了解被显示图像的灰度级别特别有用。 + B; d+ w7 N. u) |: Z0 N. z( J: }9 R
l getimage:获取图像数据。1 S, _9 e# K F$ j: A
) x: @- r( g: W+ ~" Ml immovie:将多帧索引图像制作成连续图像格式。其调用格式为:8 J4 L2 _+ A+ W K0 m) U% C0 @
" q7 g5 H i; O# y5 \) R
mov = immovie(D,map) 7 Q+ ~ y7 |! s6 s4 C& c9 X, Y+ q9 e/ k' e" H
不过这种功能只对索引图像有效,其中D为多帧索引图像阵列,map为索引图像的对应色阶。对于其他类型图像,则需要首先将其转换为索引图像。 & F) ?! ^3 j$ A5 C r1 x . `( b& T4 o/ H4 u0 L% O7 L6 D7 _l montage:多帧图像的一次显示。它能将每一帧分别显示在一幅图像的不同区域,所有子区的图像都用同一个色彩条。% s3 A* Y3 M2 F, e9 ]
) s" s; i, R5 t X5 Dl movie:播放多帧连续图像。 5 u; N$ G+ x4 N @/ V7 w# ~ % U" i9 N4 r8 J: Gl subimage:在一个图形区域内显示多个图像。 1 ?4 g) [6 O" U5 N8 S0 R! J/ a* b0 t7 c4 A
l truesize:调整图像显示的尺寸。 ( W/ o. U( @( v `, s4 V) `& {5 K4 e% g" v
l warp:显示图像的纹理表面图。前面提到的图像显示手段都只能在二维平面上显示,MATLAB6.5的一个强大功能是能将平面图像显示在空间三维曲面上。这是由warp函数的纹理成图功能来实现的,该功能能通过双线性插值将平面图像投影到三维曲面上。! R7 i& h6 \9 g
2 A7 |$ D1 p7 W6 S- S9 [
l zoom:将图像或二维图形进行放大或缩小显示。zoom本身是是一个开关键,zoom on用于打开缩放模式,zoom off用于关闭该模式,zoom in用于放大局部图像,zoom out用于缩小图像。 3 w Z: n' v* A: H( ^1 |" g4 i9 j2 k! S$ z) T7 s5 X4 L; q! k
至于多个图像的显示,则可分为两个方面:在不同的图形窗口显示不同的图像,可以用figure指令来实现;在同一个图形窗口显示多图,可以用subplot来实现。 " k: m t+ \9 W2 N5 O7 a' U# y+ g" X% ]% A4 W
第三章 图像运算 * w) l' S7 o8 Y; Y Z$ T 5 E; b0 l3 u5 D6 Z3.1 图像的点运算$ b- Y4 e4 J0 K p
! ?3 i" y3 P# B# K0 @6 M7 Q
点运算将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的值决定。它常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。点运算因其作用性质,也被称为对比度增强、对比度拉伸或灰度变换。在真正进行图像处理之前,有时可以用点运算来克服图像数字化设备的局限性。2 s& N6 T- m% n+ g8 M
8 @. [+ a7 u8 G& ^4 ]' @! P; M
点运算实际上是灰度到灰度的映射过程。点运算不会改变图像内像素点之间的空间关系。设输入图像为A(x, y),输出图像为B(x, y),则点运算可表示为: 0 h4 F$ i: }7 k) k- @6 v* `7 a9 E % t4 l2 _, c6 u# `" S) HB(x, y) = f [A(x, y)] (3-1) # O3 P$ _+ M7 N" [: A& l6 [4 X9 I+ Q1 S3 w3 L
点运算可完全由灰度变换(gray-scale transformation)函数s=f (r)决定,后者描述了输入灰度级与输出灰度级之间的映射关系。图像的点运算分为线性点运算和非线性点运算两种。 # K6 w9 c2 Z) ]/ M+ a% h, p1 X/ [, M/ {5 L' D# N: J
3.1.1 线性点运算' B; M1 d" W7 {! o1 H- l
6 r* F. {: W% ^& m) n7 ~9 j线性点运算是指灰度变换函数f为线性函数时的运算。- c& r" p+ }( D9 a9 _
! Y; m" d' H3 C' D如图3.1,当a>1时,输出图像对比度增大;当a<1时,输出图像对比度降低;当a=1,b=0时,输出图像就是输入图像的简单复制;当a=1,b≠0时,仅使输出图像的灰度值上移或下移,其效果是使整个图像更亮或更暗。如果a为负值,暗区域将变亮,亮区域将变暗,点运算完成了图像求补。( o* ~: {+ f; r, Z
3 u/ T: a" q$ c7 R m1 ~$ g) Y# p除了调节对比度以外,还有一种典型的线性点运算的应用就是灰度标准化。设灰度图像为I[W][H],其中W表示图像宽度,H表示图像的高度,那么灰度图像的平均灰度和方 图3.1 线性函数' a G; H6 \: C
1 y, t2 I! V2 [ c2 t0 T7 ?差由如下计算公式得到:! [% n7 ^8 X5 S# l- _
) a/ Q; V& A7 ?9 q$ f& ^
平均灰度: % U# S( i, R* j* B6 I# ?! z7 @: k . p- E5 p8 W! \, K; L (3-2)1 ?; | X. i5 G8 ^7 y: C2 }/ {, {9 D
' u7 u( G# m8 l2 o
方差:0 ^7 U" ?6 A) A+ i
^# l0 a6 j" Y' U
(3-3)+ W( M" u" Y; C9 g0 c n+ p0 s
* s/ ~3 x2 X2 ?& K. n$ J e. E. x
可以将其变换为具有相同均值和方差的变换函数(线性映射),其形式如下:% N3 `- g* W0 \
9 A' r d! h. _& X, @9 z (3-4)8 t: l3 f$ [7 _
2 @$ _, k9 H8 y其中σ0和u 0为给定的变换参数。灰度标准化可以用来生成一些常用的平均模型。2 f' }: G9 z( v. L7 [1 V$ C) |9 x
( w; ~1 g6 ~' } H# g, g2 ^6 A' I
3.1.2 非线性点运算 {& N) u; |# c6 `- @' w5 H7 Z - S- a! N. \3 t$ j# p7 s非线性点运算对应于非线性映射函数,典型的映射包括平方函数、对数函数、截取函数(窗口函数)、域值函数、多值量化函数等。 - n! N5 c& i5 y8 w# R % l; [# ^- ~4 p0 N) g. Q9 P阈值化处理是最常用的一种非线性点运算,它的功能是选择一阈值,将图像二值化,然后使用生成的二进制图像进行图像分割及边缘跟踪等处理。4 `$ H/ b+ a% Z
- `; K2 V) w9 `9 }$ {
直方图均衡化也是一种非常常用的非线性点运算。它是指将一个已知灰度分布的图像使用某种非线性灰度变换函数进行计算,使运算结果变成一幅具有均匀灰度分布的新图像。经过直方图均衡化的点运算处理后,实际的直方图将呈现参差不齐的外形,这是由于灰度级的可能个数是限造成的。在一些灰度级处可能没有像素,在另外一些灰度级处则像素很拥挤。. S/ B w$ ?, ^+ a$ O( Z+ Y6 G: N6 P2 k
# f5 s! `/ ~1 q9 y( M$ {( ]
点运算的MATLAB实现:8 ^# J9 Z& C, ^# {& U0 @! b% l
3 q' F6 E% B8 e ?% F" E
I=imread('rice.png'); # _" B* J; s' v# m* a2 C4 r% j5 i* u" b8 u9 p
rice=double(I);: p" c1 L1 c4 q. L; h
2 K- R w h: \9 i) I( s) m
rice2=rice*0.5+50;* r# {0 O% A/ q1 P1 e/ E0 B) P1 U- [
( U1 i- Y$ n* f3 o. w- FJ=uint8(rice2);9 |2 G# p, p, U. s1 w0 R- |
+ d6 r+ U9 J+ u% [) B0 t. g0 x2 A) M3 f0 k8 U
2.1 几个基本术语 U e: ?& t8 y
6 T. g6 |7 O3 M
6 r$ X5 ~# ~5 A9 v8 j9 C X # x( E4 [3 f u 在运用MATLAB进行数字图像处理之前,我们必须明确几个基本术语:4 h/ c& W% g# E) m
5 w. _* n: N! m8 I; u1)位图:是根据图像的尺寸和分辨率创建和保存的图像,由扫描输入。 " P g5 l0 B4 T- X7 H1 P! J0 p # ?4 q8 O% R c- E8 ~2)矢量图:使用专用软件绘制的,以数学方程式的方式保存的图像,所以矢量图的清晰度与分辨率无关。/ p+ @0 n% k Z( o
( w& w3 L( w. Z" S4 k3 h
3)象素:是图像在计算机显示中的度量单位,可以变化,可大可小。8 z' I6 C+ i d S2 b# s
) G3 r9 _. t1 R1 d2 Y9 y4)分辨率:是用于度量图像在显示器中清晰程度的一个参数,分辨率越高,图像越清晰。分辨率是与象素相关的,即单位长度上的象素数就是分辨率。由此可知,分辨率越高,象素的几何尺寸就越小。2 H0 x; ^; o! ?- z" n# W
& O9 e4 p( P+ P, ?7 Y. m
5)图像文件的大小:指一幅图像在计算机中保存时所占用的磁盘空间,其大小与所用的颜色模式有关。灰度图像中的每一个灰度象素只占用一个字节(8位),RGB图像中红、绿、蓝各占用一个字节。另外,图像文件的大小也直接与其分辨率有关,原因是当分辨率增加时,一幅图像所包含的象素量急剧增加。2 k* M G$ V& a
* L0 p# N5 e( q
6)句柄:通俗地说就是对象的代号或标志,它能使计算机方便地从众多对象中找到所需要的对象并对之加以相应的操作。MATLAB中的句柄图形对象包括轴、文本、菜单、控制框、图像等。( A2 z" }0 h7 B3 a
3 U, v6 ~6 _ z# E! M. C2.2 MATLAB 图像文件格式简介 % B* D/ `, V/ j! w; y, m) e3 U' A. O
针对MATLAB的数字图像处理功能,我们讨论它可以处理的几种图像文件格式: : d0 a7 A/ X5 t& a. Z8 L5 {. R ( B: C/ Y/ f4 T+ J' U- M+ _. MA)PCX格式。可处理1、4、8、16、24位等图像数据。文件内容包括文件头 、图像数据、扩展调色板数据。. g% R- _$ O' K+ p+ f
1 {1 L/ U/ A8 x& L* X, Z4 @
B)BMP格式,即位图文件,整幅图可视为一个数字矩阵。它包括1、4、8、24位非压缩图像,8位RLE(行程编码)图像。文件内容包含文件头、位图信息数据块和图像数据。选择BMP格式保存一幅灰度模式图像时,可选择以Windows格式保存。而且在选中4位或8位位图时,还可选压缩(RLE)项,在用RLE方式压缩保存后图像将毫无损失。这是用得最广的图像格式之一,在本文中都对这种格式的图像进行操作。+ ~! ~5 F1 [) |5 @
6 u7 r1 |6 D2 D6 I! e5 _" {# _
C)HDF格式。有8位,24位光栅图像数据集。2 Y8 e/ |$ M; v1 X# g) C
! \1 S7 {4 I& _; iD)JPEG格式。是一种联合图像专家组的图像压缩格式,是目前所用对静止灰度或彩色图像的压缩标准。它实际上定义了3种编码系统: 8 Q2 A9 \# E+ g, r ) G3 t9 X( v; U+ ?a.基于DCT的有损编码基本系统,可用于绝大多数压缩场合; 6 B) p- P/ g; X: A' Q" U( E) U6 T" |0 W' w9 c: ?9 P9 f
b.用于高压缩比、高精度或渐进重建应用的扩展编码系统;+ Y3 Z N3 Y- D2 x7 X
" \; c! s) }) l2 i1 M. y
c.用于无失真应用场合的无损系统。JPEG没有规定文件格式、图像分辨率或所用的彩色空间模型,这使它就有可能适用于MATLAB。 6 L/ k# p# G' b3 t3 X( Y$ a0 r' q$ S4 Y# b
D)TIFF格式。处理1、4、8、24位非压缩图像,1、4、8、24位 packbit 压缩图像,1位CCITT压缩图像等。文件内容包括:文件头、参数指针表与参数域、参数数据表和图像数据四部分。它是一种用途广泛的文件格式,其特点是可移植性好,几乎所有的扫描仪及在Windows、Macintosh平台上常用的版面设计软件都支持TIFF文件格式。以这种格式保存的图像文件结构比较复杂,在不压缩存放时文件比较大。+ w* V/ z$ x' k9 _" _
- t8 D+ b0 g" t3 }
E)XWD格式。1、8位Zpixmaps, Xybitmaps, 1位XYPixmaps。( r; i8 [3 a* z6 d& g7 F
; w3 p; S, B: g* y8 d9 h$ H
F)TGA格式。处理1、4、8、16、24位非压缩图像和行程编码图像。文件包由5个固定长度字段和3个可变长度字段组成。1 Q3 E8 r7 s5 |% s. Y% T2 R
/ E9 f1 K2 q; ]: V$ b! s+ H3 V, w$ |* s
2.3 MATLAB图像文件类型 K/ m- n$ O B9 h6 x
; ?, _2 @* ~, N9 D) M 根据数据矩阵和图像象素点颜色的匹配关系,MATLAB中的图像可分为三类:索引图像、灰度图像和RGB图像。 + v( B# K# E( r * K5 G& v. F2 k, n1)索引图像:它的数据信息包括一个数据矩阵和一个双精度色图矩阵,它的数据矩阵中的值直接指定该点的颜色为色图矩阵中的某一种。色图矩阵中,每一行表示一种颜色,每行有三个数据,分别表示该种颜色中红、绿、蓝的比例情况,所有元素值都在[0,1]内。& l C. l; a8 e4 a7 w* s( [# C
$ D( T# Y$ s; n; b% X8 V: b
2)灰度图像:它的数据矩阵中的元素值一般都在[0,1]或[0,255]之间,灰度图像根据这些数据利用线性插值来和色图中的颜色种类匹配。 2 J$ K S3 B+ c# V6 w/ A' A4 v( Z
3)RGB图像:图像中每个象素的颜色用三个数据来存储,分别指定红、绿、蓝三原色在象素颜色中的比例关系,组成一个三维数组。 * p w% F6 A, t( X$ K+ V! W' U4 c) e+ k
2.4 MATLAB中图像的存储运算和显示方式 " z0 B2 | X9 h- S% a 9 R' M) S2 K% E& u5 L' f, y . D2 r3 H3 p7 o; @& {% z3 W4 L+ A9 c) v: ]1 h" s
在MATLAB中,数值一般都采用double型(64位)存储和运算,为了节省存储空间,MATLAB为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称为8位型像。函数image能够直接显示8位图像,但8位型数据和double型数据在image中意义不一样,对于索引图像,数据矩阵中的值指定该像素的颜色种类在色图矩阵中的行数。当数据矩阵中的值为0时,表示用色图矩阵中第一行表示的颜色绘制;当数据矩阵中的值为1时,表示用色图矩阵中的第二行表示的颜色绘制该像素,数据与色图矩阵中的行数总是相差1。所以,索引图像double型和uint8型在显示方法上没有什么不同,只是8位数据矩阵的值和颜色种类之间有一个偏差1。调用格式均为image(x); colormap(map);对于灰度图像,uint8表示范围[0,255],double型表示范围[0,1]。可见,double型和uint8型灰度图像不一样,二者转换格式为:% E1 [. S8 r0 t! {
0 I- E+ G5 F. _ _2 Q; n- ?
I8=uint8 (round (I64*255));: X# s8 D. ]9 c3 E" t# ~/ e
% J" C2 H* _, N& o" R. {
I64=double (I8)/255;; C/ A' J' D* ]# g& {
5 V4 O7 y( ^% O; {
反之,imread根据文件中的图像种类作不同的处理。当文件中的图像为灰度图像时,imread把图像存入一个8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个8位RGB矩阵中。 & P& Z0 l3 M5 u! E, \ ! |2 y/ s* C' K% @0 n$ E 本软件的处理统一针对BMP格式的灰度图。在编程时图像读入与输出均要求转换为uint8型,中间运算处理过程则要用double型。 # x) M) A. e2 R0 F$ g6 @) [" ~+ U$ V3 z% n
2.5 从零开始学用MATLAB5 E X; ^ w: F1 \( o1 j( n
9 l: s- r8 T5 t! ~
1 |9 Q5 H9 {" d/ k8 l/ Z) \" ?- K6 y7 m* j1 Q& @! r! ^6 p, H& J. W
MATLAB对于我来说是一门全新的语言,一般在编辑框中编程存盘后在命令框内运行,在Figure框中显示图像。在用它作数字图像处理的过程中,最常碰到的问题有: ' U& i L+ ^( Z6 r$ C, y- k" ^. W# E
① 图像读入 imread (‘文件名.格式’,’格式’),必须是上文提过的MATLAB支持的7种格式之一,而用Photoshop制作的PSD图像保存了所有通道和图层的信息,不能直接用MATLAB来处理。显示图像用imshow (h) 语句,h 为图像句柄;在一幅图片中显示子图用subplot规定子图的位置和大小,用subimage(h)输出子图。输出图像若需要永久保存,则可用imwrite (h,map, ’filename.bmp’,’bmp’), 写入存储器。注意在该语句前要设置调色板,即map=(gray(256))。7 @9 r8 Y. u0 Q- w
6 v' Y) g( {& t
② 结构化程序语句写法不同于C语言。比如if, for 之后要用end 表示这一块结束。有关条件的语句都不用加括号,而用冒号来表示递增,如9 v: b+ B6 ^3 u9 u$ L- n+ }
. G% k: ^0 v5 Y; J$ o( L
for i=1:3:10 ) r2 y; z: {5 {$ f \# n( D/ l; I1 Y0 L, [
表示 i从1以步长3递增到10,即做三次循环。 6 O, b8 Y' l# I) y: m7 ? ] ( E- o7 y+ e e' V③ 要注意图像格式的转化。须知不同的图像格式对应不同的处理方式,如果处理与格式不符,将引起错误。比如范例中的图片lena256.bmp表现为灰度图,但其实质仍为RGB图像。如果不用语句rgb2gray将其转化为256级灰度图,经变换后图像会变红或变蓝。0 G& | v/ M. ~. N
. K" P4 @* v- Y. Z' `& R
④ 数组的定义方式与C语言不同。由于C语言中含N个元素的一维数组A的下标从0到N-1,数组定义为A[N];同样的数组,MATLAB规定的下标是从1到N,所以不能再用A[N]来表示数组,只能用它表示数组的第N个元素。赋值时用A代表数组。 ! q% ~3 ]5 Y ~7 q* Z# Q% x4 n. V5 H& X' n! |
⑤ 由于在本演示软件中,涉及较多点运算,所以运行速度较慢。等待时未知其是否顺利运行。这时最好在最外层循环加上计数标志,即变量名,这样对程序运行的影响不大,却可以知道程序的运行情况,有助于查错。但如果在内层循环加标志的话,将大大减慢运行速度。 # D9 k x5 Y; N3 U4 ` , Q+ m7 C; N: e! F T. f⑥ 尽管MATLAB允许未定义使用数组,但在实际应用中这样经常出错,特别是遇到在double和uint8型之间的转换时。所以最好还是养成用前定义的习惯,避免出现不必要的错误。 / p% g. t2 Q$ @$ a" [2 }2 J. R6 s$ q
⑦ 在做完一定量的运算后,一般要用Clear清除内存变量,以防影响后面的程序运行。 7 L6 \) M1 f3 I) ~$ x) w# D( { ! n- E7 X# h+ i. ? # X3 y! m' U% [9 {' x9 x D
6 f/ H% J$ s8 j, O0 ]6 w l+ J. omatlab调试工具 6 B# E: _8 H ^4 F5 K* `9 w9 [( B5 h& U . T2 n$ p0 \/ S4 F) L0 h/ `2007-05-31 09:32 ! _: _9 X. A+ j' e- V+ I, e- l3 V& b5 U( V
在开发函数M文件过程中,不可避免地出现错误,即故障。MATLAB提供了很多函数和方法,帮助调试函数。; C& i; P8 i. n( j- U! W+ h
0 F' P4 Z; ^6 x# n+ Z
在MATLAB表达式中,有两类错误:语法错误和运行错误。当MATLAB计算一个表达式的值或一个函数被编译到内存时会发现语法错误。一旦发现语法错误,MATLAB立即标志这些错误,并提供有关所遇到的错误类型,以及发生错误处M文件的行数。给定这些反馈信息,就很容易纠正这些错误。 # k, N/ ?" x7 U3 C- h# G $ B; v" c( A6 L# {5 z而另一方面,即使MATLAB标志了运行错误,但找出错误一般比较困难。当发现运行错误时,MATLAB把控制权返回给命令窗口和MATLAB的工作空间。失去了对发生错误的函数空间的访问权,因此,用户不能询问函数工作空间中的内容排除问题。 2 J+ x6 [3 Y/ d# X / E3 ^- M4 M: @+ m# c/ c ^$ Z根据作者的经验,当一些操作结果导致空矩阵或NaNs时,最容易发生运行错误。所有有关NaNs的操作都返回NaNs值。因此,如果有可能出现NaNs结果,则当出现NaNs时,最好运用逻辑函数isnan来执行一些缺省操作。因为空矩阵为零维,所以对空矩阵寻址常常导致错误。函数find表示了可产生空矩阵结果的一般情况。如果函数find的空矩阵输出用于索引其它数组,所返回的值也将是空的。这样,空矩阵具有传播性质。例如: , j! R3 T3 {- o3 |7 [8 i6 d8 ?1 j. I3 S+ n/ j
>>x=pi*(1 : 4) % example data( `6 B9 a4 \6 x; }
% H/ W) ^/ F' c/ r# X* F: s+ u
>>i=find(x>20) % use find function 8 I2 N' i/ P" S) A/ k9 u `% _& ^2 S3 v+ J' x
>>y=2*x(i) % propagate the empty matrix- n& P, {" Y3 o! G& X6 ]& [
, z: V. w3 r8 _, p% ] o实例程序: 9 P2 s5 Z: R& q1 x * e" o9 q( s1 d6 Mfunction Jpeg0 J( A3 ~6 g9 A' ^+ G4 V% a
; i* b; u1 V: U! KI=imread('D:\MATLAB7\toolbox\images\imdemos\cameraman.tif'); 5 q) i% d. T' Y! C; x0 F$ v # a' V# ?0 z3 Q, m8 G%该图片在安装matlab的目录中找,原图为灰度图象 ; X/ Y# K- U. ^7 r X8 d9 v4 \7 }2 T Q1 ]* f! M) D
I=im2double(I);%图像存储类型转换! M; X# p# Y5 R+ @
1 |$ L- g A& rT=dctmtx(8);%离散余弦变换矩阵 ( K$ P/ G, N& p* p. A: m; t, W* W, A4 `2 x6 k& I' B2 B
B=blkproc(I,[8 8],'P1*x*P2',T,T');% f3 t; N T% [) h
' _' j. V, O7 g) e+ J8 @0 | h& _
%对原图像进行DCT变换 9 a/ U9 P9 Z7 U- {& }( t) k7 @ / e9 W& f3 m! y, xmask=[1 1 1 1 0 0 0 0- |. L- ~) M) T( ?2 `/ j! c
* a! z+ @# v, o+ s5 F7 t
1 1 1 0 0 0 0 0 ! X% V) T7 f# v/ B5 L; d. @! J) v) h# u7 L$ ]3 V
1 1 0 0 0 0 0 0 % f3 p( p: h6 ?2 X7 _ 0 h& d$ F' x/ A3 c P, b8 w 1 0 0 0 0 0 0 0# v( R& W# t8 I
) k2 t* f! _$ n+ _
0 0 0 0 0 0 0 0 , K7 B- ?5 J. _) A2 S . V. P- V6 Y8 w; f0 x 0 0 0 0 0 0 0 0 ; B4 W9 ?. l* s$ k/ \ # G" C9 N5 Y+ l" w' u& X 0 0 0 0 0 0 0 0 2 r% B8 ?( _/ @2 S+ r# o" o & v; ^" Z9 n- H5 v* M. k. H 0 0 0 0 0 0 0 0];* U3 _8 \. r; j& e# D3 U0 Z# W
, I2 N$ K- X6 i+ L w( a$ yB2=blkproc(B,[8 8],'P1.*x',mask); : p' A4 H8 i) c% `6 E! s7 ` + A3 ?- k4 W+ d) e! w, U* o" M+ N! I%数据压缩,丢弃右下角高频数据 : C" ^/ z4 l# _0 T* X) \4 C" u/ h1 t
I2=blkproc(B2,[8 8],'P1*x*P2',T',T); 2 m+ V" y5 k6 p! G" r! Q; a$ E: s( [) ^- L& h/ I ]0 W
%进行DCT反变换,得到压缩后的图像 0 J0 F) U7 Z8 o/ C d " Y q" x2 W- A; d' yimshow(I)4 _9 p8 g9 X2 j/ }
1 y+ e. r/ \' C! V
title('原始图像')4 ?& Z- |* W7 }. t. n3 P
I3 H3 u9 j* H3 X: B& G+ l
figure;7 a+ }5 s& O9 ~) ?" y
: o9 N% m2 Y3 ^7 ^- e8 Bimshow(I2) - A9 m1 f! l9 j! u7 i: }! m - `- ?" O, E8 U4 }; ]title('压缩后的图像') 2 x* t* h# t }: r, Q+ W D6 {9 C ], L! i. {5 D4 G! {应用到的函数: ' Z: t# _) v9 N: u( q8 _* p2 v. j( Z , J; ]" b/ T+ m7 c2 p( [; ]I=imread('图像文件名') :读取图像数据,保存在矩阵I中; 2 q6 ?2 V0 c) d O3 b 6 V9 u) d" m; himshow(I) :显示灰度图像I,其他用法见matlab帮助; 8 p* r4 k9 c" Q" ^+ ?6 G8 d3 }) O$ v# U( a1 ^$ L! ~
I2=im2double(I1) :把图像数组I1转换成double精度类型; 0 ?" H! |$ N9 u2 |( ?* g" r1 M* U+ x, [3 e- Y
D=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。 0 j: [# L5 I! r/ r) p8 k8 M9 f- Z& c q2 ^8 c4 W
一个n*n的变换矩阵T被定义成:! A' U, Z2 W }$ q0 K
) |: C4 n* o8 P1 W6 p
Tpq=1/sqrt(n) 6 [8 }( W6 e9 m/ X$ ~$ x0 @) a; o9 u& h: G) _7 D& o4 d
,当p=0,0<=q<=M-1;# J4 [8 u' b+ U, f7 ?5 K) p
& m( r! p# d! N8 T6 s7 A
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n] / R( k% H* [ J* Y- V1 J1 h1 R
; v+ k& C; \7 g( p
,当1<=p<=M-1,0<=q<=M-1。6 w1 o! ?1 ~: L( ^; [; [
+ M. s4 c! c* GB=blkproc(A,[m n],fun,P1,P2...) :块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。 ) I' C7 S, n& E6 w$ I C) k8 V7 w- E G; T b! g$ A# y' g; f
figure:强制生成一个新的个绘图窗口;1 Y; b4 }. O) ]2 D! _: M/ \! n
7 j7 E& M% ^" I1 r; \
非线性方程求解9 I& U% ? Z$ w6 \
' l; f0 I& {. u8 A' n4 Dfsolve(fun,x0,options) 6 d# O$ W. Q5 L+ H0 P/ K' i. h" J" G9 {: `/ I9 }2 b1 R+ @
其中fun为待解方程或方程组的文件名; + q4 M1 P: g+ t" _; } . u; N* |/ x& M0 a( ]) ox0位求解方程的初始向量或矩阵; 8 R' T2 R1 E1 D5 p' u 7 f! x( p! R) ], I g, W5 {( K7 V `4 doption为设置命令参数 \. u$ U; J+ t7 {% P& P) _# ?$ q% \+ E
建立文件fun.m: 7 D( N- K0 n2 q' O b7 _3 K6 e; M+ q( N- s6 K" O* s
function y=fun(x) % e4 ?% Y8 I0 P C+ u$ V7 p h1 k' z. o; V0 u: S
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...) I" H; e+ T! S# D; `* P
j7 L3 ^/ P# R2 F/ m8 O4 l
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; 0 k) k7 J& _1 N) a$ r Z* J. _# c' |8 Y j3 Q- B. M! |2 W5 v4 t; N
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) ! \) [8 t: c) H( j, w $ Z; [/ w0 ?* @2 L; ]注:" Q. _) ?2 Y6 |8 P5 m6 z* j8 F. m
, K! ?1 |& w9 K2 }...为续行符4 @$ f; a3 W: d" R
6 V, W, B3 w# ~! }6 x+ Bm文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。/ `4 Q. u$ s. a$ Y$ F( c
: V/ T! L+ E- `1 P. ~: U
不定积分与定积分7 E' b8 B6 _( Y1 |3 t# [$ }
. F2 P. ^8 @. \& J不定积分:int(fun,var) # X% x: e7 |& \) u' ?1 G6 N; Z( q+ S" |3 @/ b
例:求∫sinaxsinbxsincxdx1 B$ }3 S+ V$ U* I- e. N" I
4 r6 t7 K: M; |: r, esyms a b c x 0 ?* R( r" _# e. s: A: y. f" P; t. ^ D I' z1 ^, F
y=sin(a*x)*sin(b*x)*sin(c*x);% {4 @8 f% r) L: m0 }) V
) W. k2 p9 z. G x0 X
int(y,x);% w9 K+ f! h. ^4 ]' Z7 j/ f
! s2 K2 n0 ]! K+ b! K7 ]pretty(ans) 8 R. ]- A B# D* c% B 1 m0 a; p0 G0 g0 ~' }定积分:int(fun,var,a,b) & b E2 v/ g, B6 I 1 Z& m5 t( F* x) A+ l& ~其中a,b分别为上下限! _# ]7 `$ B1 [+ K4 }9 Z
3 f9 w8 y1 I W8 ~
求解线形方程! |! ]8 k& _. b: C! u- j
t; U! L g: v11).Matlab中如何注解一大段代码?4 i3 _) Q, ]; L7 f) S& f
9 l! x1 a; q; b# z) w5 h( i1 s. Q12).Matlab中如何计算程序运行的时间? 3 i8 U; X2 X, D( o ' T6 @7 w: y1 l5 |13).Matlab中如何改变默认的工作路径? . G% X8 ]( n' b8 x - w! D9 Z3 _- i) j; P14).Matlab如何改变默认的图形字体? 0 N. Q- f# z9 `+ I4 P6 h |3 P4 d7 d0 ~' v; e' ]15).如何在Matlab中实现交互操作? L) d; D7 f: U8 z4 G' H; W ! f K& ^3 w& s- {& ~" G16).Matlab中为什么只能在小数点后显示四位? 4 j3 W" L$ R' J9 I, c& E b! O5 ^" n F9 L& A
17).Matlab如何在命令窗口按照格式输出? ) l- t( {# ~' x " U. A0 C6 _- f/ X4 |, g# y18).如何在Matlab中画隐函数曲线? 3 |& n0 M7 G9 u) v/ C. P8 B- J/ w! A & J2 }# r2 ]# F19).Matlab中什么函数可以删除矩阵的某一行或列?/ M: u; L! \' m. l- s2 B( A
7 K+ b& h& h' m" z) E$ e
20).Matlab中能开的最大数组是由什么决定的? ( M/ x9 z) H( e$ |. o/ w0 N$ ?( i0 h1 f
21).如何在Matlab中添加新的工具箱? ; s. W. c2 D+ T: O/ ]7 H# \! k$ }1 l) H
22).如何读写Matlab的.mat文件?, X9 G3 o2 u3 e* M" L" c/ X
& E6 h$ G2 z: u+ o' \( L2 i
23).如何得到contour线上的坐标点?( P2 U. t8 B6 K K
/ ` C- {' s' t) j: A$ ], h: y$ {
24).如何将Matlab绘制的三维网格图帖到word里? $ v' t0 t3 ]7 k3 X- k$ \0 `" n& U+ N9 G5 k8 o; S6 G$ d, D' \
25).请问可以查看Matlab中函数的源代码吗? 6 {- L% R: J R" V0 I, j ( y. W& r, S- M i1 N6 B26).Matlab有没有求矩阵行数/列数/维数的函数?2 w0 _% ^3 G3 E, }$ ^$ G. R
2 f" s1 V8 K" |* H$ |) t5 N, G27).Matlab中如何中断运算? 5 ]! q$ x9 e: t. F0 G# C # ^0 T K2 J5 ~; j, n" @28).Matlab中有没有画圆或椭圆的函数? $ i* E2 Y! w, i8 G( `7 o; T8 o6 ^ ~1 {* N
29).Matlab下如何定义整形' P# ^ v' Y5 K+ I5 Z3 k
; d+ `0 ]9 D5 g' h z& f" j* Y. C
30).Matlab如何产生均匀分布的白噪声? % j7 O6 p, I/ m2 {3 f% I+ P7 c0 C
31).在Matlab中debug的时候能否跟踪变量的?, ~: w! h5 B5 q3 F: _
% f- z3 d$ x+ Z9 F. `32).请问在Matlab中怎样输入特殊符号啊或者上标、下标?4 \7 f; e! p$ z: K! d9 M
5 ~5 [; S f# F, u
33).Matlab中如何后台运行一个DOS程序?2 B% D e3 f0 N+ e" Q) l7 O% B2 N/ P
1 q# X" o6 w2 \, I
34).Matlab如何加载输入文件(批处理模式). ? " ~$ f' _" }# A* q$ C& F , ~1 H( @: W9 t7 L# n8 ]35).Matlab如何启动时执行规定的文件?9 L4 u! \9 A* |" K8 e. x
* J; E; |( l' L& B
36).如何在Matlab GUI中使用图形背景?" z/ {5 G& o0 K9 h1 a8 D. W
% Y4 Y- {* B8 h37).大量数据点Matlab绘图为什么很慢? 5 z, z0 Y! n3 q / @8 z% K4 F; l- d, _38).Matlab中如何求解广义积分?即积分限到有无穷的或者有歧 3 s# Q# r* X, f & z, [& x% y4 o3 m8 q异点的积分(瑕积分)?4 A! p/ |! E1 C* C# q( U9 s
- h) t6 ?8 y2 L
39).为什么我的Matlab程序这么慢?/ X5 | c2 x. x8 x' ]3 A
; ?5 k; t6 _/ g2 e X9 I
40).Matlab中如何作线性拟合/线性回归/多元线性回归? * }9 T3 G) |0 A' d2 z4 ]( S+ M" z0 q+ ?; L( L
>*****************************************************************************< - \0 Y5 Z+ |- U2 \ ]* n0 k' I% j* A0 S4 A* l) a4 B; i
Matlab的常见问题+ n) r7 W( V- `6 l
* ^/ o" ?/ H, \% g+ U8 K
>*****************************************************************************< + o$ P8 I; ]* }6 \8 J; Z" N! a% R& [8 q' }# o8 d
=================================== 1 r+ _" I& j& R$ g# G3 a& h" O% k
1)Matlab 6.X在Windows 2000/XP上无法启动' i6 C8 C7 x& v k6 \5 @' t+ @( u
* m) p) d. R- [/ o' |$ R: ~:#highsun,2001/3/2, SMTH/NewSoftware # 8 E. e7 _2 V a. X8 K; L 1 [- c2 Y" r- b/ [其实也出来很久了,不知大家有没有注意到.5 y& o# W4 I6 p; ^& T/ R
+ w/ |. ?! l! P0 P. p) u3 \This problem is caused by a bug in one of the font properties files we ship) A0 g" r! s4 o. @6 T
N z {1 c5 y Xwith MATLAB. The font.properties file is used by Java to map the standard' `6 [$ x8 n! C! k6 I& T
# E/ H8 H& G4 ?: ~0 @Java font names to system fonts for a particular language operating system.% H9 q: @- D7 |0 y( z
2 o1 [3 k7 u; u0 w9 x% g! r) u8 V! Y
However, we made a few assumptions that do not hold for the Hebrew or # q& c, W( ^' G, y+ k5 X3 ?8 G# J2 v) s' n8 t9 x2 E; R
Traditional Chinese Windows, causing this problem.! ?4 X; q! U% r, I8 d% `( s
. U$ d8 K$ n; `4 Q# {& IWe have created a fixed version of the mwt.jar file that you can use to ( B7 v+ p, Y. A ~6 G ) b, a% ~7 x1 l1 gcorrect this. To use the fix, first rename your mwt.jar file as mwt.old.- y& T' b% j9 |- K$ \* z1 o$ M$ l7 E
* z- d+ K; Z3 S, j4 {& o
This file is found in the $MATLAB\java\jar directory, where $MATLAB is your * E% Y! Z+ w8 i. K; W& C0 v& `( w( q U3 I; Q8 G
MATLAB root directory. Then download the newer mwt.jar file from:9 N1 u1 O, Z& D+ D) J
0 w8 `3 B$ A( I, `. [4 ] ftp://ftp.mathworks.com/pub/tech-support/solutions/s26990% O' O9 g1 u- m. O( ~
8 I+ b- \6 L. u
and place it in your $MATLAB\java\jar directrory. Then restart MATLAB; 6 ~7 E" c6 v/ U; B' x D 4 U4 f# }# C5 f" k4 y: xthis should correct the problem you're seeing.3 R# @0 V9 j1 m
, U$ P- t# a" |- H9 O6 G
2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图?( N5 P) g5 b" C% y8 Q0 Y! f% S1 @ D
) n+ p! B2 z6 z8 Y:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools # Q5 U* Q. j! G2 {) Z
2 T6 ]: t: P, e7 W% Q1 Q& x% r
参见第一节问题7) 2 @) z3 h1 A& G9 T+ S1 K 0 l# ]: ~2 Z5 S$ z. `5 D3)如何在给定句柄的axis里绘图?" v$ g4 ?) H1 d4 j/ d( {. c4 I7 H
( s+ q9 X/ |6 v
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # % M, q2 _' y& Y, M $ d( U! @% j% `8 G6 Z+ tplot(data,'parent',haxis); 5 S- o( \. o! e) }: U7 ^0 p! a/ M _4 a# M) W# p1 _
或者7 ? ^5 u; y! y+ g: _7 w
& H" {4 N. M# b a2 z% ?0 w
hbar=bar(data);$ r/ ^, I! B5 j
: L' n/ H; K( j) S3 l: J( t
set(hbar,'parent',haxis);' x1 z1 s4 w0 \+ a# S
4 K2 _) s9 I& q) Q* g2 l, N/ C: h4)由Matlab符号运算得到的公式怎么才能将数据代进去运算?& M U- {: L. j
: o4 k0 V2 e9 _2 D: K:#ramjet (德芙)2002/3/3, SMTH/MathTools # 3 k/ J4 e4 A& }: s2 R( i" @. k% R( E; a/ x* }% B
使用subs(),或先将值赋予一个符号变量,然后用eval() 5 K4 A6 [3 a: X8 T) w, G- L( P % c3 R2 C& m) g9 n5)在Matlab中如何求最值点?如何求一维数组的极值? - I" C" U: q3 o/ o9 _+ K7 Q7 k* A# c , v- v. j. E" O" E:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/18, SMTH/MathTools# 0 H" R4 m5 N! ]- R7 C$ [# k: s3 n, y: n* y* J p0 v
最值: . ~3 p0 \& D) j$ O7 z ; q/ d$ H |) G- f% E. Z一维或多维数组最值用max(data(): k6 o0 _ L5 f
. p, K" \1 X+ n! |+ N, F! k如果想返回最值所在的位置,用[Y,I]=max(data) ! O. Q; J9 V; Q* l 1 g& `; n& t; Z$ C4 u4 O:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2001/4/21,UESTC/Math#0 ~; W2 H! w6 r. Q9 W
9 S# j4 t/ V+ G# S8 ]
极值: , E9 e# t9 n& _3 V. m! w& B2 ?6 i5 H* W
data是你的数据, g- z: l* Q$ ~) [$ [. n
6 e. {, ~* Q: Z4 [8 D8 O9 |, z
find(diff(sign(diff(data)))==-2)+1 6 _' [9 }3 k( [9 C: ^ r1 {. f+ b7 d
找到极大值的位置) [# J) R& u* t* U. k6 j- K
0 f( Z9 n h$ }5 c+ F8 u; H
find(diff(sign(diff(data)))==2)+1 7 K) g5 U- x; O" _+ x $ H( }/ z3 K' O8 p+ b' g9 I- v找到极小值的位置" B8 c( ^$ _$ l
9 v s& c9 U/ c- b! d; ]data(find(diff(sign(diff(data)))==-2)+1)和 $ v' V3 B" c5 s+ `# }1 x: h7 C8 Q8 w6 G, V, n, x1 K" Z
data(find(diff(sign(diff(data)))==2)+1)9 Q! J. F( Q, u% S) p
& q+ d, s" j! l+ N! F返回的是极大值和极小值& j! h/ e/ R0 A
1 p; [$ t& O+ w8 z( M8 }6)Matlab中如何作线性拟合/线性回归/多元线性回归?: O1 V- `. ]1 e; B$ f) L
# L/ B$ N3 D! i- b
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #& o0 a: f% b& \
6 n n- H: A. w, t! q) A ^) |- P
即用y=a*x+b来拟合一组数据{{x1,y1},{x2,y2}…{xn,yn}} . z/ }7 A6 g; M3 f% B' q 9 Y8 D0 f( F* m; K R9 |, l; imatlab中使用polyfit , c$ M5 T' F0 d5 c 9 r0 j% W# g2 H4 Jx=data(:,1);5 z$ X# y) A4 V
b; N9 I, l4 H7 _" T' t3 ^4 m* X5 G|x1n,x2n,…xmn|8 t2 L$ h0 L7 N. w) m$ n2 R
: ^3 M, m y0 Y* x8 q
Y={y1,y2,y3,…,yn}' # @, }1 e: j/ x, O9 i9 `3 Q( G/ p3 q& i( E6 _& a0 `
则系数{a1,a2,…,am}'=pinv(A)*Y $ ^6 q4 W5 Q& {: V" a ]$ y: v1 ?, ^- ~
在matlab中使用0 @( l0 x& g$ m7 ~
( W0 Z+ `3 l3 C
coeff=A\Y ! w4 h: a: S2 t0 w" {( ^2 k % X" H0 q8 d+ q U, L9 o1 x则可以得到最小二乘意义上的拟合系数; D7 `$ J$ z" E- x( e4 g
6 X" D( N% u+ x* ?/ [7)Matlab中如何作圆回归? ) @# y7 K' Y4 A+ g+ N. d% C, G3 I2 e% \2 ~9 h
:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab# ! \- t+ Q7 j8 f3 I& E! k7 u * K% B1 w& L( p* Y& P& _' u \Q5.5: How can I fit a circle to a set of XY data?% }* M4 o+ E+ k. o) G# h2 B+ L# T( A
, g! Z$ ]4 T: ]7 N2 h
=================================================% u) C6 K( w/ M1 d
S' s1 W. g1 }6 Q7 ?5 ]An elegant chunk of code to perform least-squares circle fitting was 3 y$ z8 L- r5 a3 B5 [% C- N5 t( E9 G4 h6 u* B5 r0 F2 y
written by Bucher Izhak and has been floating around the newgroup for $ J* X, _" N3 E/ n. s- m) P% g7 G+ c- ?& m+ Z0 j* d; I$ s' g6 a* P
some time. The first reference to it that I can find is in:% B% _, x$ @4 n0 {
g8 P n n, m- j* V:#misc,2002/6/21, SMTH/MathTools #. O" p" F( |+ y: V( j! f
5 i' {( T. o4 p/ L) S
tic + M3 T) X+ [0 n & v# j3 ~8 S \% j# eyour_code; / f+ W. g% X X6 s9 F + D a' v& K$ x' r( I# wtoc / _1 g3 B' a! G0 B0 s % L! G: X9 D' F或者使用: u, O. C7 }, M, u- I
8 G$ K* r: U9 x# O+ P编辑一个startup.m文件,其中$ x3 L7 _' U7 p/ }" E# G- d
[1 h x7 O# ?! i) m+ n
set(0,'DefaultObjectnamePropertyName',value) 2 ?. p3 U- f- H! u) R" h6 ]0 ^" X9 `
或者在X:\matlab\toolbox\local\matlabrc.m的最后添加3 H' d6 s2 Y% R) U" `, n. ~* A. |9 i
6 n! z3 |. P. I. Y
set(0,'DefaultObjectnamePropertyName',value) , ~8 l) _; ^) }& }- p : Q- H6 } Q% Q' m$ i15)如何在Matlab中实现交互操作? 6 m4 I7 H& y) e/ t7 d; P" s9 x( V6 y
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # }; T3 f% m5 l+ [. p4 o
% y% N- u3 J4 y5 r. N( D6 }6 \" U如果只在命令窗口进行交互操作,请参见demo中的例子,主要是 & Z" O2 H1 k* ^+ \* o / D8 U( c' a1 S( @) S) c% h( j通过input命令和pause/clear/disp等实现的,还有一些窗口资源可以使 # c' g' r: e3 Y7 M6 \* d; e& a3 N0 `, Z! ^9 o
用:" [. H9 n$ e) m
/ N4 v1 u/ v# V3 q( Z5 `
uigetfile,uiputfile,uiwait,uisetcolor,uisetfont, uiopen,uisave 4 k( l. ~7 G) K0 \7 g9 U3 b) i5 m& \1 k$ m; H% Y
inputdlg,msgbox,helpdlg,questdlg,warndlg,errordlg $ K* q* G1 d y2 ], l8 r 8 }1 }! T) B- `0 N% `4 f! G7 J6 x16)Matlab中为什么只能在小数点后显示四位? 8 a0 y& s- Q* ?% n5 S, a * T! G+ H$ Y" S) |3 M4 j. }9 z6 f8 l:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # # c% z: w z0 t& G! l : K. J5 g; I1 J; h用format命令来改变命令窗口数字的显示格式和精度,但不会影 7 t( h; t" l6 B3 J * \. P, D; Z% t响matlab的计算精度,matlab的矩阵运算默认都是双精度浮点型运算。" h& R. P3 i. J& Q
3 i# J2 T8 H& m2 n" a4 _17)Matlab如何在命令窗口按照格式输出? + T3 @3 k9 z h) F' I d1 L# Z$ Y" f+ u0 b9 i2 B
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,SMTHTools #$ x. q' K5 O, D
+ ~% D+ z" v' G9 \* xfprintf(1,"your_format_string",var1,var2,…);" P# O3 a& X; l( ~! s( M8 _
, _; S5 N. Z, _0 @
18)如何在Matlab中画隐函数曲线? $ _% \) d S0 s% [: v' h: o/ ~+ z: v9 P5 S6 |5 F. k( z
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # ; k- H. }" v: R+ {' K) P ) P. l! y& k( Q3 p4 e6 f4 m, M在http://www.mathworks.com/matlabcentral/fileexchange/index.jsp0 B& ]4 \& _6 ~3 s$ i) P y& s
1 ]4 j4 X' p5 EA(j,=[]; %删除A的第j行 8 R6 \. l$ f/ M3 s0 w. L7 W$ |" a4 S i$ f
A(:,i)=[]; %删除A的第i列 - w9 c* N1 e) `8 G7 \$ S$ a! o" m $ n$ x" w4 p6 m20)Matlab中能开的最大数组是由什么决定的?4 [( ]' N2 z( _, _8 h
) J( h# v) c3 _' G& j, v N
:# chenft (mike),2002/6/1, SMTH/MathTools # : w* W/ P% p# f# M6 c ' Y' i' @1 a) U+ DI have had similar problems. Below is an explanation I received from Ian. y( j0 D, }! a8 a' r
- @! @; Q1 Y: ]
Boyd* e$ t/ [* X2 w
# a! p6 t+ d* A0 B1 J* b
from Mathworks (just giving credit where credit is due) that explains7 C4 s9 ^% ]3 f, v5 X
" n2 ?) H% C6 y$ `) L- Q2 y" r: e, c' O
what's happening. You solution is to run matlab with the -nojvm mode. 9 d1 p& C* t r0 E " g" \. h9 D( q. h( k. Q5 |"The heap memory system in J***A consists of data and handle elements. ; \% l, l. l# i, M # L+ q0 b! e* ~' \0 ~% QWhen you allocate a variable you get a handle and data. As long as data, E7 h) q2 K) [5 L" ]
7 z( Q; T1 w1 @) R
has an2 A8 g$ n1 U& V8 e/ m
: t" v& F" v; D0 dassociated handle, the JVM considers it valid and will not clean it up.5 }7 x4 N( }5 T9 V
; k5 w* |; T6 i; L) dHowever, when you call the clear function in MATLAB, all handles are & q9 t) L, t- E: _ 4 O1 R! y$ r4 ~% D# P! fdestroyed, and the data associated is now invalid. This means that the3 O4 n1 q# D: D- |1 r& y7 d
2 \3 e: M2 K; k( @3 s, x) {( r( n/ Z
J***A7 f1 V A: f# B1 a
: D6 i* W: x3 C: T; l* h, n! m
engine can free up that data (garbage collection), but does not mean - J4 r& d9 f2 H; b- n ]9 P" S& ^! }$ t6 Nthat it will clean it up at that moment.& R! d% a) Q& @, y
6 x+ i. E! `0 ? I1 m9 O
Calling the PACK command encourages J***A to run the garbage collector, m" v( p5 J" R+ l Z" \- n
f" B8 {; b5 Uand de-fragment the memory. But it does not force it to (This is part / {3 ]8 Y+ p6 e& ]5 y1 M" w. { $ F& H; a+ S7 v) pof the J***A design). Even though the memory is 'freed' on the heap,; `: R) \/ @/ e2 e) S
/ J0 d: m, M2 C2 |9 s( j3 I
it is not actually free to the OS, it is only free to the JVM. Here : ~9 f- U+ p: W" N q1 N+ O' ] , u5 N# }* z# A; `" V! Y3 Ois one way to think of it:4 `$ z& J" ^1 s; g8 ?3 [7 H
( A& z4 E" K. f[MATLAB] 4 {, L7 V2 R( o: X( F4 @2 w7 ^: g- s) M0 A) c; b
[J***A]: [ q; E4 l) I5 {3 ^
% X( _' T% I& }, U
[OS]4 }& u& ` k+ S; P$ c( Y0 z
- x# _. P; U/ ]2 ]
MATLAB runs on J***A (virtual machine), and Java runs on the OS (physical 7 d. }# v) o+ U. b- T0 l! S2 c1 o3 z6 I# m
machine). So when MATLAB is running in J***A mode memory allocations 2 }' ~, c/ ]; E1 D2 B$ Y. R4 s- M7 |$ \
are requested from the JRE, not the OS. 9 f" l/ P! X" z* X3 Z ' a4 U/ C( h$ j% Y2 YOne problem you may be running into is that the default maximum J***A heap ) U# \. `7 D$ w& j7 _- b; D; \( V* }$ x; _
size is relatively low ( <= 64 M, so that is all the memory one session % }* m E3 v) ]7 F9 T) p! F J! x, e2 o; }
of MATLAB will ever get on your system.( t u$ x+ V0 O$ F
4 R U c$ H. o: S# E" o. ^The good news is that you can increase this value. You will need to create , m( f0 ~7 w: `' v * e" U0 W" z4 t: t8 sa java.opts file in $MATLAB/bin/$ARCH (or in the current directory when 2 b! ~$ c+ E1 g6 j* s) R5 b b- v' n: E, V+ M, _
you% Y/ x+ _% d1 {" i( s, q" T# U
( W: a% E5 a0 `5 {) Zstart MATLA and put the following command: 2 A$ w( P" Z* M$ A 4 Q. j* v) E/ r3 j& J%%%BEGIN CODE%%% / L0 c" h' ^ D) N / [1 x* [6 C* w+ b* JmaxHeapSize = 2684354569 C* G# J2 T/ `1 X
. K/ d/ b- c- t1 W1 |4 s3 B%%%END CODE%%% - [! p+ p( a2 o# n. D( X' R/ |3 q8 ]1 }! F' [$ {/ p1 q
This will give you 256MB of JVM memory and you can adjust the parameter4 U" u$ V" o/ e2 T7 Q" `
; q6 r; S$ x/ I7 H, t
as needed. 1 V- o) Z, u& w9 t7 ?, l8 h , f' S( m' R5 L9 p2 V8 GNote: $MATLAB is the root directory and $ARCH is your system ' u% r/ ]: u9 C- o9 M. c& M / R. h) E" u5 \6 W3 t1 qarchitecture. This solution works on Windows as well as Solaris, Linux,- w6 l9 ^- x2 x! p7 c" E" @) `. Y
5 U/ w$ c- w2 v7 i& @0 K( T7 m
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with* `8 _2 j8 y6 B6 r/ W2 [: B
5 t+ d% D5 v, ]! k/ r7 Za different syntax.. x0 _# a: N. X& c
% A- c1 R0 u( Q! C8 T
For the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are: 7 _: q. {* X4 O/ O( X! W5 X % q7 y$ j# _5 H4 o+ NminHeapSize = 16000000+ t! p. i S5 G3 u, G- J
7 S& Z$ [" ^7 pmaxHeapSize = 64000000 / ^: ~5 t+ o1 v: ]6 r- G/ X6 t# I # r) G$ D. Z2 A: B! V& t. rThese are the structure field names in that correspond to -ms and( ~) N3 n8 R5 \7 X' z. X
# s, }1 C3 r( P# p) s/ k-mx, and the settings above are roughly 16MB and 64MB. ) g) p: V% d. y. }9 b # f6 o& g8 g4 k& j, S1 K1 t/ cTo investigate the Java heap a bit, ask via the following: # h5 R* a, R+ Y* O( d% E" Q+ D( z$ l; J; U+ e& p7 q. f1 P4 _
>> java.lang.Runtime.getRuntime.totalMemory$ F2 y/ T4 ^) w' d% U& r7 A5 D5 ~! l
: }; z2 v2 A, ?" I4 F
>> java.lang.Runtime.getRuntime.freeMemory , B% G3 L% |! @1 Z% c; h: Y. `" C& I& o
When the free memory hits zero, Java will double the heap size (up to the & m+ ^- R$ U' M3 P1 B6 e , c4 |6 b/ m' x& o+ Jmaximum setting). ! |! J5 h% [2 V% x" c6 F8 P& ]: } * M6 y) `$ S2 PIf you choose to run without Java, you will remove the overhead of the8 a' O. E5 d2 ]! i7 h; i
9 k' W2 y! e6 D2 V$ I; Z; ~6 omiddle man, but you will also lose some MATLAB functionality (mostly3 B+ d3 o9 K. p9 q9 m; S
3 B9 f% y9 m+ T/ c. K) P
graphics and the Editor). You will still have most of the computational + ~+ r: _ _8 S3 E3 _0 Z" Q; F2 }6 f3 \
power though.1 s' [$ M2 s! |3 a: O3 X' d
: ~5 L4 g' x$ f' ?, X6 cWithout J***A, memory management will come directly from the OS, and a * P' l6 y' [4 y: v, L+ k! G1 k$ }9 B; l4 \8 h; M; i; v
CLEAR operation will result in memory being freed back to the OS." e9 q B% F/ X5 X
2 B/ z- A* B5 _# q; k) H
21)如何在Matlab中添加新的工具箱?2 L) q' y0 R6 i. e
& @$ p% q I9 G5 @' y2 e* j( \( K
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #7 ~' P* I; N/ Q1 @! p
4 U; ~7 W% k4 u, @4 \" u# d& ~mxDestroyArray(result);1 M! H9 D# h7 ~
- N! \: q3 d3 [; h3 y
engEvalString(ep,"close;"); + d8 M) U9 P8 ]/ A ' X l+ S9 B# t GengClose(ep);. u4 E T3 |+ r# C
( x7 Q0 P: t2 o9 d: H% ]2 t4 x}/ d' J( C* C- P' |
0 @8 W7 y7 J; b: i- ~5 `! a5 w
上述程序在Vc下编译需要将 libeng.dll和libmx.dll两个动态库利用以下的命令: ( N. e$ I3 l6 ]% }: I2 y7 N, } # [2 @) w8 f9 w, g) Vlib/def:<自己的Matlab的安装路径,下同>e:\ Matlab\extern\include\*.def /machine:ix86 /out:*.lib来生成程序所需的静态连接库libeng.lib和libmx.lib,将libeng.lib和libmx.lib所在的目录加入Vc++ project/link/object/library modules下即可。 9 v0 F$ ^! m) n0 O5 c5 L6 z7 T2 A% B K3 U, O' r
利用Matlab自身的编译器调用工具箱中的函数 * W9 U; B* e9 e2 J! c& V/ F2 L! g* a 0 b X; Q g: B( c . I% `$ v1 |9 F) N5 P0 }7 G, t