+ Z q5 d2 v2 I* P, H9 l' F( f⑶对图像数据进行变换、编码和压缩,以便于图像的存储和传输。8 E/ c" ^ o( R- R
4 h F: E+ S" l* z) u4 U1.2.3 数字图像处理的内容4 T I# n( `( ?+ {1 {
* h0 U& d$ E3 F$ |2 ~* |; U要有效解决众多的图像处理应用问题,必须研究出专门的图像处理方法,大致上可以将这些问题及其数字图像处理方式归纳为以下几类。 @9 N2 D k9 D- l8 _) Q4 x: _% a1 K- R/ E" X1 u$ f2 Q6 |+ L9 Y
1. 图像获取、表示和表现(Image Acquisition, Representation and Presentation) 5 Q+ g9 M( L! S: a) c# A( r # E' u& m @% A* \; W该过程主要是把模拟图像信号转化为计算机所能接受的数字形式,以及把数字图像显示和表现出来。这一过程主要包括摄取图像、光电转换及数字化等几个步骤。 ) z) V7 h# p& x! I) _9 E- z/ [6 B$ i0 e/ h9 b5 a
2. 图像增强(Image Enhancement) # b7 @* t( s1 Y7 ~8 m 9 |# V% x0 Q2 ?3 \" `/ K8 m k 图像增强是用来强调图像的某些特征,以便于作进一步的分析或显示。当无法得知图像退化有关的定量信息时,可以使用图像增强技术较为主观地改善图像的质量。所以,图像增强技术是用于改善图像视感质量所采取的一种重要手段。它所完成的工作包括去除图像噪声,增强图像对比度等。例如,对比度的增强是用来使对比度低的图像更容易显现其特征,而低对比度的可能原因包括光线不足、图像感应器的动态范围不够以及在图像摄取时光圈设定错误等。图像增强的过程本身并没有增加原始资料所包含的信息,仅仅是把图像某些部分的特征更加强调罢了。图像增强的算法通常是交互式的,而且与所考虑的应用有着密切的联系。 % X( N! a( n4 |, ^: ?' x" v* Q% A) m2 l. [
3. 图像恢复(Image Restoration) N' m: M/ I6 \3 i% f; G' d0 Z
r/ W9 Q7 W! E9 j! K 图像恢复是指在图像退化(图像品质下降)的原因已知时,对图像进行校正,重新获得原始图像的过程。使图像降质的因素有很多,包括感应器或拍摄环境的干扰,感应器的非线性几何失真,没有对焦精确所造成的模糊,摄象机与物体之间相对运动所造成的模糊等。图像恢复最关键的是对每一种退化都需要建立一个合理的模型。退化模型和特定数据一起描述了图像的退化,因此恢复技术是基于模型和数据的图像恢复,其目的是试图将受污染或降质的图像带回到原本不受污染的状况下所应得的干净图像,产生一个等价于理想成像系统获得的图像。虽然图像恢复与图像增强都会造成视觉上较佳的感受,但后者更关心的是图像特征增强或抽取,而不是去除退化或污染。 u# w/ m( E5 p! q: o. S; T3 y: s9 p. p+ r% M
4. 图像重建(Image Reconstruction)/ g5 G, W, J( x) K6 Q/ T, c7 ~
# g8 ~. ^! [& t! [% ~' P 图像重建的工作是由几个一维的图像投影来重建出更高维的物体图像。它与图像增强、图像恢复等不同。图像增强和图像恢复的输入都是图像,处理后输出的结果也是图像。而图像重建则是指从数据到图像的处理,即输入的是某种数据,经过处理后得到的结果是图像。一个图像的取得是以平行的X光或者其他的放射穿透光束照射物体,并在物体的背面接收此投影,接着在同一平面上改变光束照射的角度以获得不同的投影,再以某些重建算法将这些投影组合成物体的一个横剖面图像。这种技术主要用于医学图像、雷达图像处理、天文学星象观测、地质研究及无损压缩等。( x2 K) R9 S. {- f" H. x& c6 s
4 w' k1 M/ [( l9 p9 w/ vl isbw:若图像为二值图像,则返回真。, V6 J: b" a: G& l2 i0 z M4 b
6 ?0 W; e/ }3 b8 Tl isgray:若图像为灰度图像,则返回真。5 l) ^' |8 d& L N0 l
1 Q% z0 a# C% U r9 J+ ~" [0 El isind:若图像为索引图像,则返回真。 ! f: B6 I& a, a! B7 x# W( q- L 8 _6 }& Z) q$ o3 E. s7 I6 ul isrgb:若图像为RGB图像,则返回真。* v4 ?* z Y5 J' B. x
% W+ N, P/ q7 J+ g; ~$ B2 `) Z2.在MATLAB系统中,要将一个类型的图像文件转换成另一个类型的图像文件,只需将前一个文件的图像数据用imread读出,再用imwrite以适当的格式写到后一个图像文件中去即可。另外,要将灰度图像I转换成RGB图像,可运用cat指令。cat函数可以把一些单一的图像合并成图像序列。在图像序列中每个图像需有相同的大小,如果是索引图像,色图也要一致。 ; c) C( t0 K* _6 d$ _1 s! f# F: n2 Y4 d1 Q+ ]! J* R& u
此外,MATLAB还提供了若干函数,用于图像类型的转换。这些函数有: * z% m% J$ b3 d% O+ K, X- r2 o4 N7 k) E5 N/ F
l dither:用抖动法(dithering)转换图像。该函数通过颜色抖动(颜色抖动即改变边沿像素的颜色,使像素周围的颜色近似于原始图像的颜色,从而以空间分辨率来换取颜色分辨率)来增强输出图像的颜色分辨率。该函数可以把RGB图像转换成索引图像或把灰度图像转换成二值图像。 - @# z+ j# b( Q, X2 U 6 {6 N! x# B, w: ^9 f. e) P, n# [. ]/ El gray2ind:灰度图像或二值图像向索引图像转换。 5 q% C4 ^+ F/ j, F" b- ]! ~) {& D) `/ d5 i& u3 N0 `
l grayslice:设定阈值将灰度图像转换为索引图像。4 }2 i7 [( `! w
+ l4 P( P2 G- ml im2bw:设定阈值将灰度、索引、RGB图像转换为二值图像。 # ?& i' i7 n3 O8 j% l, B( |" s. Y7 n: ^- R7 a, O: B5 ]
l im2double:将图像数组转换为double型。0 { ` ^! n9 [
- X$ d' e, j" }' jl im2uint8:将图像数组转换为uint8型。. O$ ]- Y, _( k8 k1 \. Q: e2 _
" B/ [/ A7 n9 E8 D7 l# ^' Il im2uint16:将图像数组转换为uint16型。该函数不支持二值图像序列的转换。& d6 C7 N) W+ z- F' Y3 e
* o6 i S! \ W4 h( z% N
l ind2gray:索引图像向灰度图像转换。1 t& }* D; R( _% y" A9 K# b
8 D" G h, O0 V/ S5 s$ h4 S ll ind2rgb:索引图像向RGB图像转换。 ' t- d0 j3 I+ X5 N/ S1 z2 G & F5 z$ l; o+ ll mat2gray:将一个数据矩阵转换为灰度图像。 : q7 R/ y/ l$ `1 Y- J7 ^7 v) A7 d( D % @2 k3 J7 m* E n+ q1 S Tl rgb2gray:RGB图像向灰度图像转换或将彩色色图转换成灰度色图。 . J8 k: E6 |5 F/ x- l- i , I g. x/ n' g& z( ?/ el rgb2ind:RGB图像向索引图像转换。包含三种不同方法:均衡量化、最小值量化、色图映射。 # x1 ~$ ~/ U' ~! j% e+ _( e* `% u, r ?3 P$ D& M) C
l im2java:一般图像向Java图像转换。 ; q9 @' I6 n7 c$ A# K * ^) K$ F5 z/ o3 W% T2 fl label2rgb:标志图像向RGB图像转换。 4 m! F5 X- j# G l% b( q7 l. y: ^) U( [
2.2.3 图像的查询及读写 6 b* ~; ~% V& ^ @$ K( M0 |6 |0 u3 R0 U* `) ~
在MATLAB中要查询一个图像文件的信息,只要用imfinfo指令加上文件及其完整路径名即可。函数调用格式为: , |4 S5 @: i+ C # N4 d; c) S0 W K; i0 q/ vinfo = imfinfo(filename,fmt) : O/ O% q6 J; V6 q) @. Q7 ^) j6 \( ^$ m0 r+ \" @
info = imfinfo(filename) * T0 ~* k/ o# ]& T% @- [ $ r" {. Y) Q U$ \( r参数fmt对应于所有图像处理工具箱中所有支持的图像文件格式。) g8 I8 J( f5 S$ Z/ R$ b
. s/ i6 I8 X6 IMATLAB提供了两个重要的用于图像文件的读写的指令,分别是从图像文件中读取数据的imread,以及将数据写入到图像文件中的imwrite。+ l4 ~3 P, l1 D$ Y3 e) N) Q& Q- y
+ r7 `8 f- H' \
1.imread的常见调用格式为: ; s' K- e& }, F4 N. A, r! X9 F8 t2 A& n4 L7 r
A = imread(filename,fmt)0 l) s" ~& D2 J/ [% p9 @5 Y
- d' S, k3 Y9 A: G/ L2 T3)象素:是图像在计算机显示中的度量单位,可以变化,可大可小。 * A9 e. m1 Q! b( K8 I& R( @* t' ]+ ]4 ^7 h0 F$ o/ g8 M" g" }6 {" s
4)分辨率:是用于度量图像在显示器中清晰程度的一个参数,分辨率越高,图像越清晰。分辨率是与象素相关的,即单位长度上的象素数就是分辨率。由此可知,分辨率越高,象素的几何尺寸就越小。0 _7 t" {0 B& C1 t
8 z; T3 m1 ^7 T4 }5)图像文件的大小:指一幅图像在计算机中保存时所占用的磁盘空间,其大小与所用的颜色模式有关。灰度图像中的每一个灰度象素只占用一个字节(8位),RGB图像中红、绿、蓝各占用一个字节。另外,图像文件的大小也直接与其分辨率有关,原因是当分辨率增加时,一幅图像所包含的象素量急剧增加。 % f6 m4 U4 [; s6 I" l/ H) v g* y* p
6)句柄:通俗地说就是对象的代号或标志,它能使计算机方便地从众多对象中找到所需要的对象并对之加以相应的操作。MATLAB中的句柄图形对象包括轴、文本、菜单、控制框、图像等。- G- ]* N, t. t( e: z! B$ h
7 Z" J7 w. U$ t4 `3 ]/ B2.2 MATLAB 图像文件格式简介4 v c# ? y- b6 W! |! A* C
% o1 S6 l0 O8 k4 _3 I
针对MATLAB的数字图像处理功能,我们讨论它可以处理的几种图像文件格式: 6 U4 {; E- d$ S7 i/ v0 w5 J; l9 b. Z) Y, c# Y! ^8 U- B2 B
A)PCX格式。可处理1、4、8、16、24位等图像数据。文件内容包括文件头 、图像数据、扩展调色板数据。 + b' x5 w( k0 A9 x* ^2 d6 D 4 X3 i9 V* s% X8 F' [B)BMP格式,即位图文件,整幅图可视为一个数字矩阵。它包括1、4、8、24位非压缩图像,8位RLE(行程编码)图像。文件内容包含文件头、位图信息数据块和图像数据。选择BMP格式保存一幅灰度模式图像时,可选择以Windows格式保存。而且在选中4位或8位位图时,还可选压缩(RLE)项,在用RLE方式压缩保存后图像将毫无损失。这是用得最广的图像格式之一,在本文中都对这种格式的图像进行操作。 3 N1 O# {5 w: w6 g$ u& t* i! w8 J( y, k* {& N
C)HDF格式。有8位,24位光栅图像数据集。: H% l8 f |0 N5 p
! y1 p" P8 ^, }$ d+ {2、在文件中加入显示感兴趣的变量的语句 & X' g& M5 ^2 v2 P; ?5 E2 j& i7 J1 a. @: `' i2 @
3、把keyboard命令放在文件中所选择的地方,给键盘暂时控制权。这样,可以查询函数空间并按需要改变其值。 & j2 m0 Q; V3 M. S- g 4 b- S( ?! O) k" D0 L: j4、在M文件开始,在function语句前加上%,将函数M文件改变为脚本M文件。当MATLAB执行该脚本M文件时,该空间就是MATLAB工作空间。这样,当发生错误时可以询问。 8 }9 m3 B* |( N% {& H6 f P1 F. m 3 {' s- W5 q3 ]1 L* v& V当M文件大,递归调用或者多次嵌套(即调用其它M文件函数,被调用M文件函数又调用其它M文件函数,等等)时,用MATLAB的调试函数会更方便。与上述所列方法相反,这些调试函数不要求将有问题的M文件进行编辑。表16.1所给出的这些函数类似于其它高级编程语言中所提供的函数。有关进一步的信息,以及它们的使用实例,参阅《MATLAB用户指南》。& w- t4 @# U+ X
1 T; e* W7 F" q
表16.1) d- e+ m2 W; ?9 c c8 x4 W
/ @9 E3 e J* K* ^% c7 m' I
MATLAB调试函数% N! ^6 h0 M {' ~" Z
+ i" L6 y# y, h$ qdbclear: 5 S' K6 R j: o9 [5 j" T) f" ~ 7 S0 {: p Y4 _* `2 B. V. s
1 ?$ S3 X6 I* K* j取消断点1 i1 P, X0 L% {3 P3 m
. m/ V! p G" E3 }% F; }dbcont: ( p4 F! z7 }+ B7 g 8 Z" a2 \( ]1 H! J- w, A; I3 h : e: f7 s: C4 i0 Y% o F& C在断点后恢复运行0 k( i; h5 k D. S. Q* z$ Q0 b
; ~& q* }. U: hdbdown: : `' F) z( O2 o; U% I ! j6 i* ~* X) P( h+ _5 b" p" u" ]
工作空间下移/ ~+ a, F f& L2 P
( U1 Y% U0 p9 Z8 G- L0 T
dbquit:. K w: P0 U2 B9 v% }+ _4 y# n
( O9 C9 ]5 K9 j' Q1 o {& }5 t0 b) }
4 c$ d: Q) X3 C5 U+ p; k退出调试模式 : \5 z/ u3 ~& S$ y v3 m ; j) R8 |0 k0 Ndbstack:! E" _! v) _- S E. t- L g5 l
% `6 R/ [+ V8 T" _4 q- f$ b
& z- _) s" X$ a- w: q( f2 s' T
列出谁调用谁4 ?) m! s6 R* w7 n4 c% M
9 B: T: s* q' L/ t+ R: l" e Gdbstatus: # m0 p' i' Z; j9 @+ _ ^2 c* ] 6 w5 p5 K$ k4 b3 L
& e8 _$ v2 S! w列出所用的断点/ y5 R# R; v+ T( T3 O! ] n
, P) T" Q( X7 u7 r7 i5 M q) tdbstep:; ^+ i Y( ~1 h
4 Y9 W6 E# K9 D; c
6 i5 Q, A9 d$ f/ a
执行一行或多行 ( Y e) w# }/ m, A6 c4 W 9 E2 G# W" F3 g& M. Zdbstop: ( {7 M* `4 P( Q6 ~; s8 G* Q ! Q9 H* |: y) w4 g( b$ _7 e$ P6 Q
% [) q) A! \4 G! C! l. g$ K' D设置断点 6 S# P n! ^6 J) I% n" h# f1 E' x, H
dbtype: ' r" l' r. ?; V" k . U7 R7 F. c- {6 y
, b9 @7 \! q9 q$ a7 r
列出带行号的M文件; F( g- w' {3 E1 b t! P$ W
$ V( v& C7 j g5 Z4 d8 Ldbup: ' ]1 A. [ b1 P! v* I4 w3 Z + ]$ X# ?- c) z% f9 l
, ~& I$ @8 T* C- l
工作空间上移 ; t% {( {7 H# L: P$ y4 e D( X: }1 O7 s5 l0 L
图像类型转换函数# u" a' Q$ M+ R
9 t5 s. l. d2 m8 S8 g6 |: @ ; m0 a, R5 R3 p5 s; W$ f2 E1 G4 n: M9 R& q. w
MATLAB - elevenguy - elevenguy的博客 MATLAB命令 % H2 S% X# o8 J1 X+ K ' M" W$ U" U' ]1 y/ [+ R默认情况下,matlab将图象中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。 ; N5 L* ?; e. m0 N; T. E0 X9 L( a. T2 W2 t: c" b: I1 l
im2double():将图象数组转换成double精度类型 " L) j* `3 S$ e3 A, H # O/ `# G% b nim2uint8():将图象数组转换成unit8类型 |! R+ F. {$ h 7 K* K# D7 \& yim2uint16():将图象数组转换成unit16类型 9 x: S1 F5 U: b' D- C7 l+ ]1 u% O ; A3 V3 Q% S j- i* l. D图像类型转换函数: " p7 C0 [5 v% V. O9 a3 M3 U# Z5 q( n2 B5 l1 O h
dither() 通过颜色抖动,把真彩图像转换成索引图像或灰度图象转换成二值图像 4 Q/ w2 {1 K& @' u 6 G; e |5 I: U. d8 P9 w. ^gray2ind() 将灰度图像(或二值图像)转换成索引图像# r: `; P0 Y Z) v- \8 `2 V
7 o3 j( p! S3 N0 I
grayslice() 通过设定的阈值将灰度图象转换成索引图像, Y( v$ ?* ^$ l4 d! u7 S
' j& o* E$ k" K6 B- Fim2bw() 通过设定亮度阈值将灰度、真彩、索引图象转换成二值图像: D2 k1 Q! t' C6 d$ H t
5 x$ Z4 r, Y. U1 p& N
ind2gray() 将索引图象转换成灰度图象 + E. R. W; j; [& F; N ' N8 }: I7 h& b5 s7 zind2rgb() 将索引图象转换成真彩色图像 # W) Z. R# c r! k2 j1 k% H6 C! n. x* x* L- Q
mat2gray() 将一个数据矩阵转换成一幅灰度图象 f7 R' }& A; ~0 i' i% v* T: e, }) s
rgb2gray() 将真彩转换成灰度图象 - k/ _3 d+ R, U! o5 n) h9 J/ o - f7 ]$ p3 `: qrgb2ind() 将真彩转换成索引图象3 L, U9 W" j( J2 C" K( b
+ X) F2 g8 I. I8 p图像类型与类型间的转换9 ~" z3 X( J' k# t+ _; v- m; T1 |
4 x$ x* `; a4 p2 t
1。索引图像:包括一个数据矩阵X和一个色图阵MAP。矩阵元素值指向MAP中的特定颜色向量。7 b( t: ~/ Y5 @
6 N8 {9 n" Q3 C
2。灰度图像:数据矩阵I,I中的数据代表了颜色灰度值。矩阵中的元素可以是double类型、8位或16位无符号的整数类型。 9 d9 L& r2 s' y$ Z9 w4 r: t) x8 v5 ^& Q2 E
3。RGB图像:即真彩图像。矩阵中每个元素为一个数组,数组的元素定义了像素的红、绿、蓝颜色值。RGB数组可以是double类型、8位或16位无符号的整数类型。 0 u% t1 ^; F0 ]9 L3 `1 K7 `4 c5 B. L4 V9 r+ g v4 J! S
4。二值图像:一个数据阵列,每个象素只能取0或1。/ R0 [) N' ^- r: R
" Y- Y; l2 X0 {$ e O( D, g: |矩阵的基本运算8 T3 c8 h/ J, N) H; @& c; D0 g
: f& M. D- p: V3 y, z[x,y]=meshgrid(xa,ya) 当xa,ya分别为m维和n维行向量,得到x和y均为n行m列矩阵。meshgrid常用于生成x-y平面上的网格数据; 3 g: T6 i7 q* ^9 K # D; {( y1 G# ~+ ]3 H. E, `' v) Emesh(x,y,z)绘制网面图,是最基本的曲面图形命令,其中x、y、z是同阶矩阵,表示曲面三维数据;2 d8 U% G% F k
$ ~5 X0 r- i0 Goption为设置命令参数 / O( s) y0 E3 X$ K2 Q% L6 @6 u2 T0 t( O- [$ v5 m$ b1 r
建立文件fun.m:: B8 r0 X" Z: U2 F$ l5 b
) p* g# a' q: r5 t3 z- R
function y=fun(x) " a5 f0 ^3 i/ Y) P6 z) l9 N1 C O6 B! N
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), .... x* }& J: X4 T6 k
$ f+ I6 h) t! ^& s7 _2 L; D
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];% x, [ q" n2 R1 ?3 O1 S
! E$ r J" Y$ f4 p1 l
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) 7 k7 r$ s9 h; \) ?) d- i5 `/ z# Z, A; U. P) [% l
注: & k0 [! c* L/ F# _ * p8 o! _* S5 X" o( \...为续行符* [" E. F% q- F @8 G( x% z& k
5 r7 c; ~! Z+ V1 X
m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。+ B9 E! [! H7 S9 e+ e/ Q* h. ^1 [
( |2 `8 J! _* V1 e9 E2 O
不定积分与定积分8 }$ ]! _6 p# m7 W
/ [7 ^' x0 l p9 R不定积分:int(fun,var)( w9 _) u' A4 A4 A6 A
6 u* Q/ l9 {6 _+ R( x( \例:求∫sinaxsinbxsincxdx: r8 b: d4 c" G% p
0 [9 f1 f/ L5 G9 Z0 v1 j0 f
syms a b c x 9 [( I/ b. U* e, @: C 1 j4 R" k; Z3 v, v) h, b) qy=sin(a*x)*sin(b*x)*sin(c*x);9 V0 b% ?" r. L
/ n9 e& Z8 V& b9 _int(y,x);3 `4 h6 Z& S/ Z0 z+ {
& ^* k9 e+ O+ Ipretty(ans)" x! O* W# h" b+ Q; A. _; e' l
+ E! t" ?9 B) x/ y7 A( {1 S定积分:int(fun,var,a,b) 4 Q. u/ q3 T# d! m) }0 w7 ^ J3 J1 s4 B
其中a,b分别为上下限/ Y/ r* K6 R( q1 _' a
% Z' j6 H( c! `$ t$ R `% N0 y
求解线形方程 A9 S" N0 w4 H % B! r. R+ W/ [8 B v& ^solve,linsolve* l K+ K' `8 u% a# {* s0 k
8 ?. A& F8 @; B, `( \2 Y. @
例:0 P; L5 j5 G" b9 o
" E5 x2 h, s: z1 L* o/ C
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; ' W( Y1 }+ J; S1 d7 h # r- ~: S# q5 S* C" }/ O%矩阵的行之间用分号隔开,元素之间用逗号或空格 % U' E8 @9 g- ^" o" N6 d3 C1 b& R4 j# N5 [( N
B=[3;1;1;0] * E& O# R4 g1 i 8 j2 X9 H2 r. DX=zeros(4,1);%建立一个4元列向量, _4 _& c' y# R
R) s5 A6 ?( Q* k0 w- L% i
X=linsolve(A,B) " L, L# b7 B) O5 K( U* C 6 s$ f0 _- Q( X) w) l# H8 H7 Mdiff(fun,var,n):对表达式fun中的变量var求n阶导数。 & V' B- [1 ^: H1 G1 |2 r' O, @2 H( G2 k8 Y- T
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式' `: } z4 s$ }" k' P5 f( j. k
. C7 w# x- {5 X; f E$ P4 J# ydiff(F); %matlab区分大小写/ K4 E+ U0 J0 r7 `
5 C& i, _: [9 u* C
pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 g7 _3 @3 I r/ K& } ~; G; s
- u- B% _3 N* W0 S" f: V- Y
求极限" Q8 K( F2 c% ]1 Z+ s
$ w l9 Q: R P' tlimit:' P" d8 X" m0 L, R6 |, E% o3 E
# Q7 Z, p8 ~4 G3 p0 x5 Y) y, y例:limit(F,x,a,left);对表达式F求极限,变量为x,从左边趋近a。) R2 U. r. S6 @
9 B6 \! g+ Y" W% k0 A8 NSolution Number: 26990 4 [6 I* d. V3 p) u8 Q 8 B) q- }5 C, ^. S% X. Y, XDate Last Modified: 2001-01-308 Q9 f# |% K- f
; A# B" |; d- c1 P7 e
Product: MATLAB 6.0 ==> Current Version! h4 Q- Y, B# R
2 M# h) u1 d4 F q
Platform: Windows # n5 [3 R$ I- R! q8 V : a) J5 O! l" j+ H+ u, `. w* fProblem Description ( e) D% e0 g- R: h& A8 o 4 T9 _) S8 g- ~; c3 [Why do I encounter problems when running MATLAB 6.0 (R12) on Hebrew % b' W5 @% x. N* y1 C9 W+ u) ?# X2 n5 o# l) G |
or / x: h. }: p: {2 @ ' S+ ^3 q8 e! vTraditional Chinese (Taiwan) Windows? I try to start MATLAB but after5 j& x4 e4 @5 P* u+ d+ T" u
# w& s3 V/ n: Y) v9 | t f
the splash screen disappears, MATLAB exits. 1 Z8 J* D. r3 h4 l4 \5 y u " \3 n6 y) M% G* \: |/ V. KPLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a * R4 z, J" ?' s0 [. q1 ^" I2 P7 Z. L2 V2 Q4 P- x# i3 A
similar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0, 2 z3 `$ Z @, R7 {# I5 [& U6 Z1 r3 J) ]! T
see solution 7213.2 b% Y: m1 p6 M! X6 ?
5 i8 S$ I3 v: o4 M) R# T
Solution:- Q2 _; z2 H; b' E7 p* w# Z
# d5 w3 e4 k. }3 g
This problem is caused by a bug in one of the font properties files we ship. Z+ Y) [, d" w8 p& `$ E6 q
) P" O; u& A; s- owith MATLAB. The font.properties file is used by Java to map the standard4 d5 e% W5 u$ r7 e
0 I L+ k1 _/ d6 i, {. i
Java font names to system fonts for a particular language operating system.1 F/ x4 y2 l, y) B! G- q- o
" Y" Z+ B3 W/ u0 E" a& Q
However, we made a few assumptions that do not hold for the Hebrew or' S: _1 M! {) t
; S1 I6 I& M2 {$ i! x" T' \' ?Traditional Chinese Windows, causing this problem. ; W' U" d" X( z/ T8 i. b ) R7 w( @# N P+ G8 c- {We have created a fixed version of the mwt.jar file that you can use to! x/ \$ ^* i6 K3 U1 q- q" q
* h/ w# W) e1 |* p3 Z: K' ?
correct this. To use the fix, first rename your mwt.jar file as mwt.old.$ `/ N. M* i: o- p* P5 h( l7 g
( a9 }( M5 ~: G; ]
This file is found in the $MATLAB\java\jar directory, where $MATLAB is your/ I0 A) b. _! c; J5 Z8 c
6 Q, m; q+ e' \MATLAB root directory. Then download the newer mwt.jar file from:" j' m, j+ j& D; B
0 k2 u: C- s# j2 J# Hftp://ftp.mathworks.com/pub/tech-support/solutions/s26990 6 N9 \. e( q/ A# K& G& n. W9 l9 v( G5 Y8 ~. F$ k2 {; j5 o. t# \
and place it in your $MATLAB\java\jar directrory. Then restart MATLAB; 2 j8 |2 T! g! F- X1 D' J " j f0 o" \, d+ G( t. Othis should correct the problem you're seeing.$ K4 {; f) X1 J" S! x9 f- m
. g, }; T2 |) \$ A, e2 L
2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? # S3 o, R9 U, J. \ ( h4 e8 l0 ^1 `: c# x:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools #& K7 Y9 A7 X7 J9 K: d4 J
5 u+ K$ K- D% v+ ~# v
参见第一节问题7)) p6 [9 S# G; K, @3 _4 I- O% _. z$ {
/ D+ r8 _1 p4 H, g
3)如何在给定句柄的axis里绘图?2 k; @( z6 h# [7 N& R# p( Y# E; _
- Y* X4 a. Y. i% @* F7 Z:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # : `( ^; T6 a& H2 r8 N 3 R6 @6 ^/ v5 V2 l: a; Uplot(data,'parent',haxis); 0 ~; n3 x5 K6 d% j! a1 N. m% x6 `! L
或者 1 o& X' }0 F1 W8 w! P) q/ R u# g W0 V6 r: j9 L7 F* t
hbar=bar(data);) n3 O5 C0 _2 T: [
# q# h1 p" d' D9 L m% D; x5 @0 h
set(hbar,'parent',haxis);5 @$ `7 V W( u: n: L* ]
: Q9 y3 N# ^% ?# @则可以得到最小二乘意义上的拟合系数 7 B; o5 n5 B2 B' H & o* } M" ?' \1 O* b% P7)Matlab中如何作圆回归? , f+ X$ e* v& h$ @7 @ M! y9 S" P2 k3 w: B5 D:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab#0 u5 s) d* x7 E
6 g7 J# B" D( b0 K
Q5.5: How can I fit a circle to a set of XY data? 7 @+ N, E, ~3 r0 Y/ i # m4 g0 s4 Y% k/ U=================================================. j. |: N: ~# s* U/ D
0 X: x. E0 Z0 C* g+ eAn elegant chunk of code to perform least-squares circle fitting was & s# }8 n5 t1 [* ^4 x) A4 Z ' w. {7 i: O6 `4 v- z5 [" j% twritten by Bucher Izhak and has been floating around the newgroup for # ~. x" o7 }# x' E/ m. U. P6 e4 ]# n! j+ t; k9 e# ^
some time. The first reference to it that I can find is in:) @1 Q3 W0 E$ z ]: }
! q0 ^0 `0 {: s# T2 @! Jfunction [xc,yc,R,a] = circfit(x,y) & X- m$ r2 @8 @0 T q7 { w) l & R+ W- ?* v7 n) X! P. N7 U1 ?7 G%CIRCFIT Fits a circle in x,y plane : I2 j# T/ B( G0 n/ B; m3 G) B R, c$ V% k. y' t- y& z
%, [' K: y+ R5 h- g2 S
$ ?0 k% X5 M: s6 G% o6 e
% [XC, YC, R, A] = CIRCFIT(X,Y)% M; K6 l/ g3 Y& C3 M
D3 F7 C: C+ D# s$ f) Y% Result is center point (yc,xc) and radius R.A is an optional0 h! g" @3 a9 g" k4 G
?8 z- l; \- E3 Q8 b! {
% output describing the circle's equation: 4 c6 n' {" _ g5 D2 y" l) j! E, v }* o
% + a, o! p2 }9 W x8 Q1 Q+ c0 V ) ]& w: n# x' {9 [8 x% x^2+y^2+a(1)*x+a(2)*y+a(3)=0 * M) p& v) D, `; i% N8 ^/ ], L+ L. k4 M- ~7 s
% by Bucher izhak 25/oct/1991 : _. r2 [9 L7 y. s4 d4 [. j# i. T' g( H+ C1 m# G
n=length(x); xx=x.*x; yy=y.*y; xy=x.*y; 7 E, j. [! [- q7 p( `9 O! ^' M% J8 v , \6 v- t: p$ {A=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];+ ^9 o! W9 R, S4 N4 W* A/ a
% S, F4 j: w `3 O) n
B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)];! a X, T, V1 H: g
/ {0 Q& `! M# I
a=A\B;: a4 P! `% n: z
- n. [) g0 b$ n& dxc = -.5*a(1); 8 e' l) [% V3 [1 \. |1 r3 x* _0 t3 ]- `
yc = -.5*a(2);) \) w- R+ B* S6 u! V; c
7 }6 I0 m* l5 g+ z+ ^4 JR = sqrt((a(1)^2+a(2)^2)/4-a(3));1 w2 I3 \- `2 }4 k4 U# S, c
* h# f n4 ~4 n8 X+ e9 e: mfprintf(1,"your_format_string",var1,var2,…); ' O" B( |/ R6 j4 M N6 b5 o& \. _& i+ L
18)如何在Matlab中画隐函数曲线? ) Q: v7 C( |( a ! E& Q1 }4 u9 a:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # $ _& ]1 v3 I/ r. D0 g4 v L 6 Y K1 K. p2 i- F在http://www.mathworks.com/matlabcentral/fileexchange/index.jsp6 t# |& D. p8 y) S+ D. n. Y+ t
1 w* G- P; H m) S查找implicit,会找到一个Arthur Jutan写的implot.m # O# [) k0 V, { Z0 Z3 K4 a- ~2 P2 X5 J3 k
Mathematica中绘制隐函数用ImplicitPlot[] 3 ]* Q; Q4 r3 s& }& _0 Z5 {2 c! i) @% Y) _; d! m6 @2 {3 k
或者ImplicitPlot3D[]4 i, B& z K9 n2 F" g
- `6 f3 }' R% C% A2 D- M$ UA(j,=[]; %删除A的第j行 5 }+ g) n( O( Y0 y ; \# \- L* Z0 E f- HA(:,i)=[]; %删除A的第i列+ [1 z6 N. @( i& P8 v1 \- t
( H! V- [$ H$ [1 M20)Matlab中能开的最大数组是由什么决定的? ( d9 D5 O4 d4 |$ }1 }# v9 I% |. F
:# chenft (mike),2002/6/1, SMTH/MathTools # , q3 f( t# j; ` k6 X5 T* x& ]1 ~% S& l$ \* l7 Z5 B
I have had similar problems. Below is an explanation I received from Ian0 I5 p! e3 O! k5 c2 R
, ?9 z! W9 o4 b
Boyd) z" U2 E; ^! g/ f. {, \$ b4 q% ]
/ ]6 \9 m: `* u z2 j
from Mathworks (just giving credit where credit is due) that explains 7 \" l% r8 R7 I) M5 F3 q; P; M- w) V- Z3 ^" I2 Y* n! w; T
what's happening. You solution is to run matlab with the -nojvm mode. , r3 @ l; ~7 {1 D* E+ P- ^ ! ]6 J+ x, J9 m3 ?) T& O1 Y {"The heap memory system in J***A consists of data and handle elements. 3 F7 ?% }: F% ?* ~- T! G/ v6 {5 U! T: O S
When you allocate a variable you get a handle and data. As long as data $ L1 J) J8 O% ]" Y4 A4 @ w& i3 P$ q1 L% _! v7 j) N
has an 6 o: K! l/ {6 o7 c( t, X1 K: g& ?6 G4 h8 P7 @7 @9 T1 L
associated handle, the JVM considers it valid and will not clean it up.: h. Y/ i/ c: d" X& p
& y+ S2 ^" L& }) h! P5 [However, when you call the clear function in MATLAB, all handles are$ B: x; r& A' r5 \2 `9 b- T
& X! |- B" J: edestroyed, and the data associated is now invalid. This means that the4 P$ {5 s0 y4 I( T4 s9 r3 n3 h
0 w" f( f% {3 K' O XJ***A . w9 G6 o& r" S8 ^) R" y+ N7 y" s" U- }$ I9 O y9 ~
engine can free up that data (garbage collection), but does not mean 2 J% Q) D0 X+ J! t. z8 `2 x7 t$ r- b+ j, Y+ [ J
that it will clean it up at that moment.: B9 W' I- Y' o! v: A' L4 f
9 s$ {5 k$ Q% s
Calling the PACK command encourages J***A to run the garbage collector; B I2 d4 H% u) a( T6 F1 C
+ h% a. o+ U- ^and de-fragment the memory. But it does not force it to (This is part 0 @6 s. t6 |: r; J* p2 b / P; H9 {) t# t4 ^- P+ _; ^3 ]of the J***A design). Even though the memory is 'freed' on the heap,; `6 G* L( g& s2 k% w0 h
3 d! O7 U+ w. git is not actually free to the OS, it is only free to the JVM. Here4 z" Z& Y! i; O0 G
: K# B+ i) C% r/ a q T5 _& z
is one way to think of it: + ~ K# V- v8 x* Z, B; z 3 x& }1 z/ R1 e; U[MATLAB] 0 ?$ W9 O( V7 l, g2 a/ Z1 c) E' }8 L9 @5 w
[J***A]$ j# g& G l) o) m* B* U
+ N; h. c5 \- s' {
[OS]. V' s# A- J. ?- x0 x
8 Q$ F' [ s+ w% @. V8 m9 s/ ]" ^MATLAB runs on J***A (virtual machine), and Java runs on the OS (physical ( d1 m# s! {# W5 z/ V" d/ n" C9 E% s) i5 A6 g4 Y0 N
machine). So when MATLAB is running in J***A mode memory allocations 5 o2 _+ d, [2 g6 x) @, o/ m2 H% U& [: y1 ^( C
are requested from the JRE, not the OS. : V; a/ a: }2 j. M2 q ' s1 \7 B8 `5 Y3 g3 J, {3 @One problem you may be running into is that the default maximum J***A heap- K4 g @+ Q% B8 @: [: g% |
, q5 m L! n2 h% b; ?+ Rsize is relatively low ( <= 64 M, so that is all the memory one session u' A) P s( o3 _7 t" j" h. F t: K$ G6 q, S" K2 u9 ?: Y
of MATLAB will ever get on your system.; c% k& K3 e3 R
3 Z. o5 F; Y, c, D0 H4 v$ ]! V$ u+ `The good news is that you can increase this value. You will need to create" [$ d% s' d5 w& g& @1 D; ^
+ w5 P+ A6 M2 C
a java.opts file in $MATLAB/bin/$ARCH (or in the current directory when ' l6 R$ ]6 `# L& a " E5 M* h Z! a) \& Xyou9 b7 B" o7 ^2 l. u$ z
: }5 P& M% P) ]3 V4 E4 y
start MATLA and put the following command:2 `+ H& O' `2 ^" g0 j! V
; o9 Z0 [+ z6 ^7 G, F D
%%%BEGIN CODE%%% : R- l' a! n( D" ~ S- ^ " C! Y, h u# c* V, d# d" t9 [2 emaxHeapSize = 2684354563 B/ K n' \7 Q- K; w: w
( D5 h* }9 Q3 S& `
%%%END CODE%%%+ [' O& l5 _- f: \8 Q9 l% k5 v
/ e+ D" `! t& ^+ S* x
This will give you 256MB of JVM memory and you can adjust the parameter . b3 \5 i: P; e5 O# b( j' ~# H% u$ k; W; S
as needed.: s4 m; W: D. v! g7 j5 M- \$ ]" r
+ M. p! t5 u7 x; X0 P$ i
Note: $MATLAB is the root directory and $ARCH is your system - e- K4 }' S; ~8 y# r; |) R3 V, G) r
architecture. This solution works on Windows as well as Solaris, Linux,3 V0 f4 w: d _& s2 V9 ?8 w: S
% c; }. i0 f3 |
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with3 E5 K4 ]8 ?, O( O6 {
# N) ], F+ u/ I8 c4 e& Ca different syntax./ Q$ k- [" A* Q! G( H! V
8 \8 ^3 x0 g: Y5 }7 ~maxHeapSize = 64000000 3 A" l" |& o# ?' T0 |# l! j- B4 O; ^& J: _
These are the structure field names in that correspond to -ms and - E. v }, A' b$ a& M& A- G , ?2 T7 @* ]! K-mx, and the settings above are roughly 16MB and 64MB.7 N5 x0 t! n1 `! o" P
5 F7 a" }! y# ~. G" z9 N3 e8 S
To investigate the Java heap a bit, ask via the following: 8 w' i( A# B% |5 k* e9 M" `, z3 d2 u5 } Q& g9 o! N2 J
>> java.lang.Runtime.getRuntime.totalMemory& a7 C8 K, j" K
2 X: C/ [+ p8 o8 E. g% F! e* I>> java.lang.Runtime.getRuntime.freeMemory 7 H% b! _* a! t* B/ R3 ^9 E1 F2 G. v, I+ E" ^4 a/ F4 f3 O
When the free memory hits zero, Java will double the heap size (up to the8 k% f8 f/ j ?+ H8 ]9 Y
! I3 Z& ~$ y% Amaximum setting)." |5 q/ V! B7 W- w4 ~: D3 _$ ~
+ j- G. ~4 a$ H& @5 n% I, J
If you choose to run without Java, you will remove the overhead of the5 F8 @1 J& {4 p5 d3 A7 g
0 {- r9 Z$ H! R* ~% k" B
middle man, but you will also lose some MATLAB functionality (mostly/ b& g8 o* {6 z3 @/ { z+ \
7 n: \; @/ _& N% C1 t' A+ t
graphics and the Editor). You will still have most of the computational- v7 ^' Q- @# X! {
% }1 n8 B! P+ b- `3 ^
power though.. b. L; o1 o0 e
: p/ c) e. P( R k+ s# f( L- P! x- @Without J***A, memory management will come directly from the OS, and a 9 \2 |4 }- C" z8 j) ~. ^+ g1 Y. X3 U' u. g0 N% X( _$ K/ w1 z) \2 y
CLEAR operation will result in memory being freed back to the OS. & c& y7 s/ I$ w3 a5 C. v " [( {* n a/ e1 g21)如何在Matlab中添加新的工具箱?) Y, E, ~1 {9 I: B I
8 e# I: p! \) U0 H4 \% k% c:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # ! S7 ?( K/ X/ X( u: S6 t- T# r- w S
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。 0 @' c7 X' N/ T; g. J2 Y3 t { 2 d, c+ w5 l# _' K如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某 * k/ Y8 L1 t- Z7 u; d $ U. J6 }" d) i$ I1 b# z X5 [; `个目录,然后用addpath(对于多个目录的使用genpath())或者pathtool添( D" e$ ~ n% A2 l
* y: m' k2 k% ^5 s+ m加工具箱的路径,然后用which newtoolbox_command.m来检验是否可 I4 O7 y# o# K$ W( V( y# @; p* O' P$ h( @5 f& `; e; N" y
以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。 + n. X5 P2 ^% |2 P; w! c; _2 q" a8 C% h
具体请看工具箱自己代的README文件。 }; W T0 q' `: z2 r1 i4 z
$ Z+ k* T5 z& x! f( p( D( c4 n
22)如何读写Matlab的.mat文件?) U- w. d$ }" t0 _% r7 Z