8 y, c8 Z# v! V2 k3 N& A! P+ \⑵提取图像中所包含的某些特征或特殊信息,以便于计算机分析。如用作模式识别,计算机视觉的预处理等等。这些特征包括很多方面,如频域特性、纹理特性、灰度/颜色特性、边界/区域特性、形状/拓扑特性以及关系结构等。 - M l1 {8 ?/ @0 B9 P! a, T, ]. p. H
⑶对图像数据进行变换、编码和压缩,以便于图像的存储和传输。 2 R v& D( |( N* D2 d2 e3 S0 \" V& J3 K) _# F: M* s- w t
1.2.3 数字图像处理的内容 ) A' R9 f9 G; W: o- B+ I. ~# [) b! D, R3 Z7 w
要有效解决众多的图像处理应用问题,必须研究出专门的图像处理方法,大致上可以将这些问题及其数字图像处理方式归纳为以下几类。 ' e8 n3 l& g9 t) K. J0 s8 @8 v: ^. ?9 M8 p' Q+ K( X
1. 图像获取、表示和表现(Image Acquisition, Representation and Presentation) ! z% d' P- f3 y, I* _ ; @; w! b/ P/ d该过程主要是把模拟图像信号转化为计算机所能接受的数字形式,以及把数字图像显示和表现出来。这一过程主要包括摄取图像、光电转换及数字化等几个步骤。 6 t9 u3 p$ J2 @ 0 b- S1 h: L* M9 o! H2. 图像增强(Image Enhancement) ( w& {& c& n( P/ Q9 Q% w ' ]: N( P; W" k/ `4 D# l/ ] 图像增强是用来强调图像的某些特征,以便于作进一步的分析或显示。当无法得知图像退化有关的定量信息时,可以使用图像增强技术较为主观地改善图像的质量。所以,图像增强技术是用于改善图像视感质量所采取的一种重要手段。它所完成的工作包括去除图像噪声,增强图像对比度等。例如,对比度的增强是用来使对比度低的图像更容易显现其特征,而低对比度的可能原因包括光线不足、图像感应器的动态范围不够以及在图像摄取时光圈设定错误等。图像增强的过程本身并没有增加原始资料所包含的信息,仅仅是把图像某些部分的特征更加强调罢了。图像增强的算法通常是交互式的,而且与所考虑的应用有着密切的联系。 % S( l. y! i0 |$ F0 v z$ _- Y+ D+ ?2 ?' Y% ?2 ^9 u1 H
3. 图像恢复(Image Restoration) 6 u {3 i- e1 G% i . w/ d& G8 t+ u1 A 图像恢复是指在图像退化(图像品质下降)的原因已知时,对图像进行校正,重新获得原始图像的过程。使图像降质的因素有很多,包括感应器或拍摄环境的干扰,感应器的非线性几何失真,没有对焦精确所造成的模糊,摄象机与物体之间相对运动所造成的模糊等。图像恢复最关键的是对每一种退化都需要建立一个合理的模型。退化模型和特定数据一起描述了图像的退化,因此恢复技术是基于模型和数据的图像恢复,其目的是试图将受污染或降质的图像带回到原本不受污染的状况下所应得的干净图像,产生一个等价于理想成像系统获得的图像。虽然图像恢复与图像增强都会造成视觉上较佳的感受,但后者更关心的是图像特征增强或抽取,而不是去除退化或污染。& x3 s5 a- d0 A, ^5 j6 T
/ V8 q, ^% } g6 p3 X) D
4. 图像重建(Image Reconstruction)* u3 M6 A0 ?% H/ J6 M) c3 {5 d: a
/ K) T* [1 a4 b1 g1 A6 S 图像重建的工作是由几个一维的图像投影来重建出更高维的物体图像。它与图像增强、图像恢复等不同。图像增强和图像恢复的输入都是图像,处理后输出的结果也是图像。而图像重建则是指从数据到图像的处理,即输入的是某种数据,经过处理后得到的结果是图像。一个图像的取得是以平行的X光或者其他的放射穿透光束照射物体,并在物体的背面接收此投影,接着在同一平面上改变光束照射的角度以获得不同的投影,再以某些重建算法将这些投影组合成物体的一个横剖面图像。这种技术主要用于医学图像、雷达图像处理、天文学星象观测、地质研究及无损压缩等。+ \3 o3 t# U6 d& {$ ^3 U
) X+ g) u7 A0 a+ R5 U5. 图像压缩(Image Compression) 7 S m- S/ N" a. j* g% J4 V) ~1 B/ i+ q
图像压缩的目的是降低代表数字图像所需要的数据量,这样做的好处是可以减少图像传输时间以及存储空间。编码是实现图像压缩的重要手段。图像压缩编码主要是利用图像信号的统计特性以及人类视觉的生理学和心理学特性,对图像信号进行高效编码,即研究数据压缩技术,其目的是在保证图像质量的前提下压缩数据,以解决图像数据量大的矛盾。一般来说,图像编码的目的有三个:①减少数据存储量。②降低数据率以减少传输带宽。③压缩数据量,便于特征提取,为后续识别作准备。 : J H }3 h+ S9 l2 s - q/ {+ M x+ v+ c0 A+ k" B从编码技术的发展来看,Kunt提出了第一代、第二代的编码概念。第一代编码是以去除冗余为基础的编码方法,如PCM、DPCM、ΔM、DCT、DFT、W-H变换编码以及以此为基础的混合编码法。第二代编码法多为20世纪80年代以后提出的,如Fractal编码法、金字塔编码法、小波变换编码法、模型基编码法、基于神经网络的编码法等等。这些编码方法有如下特点:①充分考虑人的视觉特性。②恰当地考虑对图像信号的分解与表述。③采用图像的合成与识别方案压缩数据。- w7 y# k1 o- ]
Q1 L) ?9 |# f5 y
6. 图像分割(Image Segmentation): l9 A9 a# o6 z0 W J
) ?( r# J% |6 K 图像分割就是把图像分成区域的过程。这是从处理到分析的转变关键,也是图像自动分析的第一步。图像中通常包含多个对象,图像处理为达到识别和理解的目的,几乎都必须按照一定的规则将图像分割成区域,每个区域代表被成像的一个部分。图像自动分割是图像处理中最困难的问题之一。人类视觉系统能将所观察的复杂景物中的对象分开,并识别出每个物体,但对于计算机来说却是个难题。目前,大部分图像的自动分割还需要人工提供必须的信息来帮助识别,只有一部分领域开始使用。例如印刷字符自动识别(OCR),指纹识别等。: W8 i X s4 A8 E! q8 y
; f, c+ t9 X$ b- _ 2 y8 l- C4 W7 D+ f& i% n1 [ $ T& O7 L a( W5 F/ ]5 s8 V图像为m×n的整数矩阵,元素值范围[0,1] " Y! h$ X+ m: O; w: U* u, |1 m 7 z) |# m; k: A% N4 R 2 @9 `" f: Y- b) v; Y7 x2 p: \$ [# h1 ?
' |, n, p2 C* W" h0 w. g1 c图像为m×n的整数矩阵,元素值范围[0,1] w; b/ j; j% A! Y0 q q7 d 6 B7 q9 t3 D' K1 Q$ a4 N! f4 L索引图像 k, L' u2 J( @* U! G: _* ^ 4 }" B4 L8 a a+ B m9 l . T1 r1 ]* H" s
1 w/ W4 J9 Y. L9 r1 I/ K8 K图像为m×n的整数矩阵,元素值范围[0,p] ! `% g2 f$ O3 E7 Y" ]& t% t8 p( f" o, p; f6 ~( i
2 }+ X& f( _; d8 j) ]2 q7 v ( `7 s* }2 T! g& c E r% z( ^6 }图像为m×n的整数矩阵,元素值范围[0,p-1] ( u& E2 x W. j' o$ b$ u$ C, F( l6 U
灰度图像 7 A' _3 J$ G1 @) f0 x3 _ % l$ z2 b$ n8 W9 |* `3 M & |' o7 p7 q3 ^: q$ d
, |- a, M# N# H图像为m×n的浮点数矩阵,元素值范围[0,1] ) L# U. }! H3 K% b 1 M' ?; a2 }4 l7 T 2 o( R6 v; [. B. p9 Z: x . J# g- g, Z2 l2 H- t8 _图像为m×n的整数矩阵,元素值范围[0,255]或[0,65535]' Q- e! S6 B, i& D8 X* @6 C. s
( E9 x! U6 Q# ?0 w9 ~4 n# L; D) D; p6 R) }
RGB图像 7 Y3 }! P [( r# o ' i- F, G7 o3 r3 v8 n - Q8 }8 b$ d, c0 t
: h) |# P- ~% T图像为m×n×3的浮点数矩阵,元素值范围[0,1]; H& D! C* O5 ]; u0 L. w
! d9 c0 c- Q4 E) N5 A) l$ \ 6 ?3 X& {3 g" N5 R
9 l |; r9 c5 @4 H图像为m×n×3的整数矩阵,元素值范围[0,255]或[0,65535]# V7 O" r* X2 } r( C d$ h
% t" h* h8 }, ?
其中,多帧图像阵列是由多帧图像组成的,每一帧图像可以为前四种图像中的一种,但组成一个多帧图像阵列的图像必须为同一种。cat函数可以将具有相同尺寸的几个独立图像存成多帧文件。对于多帧图像也可以从中提取单帧。 6 g6 A. O7 C. T5 H: Q5 t! m4 f z8 d7 c$ f) t3 T
2.2.2 图像类型判断及转换 % H; f: T, }5 D5 k; y# U1 @% \% E: |9 X6 ^4 a5 a0 X+ T
1.在MATLAB中如果要判断一个图像文件的类型,可使用如下指令:. z9 m }# X: v- n( G
9 e1 V% P, K6 k: i$ k+ Z
l isbw:若图像为二值图像,则返回真。 ' |9 {! r' \' O% ^1 [1 W) b. A, b: ?$ \# o% M0 |! \% K* v
l isgray:若图像为灰度图像,则返回真。 $ y; [& O- ?- d* r1 m2 w. Z& N; m* E( D6 p% W! l9 @
l isind:若图像为索引图像,则返回真。 , G5 X2 t3 H, Q1 ?" ]- B5 B; a$ b& ?( @
l isrgb:若图像为RGB图像,则返回真。- q6 o6 Y0 _/ j7 B7 P; R
- b7 Y4 i0 M1 y* s% N" s2.在MATLAB系统中,要将一个类型的图像文件转换成另一个类型的图像文件,只需将前一个文件的图像数据用imread读出,再用imwrite以适当的格式写到后一个图像文件中去即可。另外,要将灰度图像I转换成RGB图像,可运用cat指令。cat函数可以把一些单一的图像合并成图像序列。在图像序列中每个图像需有相同的大小,如果是索引图像,色图也要一致。 U1 b$ g3 T; [- X& N # m2 V& G- y' r+ k8 K+ ?此外,MATLAB还提供了若干函数,用于图像类型的转换。这些函数有: 7 @6 e1 Q: B" J+ E; ~) c8 C3 F; P4 f4 o6 T+ i5 h: @; q. X+ s+ `: r9 B
l dither:用抖动法(dithering)转换图像。该函数通过颜色抖动(颜色抖动即改变边沿像素的颜色,使像素周围的颜色近似于原始图像的颜色,从而以空间分辨率来换取颜色分辨率)来增强输出图像的颜色分辨率。该函数可以把RGB图像转换成索引图像或把灰度图像转换成二值图像。: f1 L5 T& [9 L
- D4 E. J( C' w1 v" F
l gray2ind:灰度图像或二值图像向索引图像转换。# _* n9 U- v5 n
' L8 _7 H5 R6 Cl grayslice:设定阈值将灰度图像转换为索引图像。 ' y9 O. F7 i. n: H }3 r7 t6 y) R . R0 y" v* \# C; El im2bw:设定阈值将灰度、索引、RGB图像转换为二值图像。2 e. _/ J) Q( M4 B5 |
2 W4 j* F6 ~4 @' L' H3 n# ^
l im2double:将图像数组转换为double型。 + d% k/ B$ K7 P. k + P; B8 W7 D, r% s5 Pl im2uint8:将图像数组转换为uint8型。 6 F: Z' H& w3 a, T9 V* y9 G. ?8 m. J: L
l im2uint16:将图像数组转换为uint16型。该函数不支持二值图像序列的转换。) Y+ p+ a5 `2 P% g/ e
" v9 Q) Q4 j- r7 [9 Y0 I% m0 L1 v
l ind2gray:索引图像向灰度图像转换。- A1 E/ y: N9 h; E+ w. b" y. `
8 r( q. ?, j2 w6 D+ }. }5 z
l ind2rgb:索引图像向RGB图像转换。 7 |7 c+ Y7 _! }+ x6 i6 C6 s5 f4 o- \& k+ s
l mat2gray:将一个数据矩阵转换为灰度图像。* @4 i0 Q4 n2 `" L* u
/ q# g/ A$ @5 g9 B1 E# q0 K( x& r
l rgb2gray:RGB图像向灰度图像转换或将彩色色图转换成灰度色图。 ) Z* z- Y, G- ~2 N) Z5 r) u4 o, h! ~! o, O7 ]
l rgb2ind:RGB图像向索引图像转换。包含三种不同方法:均衡量化、最小值量化、色图映射。 ' r! u* f) i e: `9 u, _6 [) A6 H; C% |( h
l im2java:一般图像向Java图像转换。 / d" { C. Y6 S# e0 Q4 Q# W/ W, q- f2 {# S
l label2rgb:标志图像向RGB图像转换。 * y) l. r' F6 a# j6 ?1 I . G K# \* q% [% V0 E+ o- i2.2.3 图像的查询及读写 l) i$ X/ G' S& C" w8 s
' a) A" Q, J d1 ]* e; [' D7 q' t3 C5 h. D在MATLAB中要查询一个图像文件的信息,只要用imfinfo指令加上文件及其完整路径名即可。函数调用格式为:& v3 P7 `9 o* O5 @
$ M% z8 E# I$ |
info = imfinfo(filename,fmt)0 b7 [7 E4 A6 z( |/ ~
- g$ `9 A2 m- I2 Q& K- B7 i
info = imfinfo(filename) + m) T2 a- d' C. a; i2 t$ {) L" X4 \5 l$ \$ c
参数fmt对应于所有图像处理工具箱中所有支持的图像文件格式。 - x# u( Z) P; W$ h( [1 d/ M0 Y# A2 Z, Q, F; Y$ q1 j
MATLAB提供了两个重要的用于图像文件的读写的指令,分别是从图像文件中读取数据的imread,以及将数据写入到图像文件中的imwrite。# x7 J+ R) o2 h: x, K
! d4 P+ k4 E5 u7 M5 n) ^
1.imread的常见调用格式为: R8 J% u; A N: j _" r, i$ r4 p " c; ?& T" i4 _# tA = imread(filename,fmt)7 Q# z7 I+ ]0 a) J1 `) @' B3 n# }
* b, u( a/ g' ~2 Q2 @/ W
其作用是将文件名用字符串filename表示的,扩展名用fmt表示的图像文件中的数据读到矩阵A中。如果filename所指的为灰度级图像,则A为一个二维矩阵;如果filename所指的为RGB图像,则A为一个m×n×3的三维矩阵。Filename表示的文件名必须在MATLAB的搜索路径范围内,否则需指出其完整路径。 : Z/ N4 D) X0 s$ J$ }& S + D" K, l B4 q5 ^. p9 ^ imread的其他几种重要的调用格式为: ' H3 n9 R* ~1 t9 {6 v2 d : A' {4 {7 v) A7 [: f: H[X,map] = imread(filename.fmt) ; Q& O x r8 t( [! k6 G- {* x0 d5 b. P9 k6 C
[…] = imread(filename) 9 A l5 Q1 q6 C: Y9 E7 {1 }/ v) U* Q6 I7 V3 Q4 J+ D0 ^1 y
[…] = imread(URL,…)/ r- b$ r4 }, a& Y) m# H0 V; s
# F. D9 n: W- H. L 3 _$ P$ w% _1 C- G 6 [9 r {1 b$ D在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型灰度图像不一样,二者转换格式为: 7 s3 q6 @& J z2 W0 h1 h$ m5 T4 _" M- o$ ^
I8=uint8 (round (I64*255)); 2 i, p9 _( B. H* J 6 W% R D' i: j/ z$ _% \7 G9 [1 \I64=double (I8)/255;1 F: c7 o. j. k" p9 u2 u: E, w
. p* p5 \6 D5 h- k4 D
反之,imread根据文件中的图像种类作不同的处理。当文件中的图像为灰度图像时,imread把图像存入一个8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个8位RGB矩阵中。& j( z$ N4 e' F& k) N; Q
% t# h _/ b: U8 P% i! G7 z
本软件的处理统一针对BMP格式的灰度图。在编程时图像读入与输出均要求转换为uint8型,中间运算处理过程则要用double型。# e' }% F# {5 S7 H" v+ E
) U$ F( B, W' T* ?0 S+ Q4 [2.5 从零开始学用MATLAB ' g% a6 X- F) V: _. V7 }: E ! }0 P% a9 h1 K% v3 o! A : m: N- ~/ `" n* h5 i4 y! v- i + Y }# V" w& w: H& n3 F MATLAB对于我来说是一门全新的语言,一般在编辑框中编程存盘后在命令框内运行,在Figure框中显示图像。在用它作数字图像处理的过程中,最常碰到的问题有: ! G$ `4 E3 l' T" r! f4 p6 {) r7 v5 C B5 K$ c0 V
① 图像读入 imread (‘文件名.格式’,’格式’),必须是上文提过的MATLAB支持的7种格式之一,而用Photoshop制作的PSD图像保存了所有通道和图层的信息,不能直接用MATLAB来处理。显示图像用imshow (h) 语句,h 为图像句柄;在一幅图片中显示子图用subplot规定子图的位置和大小,用subimage(h)输出子图。输出图像若需要永久保存,则可用imwrite (h,map, ’filename.bmp’,’bmp’), 写入存储器。注意在该语句前要设置调色板,即map=(gray(256))。 1 m) Y5 Y5 X4 ~6 t $ o" W& Z* Z2 K1 ^9 h G② 结构化程序语句写法不同于C语言。比如if, for 之后要用end 表示这一块结束。有关条件的语句都不用加括号,而用冒号来表示递增,如5 `. W1 W) w9 H8 S5 |4 d9 g
4 ^; I$ |. C9 m3 g w$ K+ g1 e( B
for i=1:3:10 . T" Z, p' j) \. {7 o& Q , C; b/ r: A: m P 表示 i从1以步长3递增到10,即做三次循环。 6 @, J3 W" s* }1 i) E ! _/ Q# O/ |( s. N! i; ?3 U③ 要注意图像格式的转化。须知不同的图像格式对应不同的处理方式,如果处理与格式不符,将引起错误。比如范例中的图片lena256.bmp表现为灰度图,但其实质仍为RGB图像。如果不用语句rgb2gray将其转化为256级灰度图,经变换后图像会变红或变蓝。 & J- ]! d8 S9 K; M9 u, T3 R9 o: e: L! _8 Y
④ 数组的定义方式与C语言不同。由于C语言中含N个元素的一维数组A的下标从0到N-1,数组定义为A[N];同样的数组,MATLAB规定的下标是从1到N,所以不能再用A[N]来表示数组,只能用它表示数组的第N个元素。赋值时用A代表数组。/ p" S2 Q: \# W; z$ h" y: ~% |3 v
; w5 K% w% S/ O! e6 O- Q: ~
⑤ 由于在本演示软件中,涉及较多点运算,所以运行速度较慢。等待时未知其是否顺利运行。这时最好在最外层循环加上计数标志,即变量名,这样对程序运行的影响不大,却可以知道程序的运行情况,有助于查错。但如果在内层循环加标志的话,将大大减慢运行速度。2 e. S, I5 `2 m6 f
2 q% a1 b( i" A+ N3 r7 t, p
⑥ 尽管MATLAB允许未定义使用数组,但在实际应用中这样经常出错,特别是遇到在double和uint8型之间的转换时。所以最好还是养成用前定义的习惯,避免出现不必要的错误。0 m- R# d+ R ^ ?
6 G- B2 c* ]% M9 m' E. [9 j
⑦ 在做完一定量的运算后,一般要用Clear清除内存变量,以防影响后面的程序运行。* `) j3 w" J2 e6 J; e' h
3 j* ^4 J) F; ]2 L/ q
7 B; D" T! r. G2 P
+ y+ x1 ]5 T+ y$ L( S' V$ w% \+ P
matlab调试工具 6 W, k0 a; C( m! p7 k2 l 2 f) l, |/ ]7 J2007-05-31 09:32 ( @0 B# T8 i! f6 f' d7 `1 M p& F! [6 T- z8 H! a$ }
在开发函数M文件过程中,不可避免地出现错误,即故障。MATLAB提供了很多函数和方法,帮助调试函数。0 Y$ X. }) q4 H' q
: i! ?& K) d; d* U! V
在MATLAB表达式中,有两类错误:语法错误和运行错误。当MATLAB计算一个表达式的值或一个函数被编译到内存时会发现语法错误。一旦发现语法错误,MATLAB立即标志这些错误,并提供有关所遇到的错误类型,以及发生错误处M文件的行数。给定这些反馈信息,就很容易纠正这些错误。 + k! _) }( T- J) s& r+ f# f3 y. O: x7 {7 B
而另一方面,即使MATLAB标志了运行错误,但找出错误一般比较困难。当发现运行错误时,MATLAB把控制权返回给命令窗口和MATLAB的工作空间。失去了对发生错误的函数空间的访问权,因此,用户不能询问函数工作空间中的内容排除问题。 u# R( H4 l1 Z8 {8 Y5 v1 P
' Q, e0 h% o( y) Z2 v" h
根据作者的经验,当一些操作结果导致空矩阵或NaNs时,最容易发生运行错误。所有有关NaNs的操作都返回NaNs值。因此,如果有可能出现NaNs结果,则当出现NaNs时,最好运用逻辑函数isnan来执行一些缺省操作。因为空矩阵为零维,所以对空矩阵寻址常常导致错误。函数find表示了可产生空矩阵结果的一般情况。如果函数find的空矩阵输出用于索引其它数组,所返回的值也将是空的。这样,空矩阵具有传播性质。例如: % p2 ^; `+ a; x, @ z" N$ Z6 v- J k
>>x=pi*(1 : 4) % example data6 T7 L# z9 Q3 c: A
& ]5 f. t; @( q) g( `# M>>i=find(x>20) % use find function, l j4 r6 n3 F! }# O
2 \. w2 N- B6 y/ t4 d
>>y=2*x(i) % propagate the empty matrix s. T0 j. A& P y6 [4 A
. a8 I5 T+ J. F! e: d' z
很清楚,当希望y具有有限维数和值时,可能发生运行错误。当执行一个操作或使用可返回空结果的函数时,逻辑函数isempty有利于为空矩阵定义一个缺省值,这样避免运行错误。 : r( y! z! ?& D2 e1 v! t5 l1 ~: i# d# L9 ^) M; N
有几种调试函数M文件的方法。对于简单的问题,可直接使用下列的方法组合:6 R# e L3 H3 j, ^" k
4 N7 z3 Y8 J/ j( C% q7 Y$ e2 n1、去掉文件中所选择的行的分号,以便中间结果显示在命令窗口中。/ R/ { V3 r! m! K& a( L& E
+ [1 S8 C4 J! Q0 C R3 R" s' k
2、在文件中加入显示感兴趣的变量的语句 1 F8 w! @* O: J n : N3 i( ` ?- Q: }! P3、把keyboard命令放在文件中所选择的地方,给键盘暂时控制权。这样,可以查询函数空间并按需要改变其值。3 ~* X' c; Q. n' G* ^8 K
/ e; j/ X' _$ t% Z: g$ D
4、在M文件开始,在function语句前加上%,将函数M文件改变为脚本M文件。当MATLAB执行该脚本M文件时,该空间就是MATLAB工作空间。这样,当发生错误时可以询问。 , m1 e1 a) y0 t) t0 W , M7 R3 U) ^1 T# _. g当M文件大,递归调用或者多次嵌套(即调用其它M文件函数,被调用M文件函数又调用其它M文件函数,等等)时,用MATLAB的调试函数会更方便。与上述所列方法相反,这些调试函数不要求将有问题的M文件进行编辑。表16.1所给出的这些函数类似于其它高级编程语言中所提供的函数。有关进一步的信息,以及它们的使用实例,参阅《MATLAB用户指南》。# b! ?# t- e2 l+ ^ H: x9 L, O) b5 B4 {
) Y. `! u- Q9 J* H) i P9 i+ ]Product: MATLAB 6.0 ==> Current Version 4 e* D8 w4 ]( Z: R% v8 G3 i6 {- l2 g6 _
Platform: Windows + j8 z6 C# C( v' p1 I4 P& `% M- i# \0 S2 u
Problem Description$ s4 ~6 G! f6 _ o1 W) |; ~3 `: I0 ~
[) G. D8 H9 Y" j% WWhy do I encounter problems when running MATLAB 6.0 (R12) on Hebrew 1 S9 z9 h/ J5 {6 u; @4 {( S9 _$ T5 T& S- h4 w
or 1 Y! u. _3 ]& q3 H8 ]) j) c& ^5 e1 \" K' D' U/ D! `/ i
Traditional Chinese (Taiwan) Windows? I try to start MATLAB but after % ?9 c2 k2 y) i5 g/ b5 i4 L) ?- ]8 m" I* V/ E4 i# T( H
the splash screen disappears, MATLAB exits.# D" C$ {" s. C6 _$ _5 `. b
1 U8 s6 |7 Y& Z
PLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a! r) f/ G! G; x- ]2 G/ D3 T
7 j0 x# a" t& h5 N' |+ l: Q5 tsimilar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0,5 f8 G2 i+ N4 y' E1 ^5 x
, O7 k3 z p7 o% l% u
see solution 7213. 6 S0 D! m) N# F$ y2 x# i. m9 S u0 z: F% f/ M& _
Solution: T; s5 w. l% A. G' m) c+ o/ `; u, h: _3 X' H3 L
This problem is caused by a bug in one of the font properties files we ship ) e: P& j$ {7 I6 j5 M3 i: Z0 L2 G
with MATLAB. The font.properties file is used by Java to map the standard 8 ?1 I. E/ i; `2 C: V 3 h. @4 a E m; P: a/ S: AJava font names to system fonts for a particular language operating system.; B6 T P! F g4 J% ?' E: C u
7 r2 w1 k0 l! A2 O6 b$ ~
However, we made a few assumptions that do not hold for the Hebrew or 6 y8 j& U9 Y' c2 z8 G7 ?! \ 7 l$ ]5 t' z) ZTraditional Chinese Windows, causing this problem.; O1 F( a5 F! N% Z$ Z
- k! D" b) T' w% x0 l. p* \We have created a fixed version of the mwt.jar file that you can use to : v- {/ z& x% g# c! ~4 Y3 n2 U) Q* K: g% A
correct this. To use the fix, first rename your mwt.jar file as mwt.old. ( w2 g% u) L/ D4 ~* ? f7 G% b! O( P. o0 Y$ ], _ B, w
This file is found in the $MATLAB\java\jar directory, where $MATLAB is your 6 R& x* D7 y( u- m+ ^" X6 C9 x! z; l a, z+ B- r Y0 s, e
MATLAB root directory. Then download the newer mwt.jar file from: ' e! [% O8 w, G; H* h4 @! Y 4 I" F5 b( f" [/ lftp://ftp.mathworks.com/pub/tech-support/solutions/s26990 . D7 H& U# q6 w9 K6 m+ @; | " b' |' o8 u( ^! ? L9 Aand place it in your $MATLAB\java\jar directrory. Then restart MATLAB; 1 H) y* N% T. d. M 7 R" r/ W$ E1 d2 q1 m& ?this should correct the problem you're seeing.- w8 p! Z( q0 K
6 J. h5 E: F M' a- i2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? , b7 ^3 K7 m" p+ ?& Q/ C5 k5 e, ?" s' F ( `: M6 _8 H! r1 g:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools # % m# ]) O5 L) A, P9 \6 a, F' S- z3 {7 s+ W
参见第一节问题7) , x ]& U' Z- ~/ R1 ] 0 X7 p8 ^2 v4 F5 x3)如何在给定句柄的axis里绘图? - g. u( k: M* u- h( X : U8 C3 y2 f* t# Q: y& C:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # - O- p( c5 d0 D, l8 g: j 0 H) J s2 _" |4 M6 ~3 Tplot(data,'parent',haxis); 4 {9 C& J0 N$ F# r0 O . |/ s0 t/ k0 t6 _& t或者 0 K: Y3 O2 U# R( g& d : [4 H% i& I( ~hbar=bar(data); i0 y3 C9 j- B9 j" x% |' M1 y t) l$ U
set(hbar,'parent',haxis); " L3 J; V2 q5 e8 \# [- Q; H0 r * J0 c' Q' R4 B- R3 E4)由Matlab符号运算得到的公式怎么才能将数据代进去运算?/ Z/ w* b% |, s* \4 |: @
/ @) g g8 Y$ V! A" I( t5 n, E g
:#ramjet (德芙)2002/3/3, SMTH/MathTools # ]; a4 U% y) y5 w [; K3 f
" W" x0 D) I9 e8 q- S
使用subs(),或先将值赋予一个符号变量,然后用eval() ; R! J, ^; n" p+ L! y4 v. B/ L! P U. w
5)在Matlab中如何求最值点?如何求一维数组的极值?8 j: y9 y- c5 p: V3 r
* z! R8 Y4 s9 o( E3 g7 O4 w:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/18, SMTH/MathTools# ' T9 w2 T. a: o. W 8 ], P) c* I8 t. ]: m最值:# ~5 @, D- E0 B, ^, _
* @9 Z P5 G* L7 T. h. S一维或多维数组最值用max(data()( r, D- P9 o" |/ T( ^& a5 a9 s, G8 ?
" w b8 d* S" _6 J4 b1 D; S; X& W
如果想返回最值所在的位置,用[Y,I]=max(data)9 o/ p$ o$ I4 K+ h
w3 F, s! b1 ^+ C) n: u' O R
:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2001/4/21,UESTC/Math#" T+ O2 d% v3 Z5 K0 Y7 n! h/ f! {
2 R- _6 P7 K2 b2 p* T( x
极值: ) h* x: k0 Y! q: Q6 W4 S3 B7 Y2 T 5 r+ Q9 p# a( P5 Fdata是你的数据, ( W# y( h0 C4 }1 ? 9 z) w1 x* N/ J3 x' ^8 v3 Afind(diff(sign(diff(data)))==-2)+1: D1 a4 E A: g, N0 }+ x
1 C5 y. ^5 h! A; I/ m
找到极大值的位置 / B/ V+ H ~* C9 I ! a# J* o' p5 Z/ k1 T9 f/ x/ `0 wfind(diff(sign(diff(data)))==2)+1 5 C0 E0 E# d$ R- S) R$ g, q5 u$ Y6 X9 z5 ^
找到极小值的位置 & W4 D. l/ m) q) O3 ^9 I- ~& m: U- G) R% V9 |; t
data(find(diff(sign(diff(data)))==-2)+1)和+ X7 E$ W! L5 o% j% I
2 Q9 a7 @+ I" H# ^" P/ gdata(find(diff(sign(diff(data)))==2)+1) / x# A8 X& T6 c7 l. ?1 J' P! } 1 q, B5 G P. h$ E返回的是极大值和极小值! G5 R" s8 V9 f: @4 z
# O5 ~/ N5 X q3 w. I
6)Matlab中如何作线性拟合/线性回归/多元线性回归? 4 j( M+ b1 `! m% z, o6 U* X% ?( L
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #7 r* i8 j' q/ z- S2 x
0 \8 }$ ^$ I4 b4 o7 x; o* E
即用y=a*x+b来拟合一组数据{{x1,y1},{x2,y2}…{xn,yn}}" r% n: t5 n% ?4 ]; ^
& \( C. ?0 l) F( J6 _' I0 W/ v; Amatlab中使用polyfit" t# ?* e9 A! G. j# ~, w
- H' H5 ?2 d2 M, @; A6 B
x=data(:,1);# d0 k& |4 ~3 T" C
9 v6 A( G E$ s. F
y=data(:,2);8 x; b" h5 S) ^- D2 r6 F2 h
! i! j8 o* b- n7 S9 H) I- C' wp=polyfit(x,y,1);; a! U9 l' b% X# m' ] O( v2 q
9 G* a8 T$ B" ^$ W) E5 E/ h; x) u
p(1)为斜率a,p(2)为截距b; c; }% G8 C" o, q
( G5 y+ f2 m; m% j9 B6 f# r
多元线性回归即用y=a1*x1+a2*x2+..+am*xm来拟合数据点{x1i,x2i,…xmi,yi}: x. Y5 C+ `& `2 v6 s: f
' B7 j" c. z& l/ z则系数{a1,a2,…,am}'=pinv(A)*Y ( `2 v/ T7 x3 @8 X. y8 x( G( k5 Q5 d4 @# j/ Q9 z1 x
在matlab中使用 6 d) C' n+ _+ T, V $ [! w L0 ~! x) \; u9 ^0 p& _. qcoeff=A\Y- g5 T3 v6 t8 K9 ^& f
- j% b% n! X! J. U2 p
则可以得到最小二乘意义上的拟合系数 5 R1 a; R) y$ Q' Y0 S2 D+ E4 ^7 U: E/ T0 C
7)Matlab中如何作圆回归?" m( Z; e* A! J& i# k7 J2 z
4 ~7 {9 Q* N* q:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab# 8 @7 _& y! H. j: e2 E* |( H5 \" ]0 f1 j3 ~$ ]
Q5.5: How can I fit a circle to a set of XY data? . X. X% O6 b4 q% i+ G/ y$ q1 M$ G6 _, {( Z: A4 B
================================================= % R6 x! X! r8 m5 g8 _9 x6 h8 b5 ?3 A( V; H# o m
An elegant chunk of code to perform least-squares circle fitting was' ]' H5 P: C. z/ A" M6 y/ s
! e: `& T6 X9 Nwritten by Bucher Izhak and has been floating around the newgroup for* o; U7 P4 h4 d7 e& M4 g
- |4 ~" V' Y$ U3 }
some time. The first reference to it that I can find is in:+ F( w2 |# V/ m, X, _$ F
) C( U) Y( c, ]- e; J* D
function [xc,yc,R,a] = circfit(x,y) / V3 e" j7 J8 @& K, A5 w* g $ e$ M. x! n/ T%CIRCFIT Fits a circle in x,y plane : E# f: k; K! ~& m3 W) m8 W. {$ W% P2 Y. a! d M6 T
% ; [" {/ L1 X; W- G- S) r( L7 b- B 6 Z {* `8 o3 w- ^% [XC, YC, R, A] = CIRCFIT(X,Y) ) w- y+ b0 b3 r% |6 a : q& A; m9 S/ w5 d% Result is center point (yc,xc) and radius R.A is an optional+ F9 u0 h( A6 e! o# Z
# b' e' i$ m7 o2 t' M% output describing the circle's equation: b/ h& ~ w2 d/ r0 ?: I* R
5 ?% l5 }& G( v- b%7 s5 A3 L- P3 O, R
$ H( J4 @- ~# z7 {% ?9 p
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0 0 p: `" Y! x2 r/ ^8 v. T, J4 m- E8 U; ~$ ~. R. r8 n5 \- @
% by Bucher izhak 25/oct/1991" n& e* T+ f2 ?: W
7 |; ?( ]9 F4 WR = sqrt((a(1)^2+a(2)^2)/4-a(3)); 0 Y: t8 D. L6 c" [! i ! n4 b0 M8 J- P; pTom Davis provided a more sophisticated approach that works for more# ^/ P; f* o, ^3 G
/ K) N" d% |# s' O( A- p:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #( Z. F! O0 `9 V* e, `: g
" y; \2 m% Z+ Y! ?& U
A(j,=[]; %删除A的第j行 3 e! D/ j8 ^) p7 x# i& H# _ 4 u( l; n- i1 d+ [8 {4 X" WA(:,i)=[]; %删除A的第i列! A$ d" f* J. p8 i7 o Y9 ]/ C; }
: O8 a: G5 T; V9 N6 @2 h20)Matlab中能开的最大数组是由什么决定的?; D6 I9 ]: Z/ P' p" l
0 c; ]2 |$ N+ i6 { b1 S3 R+ ^6 V7 d
:# chenft (mike),2002/6/1, SMTH/MathTools # 8 f4 n: I- L( R+ }6 Y% x ; R- L. ^0 {8 OI have had similar problems. Below is an explanation I received from Ian 8 W8 k. a0 W, h0 b ( y; O2 A& H, _1 d4 ?Boyd 3 H9 ~* C# `5 o+ U4 l! n3 C5 E 0 Z, U# s; I3 q# N, g1 jfrom Mathworks (just giving credit where credit is due) that explains $ Z S5 b! g" v- `. ?' {+ e5 b" q4 r; _& Z8 Q
what's happening. You solution is to run matlab with the -nojvm mode. , `4 _, K) ?; U# u 9 }% M3 T, n" A5 z! x0 o6 p"The heap memory system in J***A consists of data and handle elements.- y- m/ _/ j6 } o& \9 Q
* x1 D5 L( S, i Z* h' a0 qWhen you allocate a variable you get a handle and data. As long as data- _ J9 F* T% c5 ~' t3 d
- T1 W0 O8 p) E/ t
has an 1 E; Y \* l0 v3 }9 F ( A H" R- j4 r5 U0 M, Rassociated handle, the JVM considers it valid and will not clean it up.; W8 ]4 r+ a! H+ o
0 M5 U* P1 D( k# tHowever, when you call the clear function in MATLAB, all handles are # |, L" \; ^6 N o" V 9 E: x; |3 Y) Fdestroyed, and the data associated is now invalid. This means that the ( \" o- \/ A8 e0 ^: s9 B# v9 T4 W, J5 M: O1 G
J***A " ~' T$ `9 s# g7 @5 ^0 z$ A+ ]4 T6 a3 _2 V t! u
engine can free up that data (garbage collection), but does not mean4 {* {1 [8 p1 u9 o+ a. f
% |& X; d4 t2 J3 ~. {' l7 L: sthat it will clean it up at that moment.0 F6 q3 Z$ ]# c D" f5 C
/ ~, q0 p7 e" C3 @ g( o: H
Calling the PACK command encourages J***A to run the garbage collector $ a- k7 c0 K! {4 Y4 l' | n - R( L; \( t, |2 {7 Nand de-fragment the memory. But it does not force it to (This is part a e. n3 W7 \* z2 G2 i3 ]
& A5 q, t- W& x$ K, Vof the J***A design). Even though the memory is 'freed' on the heap, 7 T1 G( Y5 D' o. v' ] ( y! F. W% Y$ q# t" m3 R0 Tit is not actually free to the OS, it is only free to the JVM. Here 2 {/ B( Y4 S0 m4 {, R Y. |) r# K4 ?4 Y
is one way to think of it: ; l, t. y" N2 g0 b3 W' [: \6 ~" J1 f# O! M. G+ R# O! R4 t
[MATLAB]5 c% c# n0 v: B6 D
[7 c8 t1 y- q7 D8 B3 W2 u) ^[J***A]* r) n3 J% [0 ^$ r/ z* M
: p- V$ U2 Q& R8 ?: q6 O5 z S) x
[OS] 0 d& P! N8 }* I9 p m# B ( R5 Q( S# m, c+ a" Q0 P# E- F4 r( ^MATLAB runs on J***A (virtual machine), and Java runs on the OS (physical ! ]& M2 x6 n. S2 t! F ; r9 `$ g- Q( wmachine). So when MATLAB is running in J***A mode memory allocations # g/ o% x- O5 l0 _ / [8 p& @. R) g1 Z& Qare requested from the JRE, not the OS. 2 W2 X5 E. O7 g }* d7 {9 q% ^+ V- W. [+ z
One problem you may be running into is that the default maximum J***A heap! K/ u; F9 V8 k' N
; _$ ?4 v' P& J1 @$ ~! }" j& Ksize is relatively low ( <= 64 M, so that is all the memory one session7 l; D! @/ O" m' Z0 @2 U! ^
/ W6 k2 Z5 {# v, b- M, O9 kof MATLAB will ever get on your system. . ?; Q9 N: e0 p, J8 k0 }( b1 c/ {- ~& |8 u, q9 C; z
The good news is that you can increase this value. You will need to create 6 b5 I7 c5 Z0 |7 R6 L' y/ U8 i+ }# d0 q" [2 ^
a java.opts file in $MATLAB/bin/$ARCH (or in the current directory when 0 t. Z5 b" L$ Q y; I / _; |* v6 D N' S9 E" I8 Lyou! O; w, q9 n4 s8 X
8 ^8 X' |( k; `+ ?start MATLA and put the following command:& x6 X9 b# J" C \/ r
/ R4 B1 J0 x" d
%%%BEGIN CODE%%%3 E5 l# T3 O6 R/ Q+ d9 c& j& [
) p5 j0 V* _8 t. y+ F4 S* f
maxHeapSize = 268435456) w/ M2 E, `6 a) ?6 n
Z: S6 S( H' ?7 P0 P% r1 q%%%END CODE%%%, l! ^% p- Y/ `& c) Z
# p" ~1 u! t9 i+ Y* ^- r4 k2 E" S2 ~
This will give you 256MB of JVM memory and you can adjust the parameter 3 i8 _9 S& z% S2 U Z2 b9 y' n
as needed. 7 d+ ~: ]6 h& p9 C9 _/ N6 a6 |, A1 u! y! a4 ]6 B( U
Note: $MATLAB is the root directory and $ARCH is your system 7 P# n4 q" A! y: w9 ~ 8 R# H( ?$ ]6 ?- p. garchitecture. This solution works on Windows as well as Solaris, Linux,: B" z% K" k* j( s
/ l& I3 ^% F0 z+ E( @Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with 0 f& k3 u. v7 e5 m8 { 0 @8 r; Y+ ~# ]a different syntax.$ e: P8 }! O2 \3 j( z/ E
4 p! P e% K5 v8 ]% C1 ]7 t
For the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are: 1 e+ I% |( t7 `5 y3 Y% g ! N; T m% s' pminHeapSize = 16000000 . Q% M4 T @6 c1 {; C! n, n$ Z+ K- [( o B: p) p4 _
maxHeapSize = 64000000 7 G% ^( R0 Z5 j+ W- v" B9 o& }, h) v* X0 ^8 Q% P8 ?; v
These are the structure field names in that correspond to -ms and + X/ v. M7 |+ Q. E" j. K 6 t, M! M" e& Y( ^, l-mx, and the settings above are roughly 16MB and 64MB.! K* a$ C& t, x) I( ~5 q4 F
, V8 s9 t( `8 l/ C% n
To investigate the Java heap a bit, ask via the following: * D+ T* `% \( f- D! ?, [ 0 T8 @ `1 J3 \3 _9 }>> java.lang.Runtime.getRuntime.totalMemory ' s. t) p1 l1 N' r r ( X: U! {/ s! \" Q9 y+ V& J& |! q>> java.lang.Runtime.getRuntime.freeMemory8 [/ v2 z( i2 Q3 d
S! t* f! u( L3 q4 U( K- x7 YWhen the free memory hits zero, Java will double the heap size (up to the* n3 T Y0 y* k1 {7 B) \
7 r% ^! j7 D2 g% amaximum setting). $ w; a* H$ }% I2 K" ]$ {6 h* B; C5 `! k L9 n2 B
If you choose to run without Java, you will remove the overhead of the# D* t c/ e3 p$ O# T
' D, S! [% O2 |' Y' |: cmiddle man, but you will also lose some MATLAB functionality (mostly * M; q) v' s* @5 F8 B4 i9 i4 ~- o* c* C. K+ C3 E
graphics and the Editor). You will still have most of the computational 0 s/ V" _ Z9 L7 K1 d& S% N# H' ^8 _7 T! e
power though. 4 v+ x+ G6 y" ~- U; d* D3 I; K0 t9 d" z9 S6 a! L; g
Without J***A, memory management will come directly from the OS, and a: N6 U: P0 _# C+ C! l
) V# y9 a6 v) o% S' R* m0 ]- P% ~
CLEAR operation will result in memory being freed back to the OS. z' T6 J, X/ x ( M6 X* \( ^ L21)如何在Matlab中添加新的工具箱?, i! ]; v6 s' X" i
7 D I6 {8 w5 G& d0 n) s:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #1 Q/ h* H" t! o3 c
6 y1 u# C, e. m8 n- Z
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。$ n/ [2 w& q% {/ ^& M% s: K" I! ~
3 e. n$ |" e# U$ X' t如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某 / q' R. K# ^* @/ Y2 }# q/ L, W. g- l. K/ X) x4 D4 f/ t. S5 ]3 ]
个目录,然后用addpath(对于多个目录的使用genpath())或者pathtool添% J7 J# A/ v: w, S0 ~7 C9 i" Q
# g5 T$ h1 r& ^8 V9 C" Bx.r(1,i)=datax[i+1];//给x阵赋值 2 W+ C5 @# H$ j/ W0 Z7 i- [$ ^: r7 U T6 ^
}5 A- C' z k1 H) f! d
( y X) u7 e9 ?' |6 Y" ]4 Otestwin(Fs,nfft,noverlap,x,i_o,Pxx,f_o);//matcom生成的函数 ( r/ T4 M. \7 i& Q: v$ X9 ^* c 5 I2 W0 u/ i$ _5 G/ r) y& [for(i=0;i<513;i++){//取出功率谱密度分析结果4 V3 C: X- y% ]' y3 F( C
7 I' E7 N! A4 ~2 Ldataf=f_o.r(i+1,1); * g( k; _6 i! w- \6 l; T: ~: L; y1 A( s
datap=Pxx_o.r(i+1,1);} , O% q" [: d& y. z' ]% Q* u# h # ^6 o0 o9 u2 N$ i9 s) x9 P" EexitM();, F& l9 S' R3 V8 _/ B) c
. X$ z n' n* T( x' a- ~return; # V3 d- l( f S# r1 G6 x! g% E! A1 n$ k
}7 @: P, A" c- o, Z& g z" O
' u2 A* P5 i& J$ n$ x/ ?/ N8 m1 U
可见利用Matcom进行M文件转换非常的容易,生成的代码可读性很好,以上的转换同时生成了可供Vc调用的动态连接库,其使用和一般的动态库一样使用。同时需指明Matcom不仅可转换独立的不依赖于其它M文件的M文件,同时可转换调用其它M文件的M文件嵌套。条件是这此M文件在同一个目录下面,如前所述的psd.m可直接用上述方法转换,生成了多个重载形式的psd函数 u6 R. q8 J8 J6 f/ Q3 J9 p ' e5 E# }% B. y+ P. y0 P" x. ~: a9 `, [结论:利用Mtlab引擎调用工具箱中的函数可节省大量的系统资源,应用程序整体性能较好,但不可脱离Matlab 的环境运行。用Matlab编译器进行工具箱函数的调用,须转换相应的M文件使其成为独立的M文件,且不支持图形函数,转换的代码可读性不太好。用Matcom 进行转换非常方便,生成的代码可读性很好,支持图形函数,且代码执行的速度比不转换平均要快1.5倍以上。以上程序在Vc++ 6.0,Matlab5.2,Matcom4.5中调试通过,以上方法在工程实践中已得到很好的运用。1 J6 r: r( k8 c/ s4 ]
7 y! b% Z) {) s R% V# v4 U% \% r b摘要:本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。% k+ G9 |3 @! }, i, D" i/ p h% C