5 j( a% z3 O6 [1 h5 S" d* n5 F' @% P' Y) S1.1 数字图像4 R% P2 e. m& E$ {; A% F) d- f/ }
$ z# C5 t3 ^+ ]# a
图像是用各种观测系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用于人眼并进而产生视知觉的实体。其最广义的观点是指视觉信息。例如照片、图画、电视画面以及光学成像等。人类的大部分信息都是从图像中获得的。 ! b) l2 \9 [) L9 z+ p ( @: ^, n6 X" g b, A用计算机进行图像处理的前提是图像必须以数字格式存储,人们把以数字格式存放的图像称之为数字图像。而我们常见的照片、海报、广告招贴画等都属于模拟图像。若要将模拟图像数字化后生成数字图像,需要使用诸如扫描仪之类的数字化设备。模拟图像经过扫描仪进行数字化后,或者由数码照相机拍摄的图片,在计算机中均是以数字格式存储的。5 |% F/ Q1 t2 u9 _5 s$ x
4 ]! ?- q( Y5 `' X
为了把图像数字化,必须进行在空间点阵上的抽样和灰度量化两个方面的工作。被抽样的点称为像素,抽样的精度随图像的种类而不同。这样一来,所谓数字图像就是灰度值的二维数组。一个单色静止图像可以用一个二维的光强度函数f(x,y)来表示,其中x与y表示空间坐标,而在任意点(x,y)的f值与在该点图像的亮度(或灰度)成正比。一个数字图像是图像f(x,y)在空间坐标和亮度上都数字化后的图像。可将数字图像视作一个矩阵,矩阵行与列的值决定一个点,而对应的矩阵元素值就是该点的灰度。这种矩阵的元素就是像素,所对应的灰度就是像素值。 # E( }4 A6 S5 j$ n/ R! k' l / m; I, E6 X% M; v4 }* [; ~表1.1是以数据结构的观点进行分类的图像种类。即在光谱方向、空间方向、时间轴方向上增加维数的图像,可以用多个二维数组来表示。在这里,不管是一个数组还是其集合,总是要组成用计算机容易处理的形式。因此在传送和复制时,只要在计算机内部进行处理,就不会被破坏而能保持完好的再现性。这是数字处理的一大优点。 5 Z& l1 c4 `0 m : C2 P, V3 Q$ N) k6 v8 @0 J表1.1 图像的种类# {1 E7 v# x4 P9 F
) m' I+ P/ V R2 P: d: r7 m
种 类 9 m c! L9 b+ [- @ % H3 c4 z1 H# T5 E 0 M; b. C" E6 I" n
7 X w' S! a9 S# I! Y- _# _
形 式7 _5 U$ x9 i& H1 y! r
; x K2 L: I0 h: K q$ x 6 J/ ]2 }- `: A. w/ l # R c& m g' O2 ~# _4 Z% S9 t+ p备 注7 y3 d, C& M5 d( h$ C [+ Y
( u) b v* g* s! `2 e, O7 \
二值图像 E* A* D# f: A) T( p& Z9 o" |" I+ o2 K
/ t+ e9 n) C/ p* q. n , Z- Y6 m, k- I7 C6 _6 bf(x,y)=0,1. W# e+ F! E c1 V% S
, V. X. w/ N4 [' W. i: O( q
$ [+ R" E. o6 ?6 m; C. v0 k$ ]0 Q! K6 ~, Y4 V/ v+ U
文字,曲线,指纹等# g, ~* G. u u, w4 S
' C$ G; ?! F- `; l) w灰度图像% c7 @& c9 x8 d8 T
5 u, F& T& P T+ J2 R+ n/ M! b I( K& ~" _8 Q" U " v c( | M& h8 Z& r0≤f(x,y)≤2n-1 7 Y& z% M7 J) v o* F+ o. d$ A) _% G# Z* F1 J6 N* P
; M2 E( z0 N# L, a( s/ E5 Q' F
7 B$ G( ?* T2 O% u
通常的照片,n=6~8是标准的 " Z; ~ Y+ o( E% i! n ; \% P% k/ g& y5 r彩色图像" W! p1 E8 g1 m& T$ ~ g: ~2 t8 W& y
e1 x. S3 {2 W8 \ . X7 z" c5 H& J 6 K4 P. |& _5 t{fi(x,y)},i=R,G,B$ Q4 V5 f D' i6 @- z t( ?$ E0 v
5 x. B' N+ i' {! C
4 d, k8 F/ A& {- g0 x3 I5 I5 \
+ I% x/ }& @+ Z根据三基色的表示 . b' g" X0 v- |% N9 X" k 9 E% i% O3 N' ?& c1 w9 L多光谱图像 # d) E' |! q: c4 b+ C* u$ i- u; H' t: A
/ q( @5 ?4 P1 q: u" `2 `2 u. K8 K8 }3 l' _
: h3 @2 t: ?) H8 }: B图像为m×n的浮点数矩阵,元素值范围[0,1]0 M( o9 s" H6 x
/ {5 a" D4 k' U7 x- w$ c
: B9 l( ~4 A: J+ ?% H% f3 B- m
N* v- q3 I- o% P2 p5 R图像为m×n的整数矩阵,元素值范围[0,255]或[0,65535] $ Q7 @. Q+ D% q" U5 @) D- V. T8 M- p" H+ H* R
RGB图像5 F3 b6 F. X$ [! X/ ?; \) P3 k
8 ~' x8 `( m" s3 i9 U) c
. l4 z' E7 B& L" a" f- I' q o
/ v( ~, C @$ K, B* }
图像为m×n×3的浮点数矩阵,元素值范围[0,1] 0 p. w! A, f& w- v 8 S7 F5 o |) _ $ ?4 N0 ?- A0 ^5 k* ]. C
1 x; v+ r2 n& c8 E3 E( c( g
图像为m×n×3的整数矩阵,元素值范围[0,255]或[0,65535]4 @/ Y, o8 j+ N
]8 g: |5 j% ~4 z1 `* [9 t其中,多帧图像阵列是由多帧图像组成的,每一帧图像可以为前四种图像中的一种,但组成一个多帧图像阵列的图像必须为同一种。cat函数可以将具有相同尺寸的几个独立图像存成多帧文件。对于多帧图像也可以从中提取单帧。' Y1 {/ v% O: z; n
% e' _. S+ s9 O) B
2.2.2 图像类型判断及转换4 N! o( Q$ c# h2 G
: O, i4 N1 i* V- k$ U+ h
1.在MATLAB中如果要判断一个图像文件的类型,可使用如下指令: 3 T Q# ~/ n x/ @, H$ e6 b e; W1 a: x R6 a# T
l isbw:若图像为二值图像,则返回真。 $ o7 ~2 ~+ }( l6 M8 J! Y* \& i5 ^9 N+ S8 h
l isgray:若图像为灰度图像,则返回真。' l! W6 o9 i* |/ L' Q2 i
& w8 Q7 b( [ t6 q z) r x
l isind:若图像为索引图像,则返回真。 4 y4 ^: C" ?2 S% n8 {/ z 1 t! T+ ^0 n1 H0 U! c) C }l isrgb:若图像为RGB图像,则返回真。" f* C- U- J# o/ i. N( A# k
/ D; r& D5 n# J
2.在MATLAB系统中,要将一个类型的图像文件转换成另一个类型的图像文件,只需将前一个文件的图像数据用imread读出,再用imwrite以适当的格式写到后一个图像文件中去即可。另外,要将灰度图像I转换成RGB图像,可运用cat指令。cat函数可以把一些单一的图像合并成图像序列。在图像序列中每个图像需有相同的大小,如果是索引图像,色图也要一致。 ; O; Y. c0 w( \" _+ o' S1 u # W: w& v1 Q3 a6 |4 y此外,MATLAB还提供了若干函数,用于图像类型的转换。这些函数有:2 M0 n2 K0 t: @! e7 n( o
# `6 R0 W' L/ }8 J* T- t: s R
l dither:用抖动法(dithering)转换图像。该函数通过颜色抖动(颜色抖动即改变边沿像素的颜色,使像素周围的颜色近似于原始图像的颜色,从而以空间分辨率来换取颜色分辨率)来增强输出图像的颜色分辨率。该函数可以把RGB图像转换成索引图像或把灰度图像转换成二值图像。& q! E, Q3 X: w P
. ~' [; U ?* R) w( Kl gray2ind:灰度图像或二值图像向索引图像转换。. i& Y" y: R, C. q
4 G) n' b- r! p
l grayslice:设定阈值将灰度图像转换为索引图像。, J. q9 W' T! \ a
) u0 w }3 `* `
l im2bw:设定阈值将灰度、索引、RGB图像转换为二值图像。 q8 U, J. k+ \" H) ?$ J' O: K, C( r. `0 d4 X& `3 P3 d5 m
l im2double:将图像数组转换为double型。 ( \1 l6 W; w. w# }3 g. ^0 l9 n6 w, J p3 W v, B* h% W g
l im2uint8:将图像数组转换为uint8型。 & q- t0 O: n# ^7 O7 V8 a, V5 I8 K1 P. n8 [; [7 R
l im2uint16:将图像数组转换为uint16型。该函数不支持二值图像序列的转换。6 j6 U1 P. g& g' J6 k
8 Q( L8 k+ a: r5 i, q4 H+ j+ il ind2gray:索引图像向灰度图像转换。' M6 _2 ^' J' C% F
% x$ G* x3 p4 R8 B6 ^l ind2rgb:索引图像向RGB图像转换。 - F2 @# R. p7 Y& g" F7 Z# x" V' ]8 S8 d0 z$ k
l mat2gray:将一个数据矩阵转换为灰度图像。- h: c/ S3 Z' e+ q; o% ~! a
- p4 S( S" I. n1 q5 b0 d: C( ^
l rgb2gray:RGB图像向灰度图像转换或将彩色色图转换成灰度色图。+ z* F/ d) Q: _
: d; F2 [- L, t. C# ?8 X; K: g. ]
l rgb2ind:RGB图像向索引图像转换。包含三种不同方法:均衡量化、最小值量化、色图映射。 ( S# x; _9 }" J) q! `; a) j& C ! Y- r4 A, e; q/ @ \% Ll im2java:一般图像向Java图像转换。: F/ ~ ]/ ^5 F, g& P7 }
2 n7 V9 n' {; [% m8 ^5 a) C矩阵转置:'5 t r2 ?) N: A0 P, r9 S' t& M& u, V" C
" j+ g8 C! L' r: j+ J: k
矩阵求共轭(实部相同,虚部相反):conj(X)" H u8 ~: R8 `- j5 r7 F* [
) @4 g+ ^2 o$ }1 `: h5 _8 H
矩阵求逆:inv(X) 9 L4 G0 }/ A9 g+ e7 S, c$ ^+ W1 m2 Y: {0 ?
级数的求和与收敛$ i S, @+ m, Y& \0 [6 N3 y5 Y g
6 |: Z; l+ {; a+ Fsymsum(fun,var,a,b):其中fun是通项表达式,var为求和变量,a为求和起点,b为求和终点2 v; u7 m. K# n k
2 m5 O+ V6 o _) U
例如:I为1/[n*(2n+1)]从1到正无穷的和,求I 4 u: ]2 K' [7 p: N. Z. w. x! C. _' G
syms n; 1 }& m3 h1 R& m, J/ V; s6 v$ H, ?# J6 s& }1 Q% r7 n9 n7 p
f1=1/(n*(2*n+1)); + K; U% j0 p( t# A * ]& C4 P' Z& ?5 N+ QI=symsum(f1,n,1,inf)2 z; F) m6 l9 ?% ~5 e
6 u+ R$ @4 \$ `- j. f1 X8 z3 J3 ~计算结果为: 6 z: T0 L$ W. C5 i( A 5 ]- p! [7 W' B. vI =2-2*log(2) % P; z2 K5 |7 z4 ^$ i* ~5 V7 B: s0 p3 B5 k2 Z% L j: d
空间曲面 1 b2 i! s% B2 o # |+ a! M8 p; C. d7 f7 M. B+ xmesh()函数语法:7 d# F, B2 l( n: k8 D7 G3 b4 F
! A6 I- S; B4 i0 \- Z% j1 xmesh(Z):* _( ?6 y6 I, W5 i
. L- m; f: K6 H& y6 b2 L4 Y38).Matlab中如何求解广义积分?即积分限到有无穷的或者有歧! b. [) l$ t# c+ p
5 C% y3 V+ v; A9 d. D3 P' b
异点的积分(瑕积分)? : H5 J! I7 V4 b" r" M7 l* N1 S4 r* P, \1 h( y1 H
39).为什么我的Matlab程序这么慢? 6 H+ C- e3 n" Y& k& _ ( T" }& f" u+ s40).Matlab中如何作线性拟合/线性回归/多元线性回归?: G2 Y. b! F! G/ `* [
# I2 f6 Z0 B) w# Q" e# ?
>*****************************************************************************<5 `. S8 b8 D3 X' i
$ T" O, _9 i3 K& l% D* o) a
Matlab的常见问题) e& `8 y0 j0 _
; o4 D) ~+ ]6 u8 O5 k# @7 b. J" \( F* A
>*****************************************************************************< 0 P e0 X6 U+ h; q) i) V) \ 8 b7 y+ c; D8 V! x4 Y% b===================================' w* x( T4 G2 R7 B7 w- w+ ^ @
; x1 x0 K0 u2 P, v$ h1)Matlab 6.X在Windows 2000/XP上无法启动 n3 |4 L2 L( k s* d! G! e5 \7 U+ q1 n! ~1 U$ o. z- s, h# ~! K
:#highsun,2001/3/2, SMTH/NewSoftware #/ _! N8 W# L9 b1 J% ]
4 U8 v2 B- `( i; D0 \ N0 L
其实也出来很久了,不知大家有没有注意到. 9 y D# m# j+ S. I$ L6 o1 H $ Y# |* a0 }0 O; i7 h( A+ L7 y虽然是针对繁体中文系统的,我试过在简体 ' K* ^+ F/ U5 k 6 `: ~7 V2 i% Q中文系统下一样可以用。0 o- ^! P; O3 d7 H+ G; O6 p% k
9 T. W- ?$ i6 f: u- d# N5 m. { http://www.mathworks.com/support/solutions/data/26985.shtml / z* n2 W1 f$ {2 I, A$ R% P 1 x* O5 S% X& jhttp://www.mathworks.com/support/solutions/data/26990.shtml- F2 [7 y4 P* I0 Y) i
7 d' v1 M [, x: e$ YSolution Number: 269905 t6 S2 O3 A% N8 g0 Z8 Z7 _( B
6 f! g; n4 _+ M7 y7 ^Date Last Modified: 2001-01-30( j# y |+ U8 b8 G- O$ M# s6 \
3 C2 l( ?, ^5 @4 s0 t; M6 F0 }' {
Product: MATLAB 6.0 ==> Current Version : I) d) O9 D7 e4 u( m3 a' J) P/ p5 S9 K+ _8 g" H
Platform: Windows6 f- }6 P, H9 G6 l h
9 a; `8 L0 b. J+ C( S
Problem Description( d: O6 u+ O# R ^- B7 I5 E8 Q
1 k, ], p0 j( sWhy do I encounter problems when running MATLAB 6.0 (R12) on Hebrew6 c7 M% {6 R; w) u
! o9 B8 |) }0 S
or 7 ~5 t9 E% n- s' x# x l2 L* P( b' }. r5 A) _6 v7 u
Traditional Chinese (Taiwan) Windows? I try to start MATLAB but after: {9 [* @* t: W( @) t
+ \8 A% ^. G0 h. A! ?the splash screen disappears, MATLAB exits. - K/ Z+ k! n: P0 A# l+ \ ?' I8 N6 O8 G0 S E
PLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a # N: y$ z7 f! n! Q* d 2 K0 L, @% C* r8 o' D+ }similar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0,3 H/ j" ]. ?. g8 U8 |- x- T1 t
; x4 e0 b7 {1 G7 w3 r }$ z
see solution 7213.6 q! b" |6 S( l6 U
- \; l6 |8 f: ESolution:$ Y: |' \4 u% U/ i& e, p, c" E b0 _
7 n; B" w1 j% N' \This problem is caused by a bug in one of the font properties files we ship: I3 D3 f3 i. c/ J7 \, q
' X( L2 C, a: v7 U" E1 x! Ywith MATLAB. The font.properties file is used by Java to map the standard ' j8 V4 l: V" Y* k5 {0 ?# v+ ]) m' a1 S7 X' w% {
Java font names to system fonts for a particular language operating system. ; D- @$ n* d! L7 ?* S' _ 6 h, G3 q t/ u9 N2 q3 tHowever, we made a few assumptions that do not hold for the Hebrew or" X5 \- ?, p1 c( ?5 o, a5 p
3 x7 c: Z& Z5 k' h
Traditional Chinese Windows, causing this problem.: J& Y R# L) C- W
3 K. D& N' b. ]0 F. y5 k( tWe have created a fixed version of the mwt.jar file that you can use to0 ^& v8 c) c o, V5 `
" p: {4 a8 W- H9 |correct this. To use the fix, first rename your mwt.jar file as mwt.old. - n+ t1 x- K/ z3 d; A c. I6 j ; d( H. B# y3 qThis file is found in the $MATLAB\java\jar directory, where $MATLAB is your6 _0 `/ x# C+ @) c4 F. k+ ]- M2 D
: Z! l' ]. A( z$ g' x6 |6 m) hMATLAB root directory. Then download the newer mwt.jar file from:4 s. N! w6 d9 n* t
- \! L! e" q' N* u8 g- P7 Z ftp://ftp.mathworks.com/pub/tech-support/solutions/s26990; n8 h" H# e* N: g) l) R" A3 q: j
' C/ J. i) z1 w! m
and place it in your $MATLAB\java\jar directrory. Then restart MATLAB;, h0 ^- l* o$ n. z3 }3 H! z
0 q1 _$ c" h( @6 y: B% ~' _" q
this should correct the problem you're seeing./ U2 ?. N3 k* G& U& [
. O8 p7 k7 Z# e
2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? 3 u0 e) q n P: o0 X 7 m: [3 ~0 g6 k6 x:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools # 1 R3 n5 ?3 a* G$ } 9 D! y h) a8 b C E& I参见第一节问题7)$ @0 Y2 `8 H: W$ E0 Y
8 i- ~6 E9 ~1 M3)如何在给定句柄的axis里绘图?! R3 X8 K9 v4 G. M M, f! k E" ^
/ f: p2 h) x3 }
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # - X: r, G1 a( q6 U" B0 q. }0 n" x+ Q. U- C& H) i7 q/ T4 j/ d
plot(data,'parent',haxis); # C! F' l% E0 }3 V6 |9 L. S2 p; m8 \% Y5 j0 R& y0 ^% B
或者, U% @! ]) c3 S1 k
# ^; b+ E- ?+ o* h3 q( A* L0 Shbar=bar(data); ' k, t" {; w M# ?1 g ' S3 g5 I& B' w3 X7 o A$ O, ~$ xset(hbar,'parent',haxis);# P' B- |7 E% O; j: c9 @. F
z/ t4 z! v# e4 h6 u" _(i=1~n) + p) u" B- D3 C( { + B% z/ j% s- k3 h9 w/ d' r|x11,x21,…xm1|1 A+ v$ ?% X9 w# {8 [
D6 }3 B' P5 W6 M( n2 x
A=|x12,x22,…xm2| 6 g/ u Z5 E' H5 u) f% b5 J9 U1 Y K
|…………… | ' H" E) u1 ?6 d, E/ ~0 j1 ]6 ]. |6 A5 R, f+ H1 z6 _" s
|x1n,x2n,…xmn|7 l! ^/ m$ n2 n: q
* R) X/ C+ m) \. d+ j ?% f9 K
Y={y1,y2,y3,…,yn}' & w; u4 a0 P: B. G# x) u) Q. p% k2 n7 m& Q+ J# o
则系数{a1,a2,…,am}'=pinv(A)*Y . E; G2 r- ?6 F7 h" S 6 m; Z) b5 @8 ^% c7 u* m, H/ W* @在matlab中使用 # X$ a0 c2 J* y. b( h, U" B$ D0 U$ @# f/ D
coeff=A\Y& z1 F0 z9 v8 o# {7 O+ L
, w! ~1 M R7 s$ ~; ?
则可以得到最小二乘意义上的拟合系数 8 d; ~5 ~) q3 L1 z1 ?4 L8 h# l, t# E3 D# X
7)Matlab中如何作圆回归?! _( o. P/ _& E% C
, @# G0 p, K6 Z. x6 F( [7 a+ J:#Peter Boettcher (boettcher@ll.mit.edu),2002/5/16, comp.soft-sys.matlab# ; b$ T7 m0 P5 a0 v0 ]6 F4 S4 H7 [5 C# X ) r+ q+ I. b8 Y) JQ5.5: How can I fit a circle to a set of XY data? ' y6 ?2 V# n# f( z0 Q' A + Z1 B. d& V& ?! L6 ]( x0 Z" O. v1 k=================================================6 D7 \: t+ k2 i( s! B
2 z& M; Z: r4 {# _
An elegant chunk of code to perform least-squares circle fitting was 8 ]5 B R: c: \. t' z2 U: n4 f) `; Q2 l
written by Bucher Izhak and has been floating around the newgroup for) I& A$ L' ]4 R+ a
: d- I0 p. L: c$ ~. g
some time. The first reference to it that I can find is in: 5 n* T- f6 y1 c0 i ; F& K: K$ S# X4 e) ofunction [xc,yc,R,a] = circfit(x,y)- J# e2 F) l; P
9 G, u% O% G" K+ S* w/ H7 ~
%CIRCFIT Fits a circle in x,y plane* W/ O5 Q2 M$ g6 P$ c
( ?, y" v# `* O' N% F7 e
% 3 w! T4 j' W8 m2 k! k9 d2 i/ h6 K' Z+ P1 c
% [XC, YC, R, A] = CIRCFIT(X,Y) 2 S* S8 r. P1 r# D5 } 5 { W3 n7 L+ b& s# C% Result is center point (yc,xc) and radius R.A is an optional ( F1 K3 y, t, ^6 ^' ]. L. D1 V1 h4 p: r" l- G
% output describing the circle's equation: ! ?3 o1 E1 ?2 C $ e: h2 _( u% C2 ^' J%9 t! p$ @/ ]) ^1 q1 ^* Y/ F7 ^
p* @9 Z/ `. I2 R( J- K0 d% x^2+y^2+a(1)*x+a(2)*y+a(3)=0% G; u" H) M, L! B n, d# P( \
: ^4 Z0 g4 y" b$ W, k% by Bucher izhak 25/oct/1991( z# O; j- t/ ?8 ^ V: S
! _4 M' P; B) Z$ `/ Z3 q- I$ \n=length(x); xx=x.*x; yy=y.*y; xy=x.*y; 9 F, d: {3 h3 D7 p& {6 w$ S4 p4 B/ M& m: @! w! `
A=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];) D) N1 |% }0 o. B' n/ ]) f
3 |0 Y* _: W& m$ @
B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)]; # S& I" x* m% Z* C 8 I- U$ x3 F) J7 Y9 Wa=A\B; 6 b: g; \" @% l: w& j% _+ D 6 H0 z* q [" M" a% V( V5 e$ Yxc = -.5*a(1);/ v$ a) C7 ?4 y; m! F; Y
, U, p9 n; A% y1 v
yc = -.5*a(2); , b! t8 M1 {( F7 R0 e& n, \, W4 C) V
R = sqrt((a(1)^2+a(2)^2)/4-a(3)); % H3 I3 P- \. T. b6 [8 l" K7 j" I6 R! J S4 r9 r- K, Q$ N
Tom Davis provided a more sophisticated approach that works for more7 g- y% B/ H8 R' m- Z9 x
/ A- d0 Y5 {1 \6 e
cases in and Code included. . q( ?* ?+ o9 M. c8 y4 E + a; n+ _( x, L4 W. o- B8)Matlab中如何绘制箭头? 5 i; `- h( g; m3 F7 \ n0 {. q9 `) K% x, ?# ? i
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, SMTH/MathTools # " t3 f R2 L! I. }! a + \# ~& L5 s8 d8 }$ L6 B/ ]6 B到http://www.mathworks.com/matlabcentral/fileexchange/index.jsp 1 Q5 M- l# F0 W0 G+ {! }" e: ~$ Q* `( Z
2-D Plotting and Graphics中查找arrow.m,或者 7 |% y, ~( T4 G5 C) `) m / \( s7 |# a5 s, W. vhttp://www.mathworks.com/matlabcentral/spotlight/arrows.shtml ( W* C* }& b8 F3 |* L' x+ M9 G $ Z8 e( F" x4 lhttp://www.math.umd.edu/~jec/matcomp/matcompmfiles/mfiles.html9 c, g6 X6 Z& a# M4 ~
0 }. w7 v$ d1 @' V8 U7 I* z9)Matlab中如何作二维数据的插值? / g) k7 e1 w$ g2 @. G) b: K8 u5 D9 @+ G' h# m" |
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #9 ^2 z+ Y! Z! \, n. z3 T1 Y
2 ~' m4 _; v* c+ c* T$ k! r
对于一维、二维、三维规则数据点阵使用interp1/interp2/interp3, ) P% H7 w2 t c$ R/ M $ g# \. x" R6 ]$ v# `二维、三维非规则数据用griddata/griddata3 ' M% I" x' z1 E5 a ?2 h+ U8 I. n. b0 x10)Matlab中如何绘制三维数据阵?2 n" t# T( K4 e' `0 ~
( h2 M& j O( r0 n:# chenft (mike),2002/6/1, SMTH/MathTools #7 C% K8 z- H, U$ L
2 [7 o! i# A0 ]
I have had similar problems. Below is an explanation I received from Ian- \. Z* x" F9 c# c
$ w! }4 d9 G* Z' p
Boyd" g6 ^+ e1 L& n3 L' ~
6 e. r8 T* h+ R5 L0 }8 N5 y+ kfrom Mathworks (just giving credit where credit is due) that explains- Y7 i1 H& T; h; ?* U ^
9 E8 m; S# `& T) ?" g. |
what's happening. You solution is to run matlab with the -nojvm mode. 0 o6 p9 `$ G# T7 _ t% `, h6 ^4 B+ {9 X$ M$ W
"The heap memory system in J***A consists of data and handle elements. 1 `4 {, U. {! A) f8 x; _# u ' V) U6 V5 s* U1 f3 V% [: \! Z/ ?When you allocate a variable you get a handle and data. As long as data ' h- J! L- d7 J1 }* Z 3 r* S) w* B( Z: B& Z( Ghas an+ N1 R% S. F2 ^
' A- [( L- K0 ^$ h3 Q2 p
associated handle, the JVM considers it valid and will not clean it up. / A4 Y9 K5 s H * i) v4 l9 L% h3 y9 o- dHowever, when you call the clear function in MATLAB, all handles are 7 }& u/ R$ X8 F; _1 e) c! R+ R4 E o$ A 9 ~, Q9 j% s+ {! h9 Sdestroyed, and the data associated is now invalid. This means that the 0 W% ?# ]9 T0 V' L B0 b/ k$ v5 _ 5 ]7 b. q- Y' p4 d" O* {J***A % `+ s% c2 c$ }& ^ * i2 q+ c2 a4 k9 f" C" v& g- P6 t) [engine can free up that data (garbage collection), but does not mean& _3 f$ y$ [% D! _8 h
& S% p! q2 i( uthat it will clean it up at that moment. $ M; e8 L2 r: g$ @; a3 M 5 C; G" P) A4 [# ]Calling the PACK command encourages J***A to run the garbage collector: g2 a/ J' D* ^. w4 h
4 u& x4 g+ R( j9 v
and de-fragment the memory. But it does not force it to (This is part% G) ~ ^) f( K# w) h' U; V% S& G
7 p3 o" d5 V7 z6 l
of the J***A design). Even though the memory is 'freed' on the heap, 9 z& G9 d: f+ K0 ?) l2 c- n9 e* k6 {3 \ s
it is not actually free to the OS, it is only free to the JVM. Here# `! Z: @# o' Y" O& _! H+ q: d
% N3 F0 x4 I; I% m u0 ], H
is one way to think of it:: ?6 S' h1 c6 T$ A; c
: w, ]- L# j* q
[MATLAB]# w. v$ ]) ]# H& \( x
- e8 Z. w: Y0 \4 t- u0 K' p[OS]# W+ U5 [. H, S' B; ]
: ?0 p1 w" }% _# D5 Z9 z
MATLAB runs on J***A (virtual machine), and Java runs on the OS (physical! R r; l9 G, j5 Q @7 y, e
2 g4 ~/ A5 b5 T. c9 |1 H$ h+ Z' c6 zmachine). So when MATLAB is running in J***A mode memory allocations ; a: G* Z! q3 j0 m" l- j. q& x U# t 4 N# V! i! i8 Z0 Y! G' U" D6 v/ m( Yare requested from the JRE, not the OS.2 Z+ U. W! n- N: R" ^
) a6 M7 p. _. `$ h. V5 J# N
One problem you may be running into is that the default maximum J***A heap 4 a7 ^; e' s: _ 3 Z h& k) U6 {0 y5 P. psize is relatively low ( <= 64 M, so that is all the memory one session + @- o% z2 W2 r1 b5 T! \ 2 ^, J0 ^8 {" m& f' Eof MATLAB will ever get on your system. 3 H& n6 ~3 Z. M7 ^/ {* X/ e. i8 `* s5 p / J6 Q. o0 c$ D" V: K+ m( M! cThe good news is that you can increase this value. You will need to create ) y) A% ]+ Z; H2 [2 d& M 4 _& w3 i1 a$ za java.opts file in $MATLAB/bin/$ARCH (or in the current directory when 9 O0 p. O+ R" R+ L m - X M* B c; T- n$ |. P/ R( K" C- qyou . D& `4 H% }! S : m0 r6 F* W+ x& tstart MATLA and put the following command:, B1 M% j- n6 `. R( v
: c, J7 P- A2 Q' x
%%%BEGIN CODE%%% # T. ]- ^9 J! m; } , ^4 ?5 S) S1 L% y4 n3 |1 F+ r! YmaxHeapSize = 268435456 / t) ~; L2 b* T# x6 E) A( r0 ]9 f
%%%END CODE%%% $ S& B9 B: y$ Y: B% C1 u% [2 k; h+ w 9 I5 M, K- \; w$ PThis will give you 256MB of JVM memory and you can adjust the parameter( w9 U4 m0 @. y/ U: U2 {' o
, ~% Z+ o" f% u, l5 ]+ Ias needed.1 r" {$ d0 |; N4 k
0 W% s: o( i6 @% q, R qNote: $MATLAB is the root directory and $ARCH is your system8 O/ C7 ]8 j2 `1 d
" v q i) n/ I& Zarchitecture. This solution works on Windows as well as Solaris, Linux,' {) D+ A0 M. a; s& w/ G9 i
* r1 Y9 t; {! l$ y: x
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with3 p8 C2 R. O& O9 X
* D: ?3 r e* N% }/ K3 ]
a different syntax. 9 X# R% c2 ?% L- |3 G( Q; Y+ }0 @ ; H! @/ |. u5 \- N, k* [% iFor the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are: 3 z) F" X3 ~0 H( r! X6 h % v" I; J& [& F0 \minHeapSize = 16000000 / d5 n0 q/ l/ J% J$ O% z& O: s" E8 B8 s b z+ A
maxHeapSize = 640000003 X4 H# ~- J8 j: q0 ?) O7 F
# H" T, E$ {: I* k f
These are the structure field names in that correspond to -ms and3 v/ a: F- g3 Z: b% q
/ ?. Z9 `! s* y: \, o% J7 ~
-mx, and the settings above are roughly 16MB and 64MB. ( t- m& B5 K% B u! i% W: v( [: O- T" r+ d$ B
To investigate the Java heap a bit, ask via the following:0 x& |2 P" y' o5 w+ x
4 [6 s$ v: |: k1 {9 i# ^! W
>> java.lang.Runtime.getRuntime.totalMemory/ w: n$ G0 O! J4 V# T2 u4 D
% r8 R4 \( c0 m, d5 c9 R4 M$ M# h U
>> java.lang.Runtime.getRuntime.freeMemory& M1 B, o9 Q% e( h% G
8 Q1 U7 A) X$ B( n/ I: p" U5 K
When the free memory hits zero, Java will double the heap size (up to the - ~4 H0 D4 k; d+ ]5 S1 Q+ P0 I1 H) o
maximum setting). ! Y; h6 k: i4 V* C3 X5 k$ l9 ?6 z- ^( ?/ r6 k; j
If you choose to run without Java, you will remove the overhead of the 1 f" h) J0 e4 ?* g" Z8 S, Z2 J2 S {) \; y$ z7 d
middle man, but you will also lose some MATLAB functionality (mostly 6 N& G& Q7 m' \4 S3 T- U: i. k( f6 W1 T. ?2 U/ {
graphics and the Editor). You will still have most of the computational , @: P) Y3 k2 O6 _" f) t$ P% Q c6 f6 `. x0 |, P" h
power though.( K6 Z& ^& ]. X3 q" @( n
* q* U5 Y9 [# _ SWithout J***A, memory management will come directly from the OS, and a6 V$ A+ @3 m- C6 E$ V8 g5 {
% j, ~& ?4 c* s, t
CLEAR operation will result in memory being freed back to the OS. 4 Y! ?* ]4 I, r) Q" s! C* V 2 E* b7 q+ L1 l, ~- J21)如何在Matlab中添加新的工具箱? . C) U3 p3 p6 \. ~8 @3 A7 ^, W ( B% y" Z8 O9 M; l" W4 b:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # 3 R M7 ^" D9 l# e! m+ E 7 j9 r7 K7 Y7 [如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。5 O: G! A* Q! e; f; p: t
$ } i- M, P5 D- {7 }5 v% B/ t
如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某 8 x. d4 g, M6 r) x: X/ U4 q/ {; u ) r. p( ]8 N3 I2 v& X个目录,然后用addpath(对于多个目录的使用genpath())或者pathtool添 5 k& |9 O# A$ I; o7 \8 q2 w8 P; q* w' K8 b& t, g
加工具箱的路径,然后用which newtoolbox_command.m来检验是否可2 ?" ?* B4 a. c8 Z
: _* |5 V. x7 \6 G" r! l: O
以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。5 i; l( U. i6 G: x5 J) C
0 n% ~8 _* @% _8 B$ y* \
具体请看工具箱自己代的README文件。 / M: f! }5 z- ? 3 a; P: f3 q6 u# f1 M! K22)如何读写Matlab的.mat文件? 9 J. \5 m( \% v% S2 c4 Z6 o: b 3 h6 n0 Z2 q& \: ^/ ]) X! @' B) |:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #8 n9 I2 r9 w; D% |' w1 J, [1 I
' F- ~) P3 c" u2 i4 E" _. QmxDestroyArray(mFs); 4 Q0 D0 `6 P( l! h# y; |$ K; L. E4 e8 M7 {4 z
mxDestroyArray(mnfft); ! }/ E0 Y7 s* W 7 K/ @8 o6 Y/ V( l$ I/ LmxDestroyArray(result); * ?2 y0 Q" X) ?; `/ R : {: I+ Z* Z( iengEvalString(ep,"close;"); : Z+ x% v9 e* q1 @& \3 r1 u. `' i* S) L4 c( r1 l2 B+ {7 m
engClose(ep); 1 d! q$ P$ {' G$ e2 d$ P" B7 M6 R% W3 X9 f7 d+ m3 V
} 2 }1 C+ v4 p5 k3 W' d0 B4 W5 L * {% L$ l% c4 Y8 I上述程序在Vc下编译需要将 libeng.dll和libmx.dll两个动态库利用以下的命令: 7 V0 x) | ?1 s0 ~- n: p7 u G2 E' k1 T3 U. c5 E
lib/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下即可。 8 w* i6 H) f) I+ _+ i3 H/ t* f b% \* @! v
利用Matlab自身的编译器调用工具箱中的函数, ~, K+ w& |6 `8 d
4 L( k! l1 w/ o2 W9 {
d% h5 c5 P- k; X% y3 a: t
/ N: N) p- m$ _4 [3 t
Matlab的编译器可将Matlab的M文件转换为为C或C++的源代码以产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,不能调用Matlab工具箱中的函数,这非常不利于搞一些特殊的算法。本人研究了一段时间发现,工具箱中的函数既然是M文件就一定可以用编译器来编译,以提供如Vc的调用函数,但是编译器只能编译一个独立的M文件,即这个 M文件不依赖于其他的M文件。如果M文件中又调用了其他的M文件,可将被调用的M文件拷贝到调用M文件的相应位置,作适当的改动就可以用于编译器编译。编译器不支持图形函数,所以M文件中如有图形函数需注释掉。5 b$ k! `4 I! i: k, u9 v6 q
7 e5 A+ W# \3 N
当Matlab的编译器mcc加入适当的参数-e(mcc –e *.*)或-p(mcc –p *.*)就可生成将输入的M文件转换为适用于特定运用的C或C++源代码。这样如果要在Vc下编译通过,还需连入以下几个库libmmfile.dll, libmatlb.dll, libmcc.dll, libmat.dll. libmx.dll. mibut.dll 以及Matlab C MATH库,建议采用前述的方法将动态连接改为静态连接。对于C/C++编译环境的设置,在Matlab command窗口下运行mex –setup 然后依提示操作,而对于C/C++连接环境的设置,运行mbuild –setup依提示操作即可。7 o& Z" a, l+ |5 e6 h3 O! C
, g+ K9 w/ @* G9 m' U下面给出利用编译器将Matlab工具箱中psd.m文件生成可供Vc调用的函数。3 @) {7 a, X4 e# E) F0 z
) {$ t: F8 d+ F T将psd.m文件拷贝一份至Matlab\bin目录下,改写相应调用的M文件如nargchk.m, hanning.m等。为生成的代码简洁,对于采集数据处理输入参数很明了的情况下可作大量的删减,最终使psd.m成为一个不依赖于其他M文件的独立的M文件,注意千万注释掉作图代码,最终改成如下形式,限于篇幅给出关键的几步: $ |! N; G7 B; R P8 p' c% [3 h5 }
function [Pxx,f]=psd(Fs,nfft,noverlap,x)# R; K( g n: u+ N' @7 f/ [. K
3 a( B# _# X4 T- f. v/ l
window=o,5*(1-cos(2*pi*(1:nfft)’/(nffft+1)));//hanning 窗7 y8 S7 {* B. A0 |; e
6 X; |7 f. z5 P, T+ `
dflag=’none’;# c; b" C6 A1 Q9 ]! n0 k; S; _
6 F: Z' `- E; P* H8 I0 Fwindow=window(;) |( d* X$ S. a# M! N9 G
4 n3 o! V' A* ^/ \…………………………………. P2 P. W5 I& l: T9 y6 ~4 Q% c 1 I. U* M2 [0 r( {9 g以上只要稍懂Matlab语言和信号处理知识就可完成这项工作。 $ j. E. F+ b, a% e, M) G& R* k. d/ ]; D% }0 c' m
假设上述代码重新存为testwin.m,在Matlab command 窗口下设置好环境参数运行mcc –e testwin,则可在Matlab\bin下生成testwin.c ,如运行mcc –p testwin 则生成testwin.cpp. 7 I% O8 _) k6 p( V2 I9 D' t, U3 e9 h8 g3 g6 U8 p; @
Vc下建立一个基于对话框的文件,然后在对话框里加一个Button控件OnButtonPsd $ p. M k# E, r: R* L5 I1 e- |; Q3 N8 ]. M
将上述生成的.c文件的头文件加入到工程的.cpp中,且将#ifdef_cplusplus4 o% [6 T: J! ?" i- o1 f; w: i
" m! q4 E; f$ v# textern “c”{ t7 F) H& d6 i* t: G* V# L4 M, ~: @) Q1 N9 W
#end if @5 r1 |2 j5 j4 k5 D4 f ' n. c) ?. D! e I$ q/ c' jc代码声明加入Vc的包含文件和生成的.C的包含文件之间 1 P6 R- F. V/ P8 v2 B2 \6 d8 t0 m [7 Y- c# _
将#ifdef_cplusplus9 d% ?, ]- s5 ~( [2 h. `9 n) C
" }# e; W$ y/ k/ |+ ^}6 H, K4 n7 v+ s0 M- L& V9 w& l# f
0 l2 r$ Z6 y. k; `6 m
#end if加入.cpp文件未尾 $ P: L: u! j# Q8 y- H) j) @: T' r( X
为了简洁且便于处理将生成的c函数稍改动,给出部分代码如下:: i E8 V! h7 v3 E& q
& ^ ?, {) s$ D/ T0 c
void CTestpsdwinDlg::OnButtonPsd(){ v4 p( p* n+ d0 Q. x & t' E; ]/ I& n9 J2 V. X. KmxArray* x_rhs_;//指向采集数据存放区2 F; n& c4 Z. K4 ~3 f4 R
! J- L6 H# y* \% R7 s; G5 t, M$ \* I
Fs=23510;//数据采集的频率 nfft=1024;//1024点的fft4 v: c5 e' I! V. p1 K% j
. o4 b( x3 Z6 B S u/ Adouble datax[1024]//采集的数据' V8 |( j3 M. Q4 I% {
0 ?1 M! [$ e1 ^ d
x_rhs_mxCreateDoubleMatrix(1,1024,mxReal);6 ~$ F4 j, x+ \1 C y. c
! D; E2 p4 c* h8 B v- Cmemcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double));0 p0 C- p# E; b( x- W+ W' V7 F' |
4 w6 y% @3 Z/ `
noverlap=512;; T# d6 g4 A/ b u
+ O6 v: f& E7 Q+ j3 w# M1 ]……………….6 m) a0 r0 s) c- l- d( i
( \$ z- M( v' ]3 T: H i! a, ~………………. / a- c, y& ]. T B C; c& H 3 H" @! U2 `* P5 omccCopy(&Pxx,&Spec);( K% W( N* n6 Y: ?
1 Z5 `& A" L3 F6 O% ^1 F
mccCopy(&f,&frevgg_vector);8 R0 T# T1 H* ?& m1 d) q
. d; V5 b$ B" c, ^* lfor(int j=0;j<(int)(nfft/2+1);j++): k+ U h1 J* f r2 ^/ s' E
; ~: ]- \( X3 \( x
{ & o: `7 j9 H, X z! F% ? & K& Y9 t& x6 P8 Y, _datap[j]=mccGetRealVectorElement(&Pxx, (j+1));//功率谱密度存于datap[]数组 . I, k- Y N- b, L D1 [$ x * _+ A- g1 x8 ldataf[j]=mccGetRealVectorElement(&f, (j+1));//相应频率存于数组dataf[]中7 Y2 ]* D* i/ Y3 j J/ Z
" N, n( C1 p0 [' C: v} D" D+ X* g- B1 a : u" b. k! w! e5 D/ B& RmccFreeMatrix(&Pxx); 0 M0 ^' n8 L J/ W! r& w) e! c4 v" ~7 |8 K/ Q. V T* g1 y
……………….1 q- o Z6 c1 {) n
, i; g2 ~5 }! u. f8 P! E
SendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图 ( h2 \6 f- D2 z! Y! `! [. X7 s4 k ]( m
Return; . e4 W/ E% D9 ]- D6 V$ r: b0 n2 o* O) n) E+ |& W0 j" i$ a
}' |4 n6 ?& w5 G( {/ W t) U
- G1 n* }: I0 }1 |) B2 @! ~. o
5 l- f: n9 g3 D2 B1 V' M/ A0 a
# M" H+ L6 z, r; ?; E
如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用 Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇幅在此不述。 # Z; M3 k6 N1 o l & h- } u6 @* H$ x& d7 `2 t3)利用Matcom调用工具箱中的函数! n0 O, V; \" j0 p. @
1 E+ E9 P( R8 Z. ~% qMatcom编译M文件,先将M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的c编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定c编译器的路径,否则无法编译,指定好的编译信息就写在Matcom\bin\matcom.ini文件中,不过这一步按装matcom时,它自动寻找编译器并将其写入matcom.ini文件中,matcom4.5版中使用TeeChart3.0 OCX控件,因而它支持图形操作。 / f! g: h" H' { P/ _ $ u! v. W' J* R( f# y- B" q我们依然用上述的testwin.m文件,不要将图形函数注释掉,利用Mideva来生成可被Vc调用的信号处理程序。1 `+ K t. _7 N' z @
6 B( ?& Z& Y$ p1 w ?( r/ a7 @+ R运行Mideva在主界面上直打开M文件,在菜单中选择compile to dll,输入testwin..在Matcom debug目录下可以找到这样的几个文件,testwin.c ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp等。 # S0 K; ` q. X' U2 R+ e1 c$ L5 k2 [+ h) j' w+ ^5 f( r5 c# A
将上述testwin.cpp和testwin.h加入工程中,project/add to project/files并且在相应的文件中加入”stdafx.h”! ] ?/ }. p4 L
8 r D: D) F& V加连接库:Tools\option\directory\ ,选include选项,加入e:\matcom45\lib (包含matcom.h) - ^. E" R( D& b( g* i + u: i3 u# V( d) k% ~library选项,加入e:\matcom45\lib ( f% d" d, V8 y, z6 W' {( q m4 M( i* ]. v6 e/ H
4) project\add to project\files 文件类型选项选(.lib)将e:\matcom45\lib\v4501.lib加入工程中编译运行。相应代码如下:5 U0 x. f0 N+ y" u
% O1 q, L% C% E9 `$ g! f, Zvoid CtestmatcomDlg::OnpsdButton(){! f i( d7 w6 s# x1 b
! }' u. G$ ]' C- n/ Q" n
double datap[512],dataf[512];4 X8 X+ t9 n2 A& {! b$ k% F
$ _1 w F5 {: n' u
initM(MATCOM_VERSION);//初始化matcom库0 g& D0 D" v! M& i# {* w1 ]3 H: n
_# u( k( o/ ^( |; F( AMm Fs,nfft,noverlap;//创建矩阵- T6 X: z; i5 Q, P
0 m: Q1 z) ^* w* K/ q* P( o% g( O
Mm x=zeros(1,1024); , h. k1 ^6 s" E& X : N, Z& p$ s( L$ [: c Y1 kFs=1024;nfft=1024;noverlap=128; , B8 N" t6 @+ y- ]( L( l$ p# s4 `, `4 T0 X6 D, o
dMm(Pxx_o);dMm(f_o);//创建并命名矩阵 / p! k6 m! b3 e4 k( X 0 E. n" m) a) [8 m& E4 gdatax[];//数据采集的数据存于此数组中; a9 \2 v6 o; D7 N; M6 G$ E) m