3 U2 w% a* R8 `5 e在MATLAB表达式中,有两类错误:语法错误和运行错误。当MATLAB计算一个表达式的值或一个函数被编译到内存时会发现语法错误。一旦发现语法错误,MATLAB立即标志这些错误,并提供有关所遇到的错误类型,以及发生错误处M文件的行数。给定这些反馈信息,就很容易纠正这些错误。% G0 Z$ _+ f; g3 e; E
! ~& U- @& x H8 V而另一方面,即使MATLAB标志了运行错误,但找出错误一般比较困难。当发现运行错误时,MATLAB把控制权返回给命令窗口和MATLAB的工作空间。失去了对发生错误的函数空间的访问权,因此,用户不能询问函数工作空间中的内容排除问题。* T. I1 }1 ]1 |! A) k' e
2 D2 `; `7 B* U9 @, q根据作者的经验,当一些操作结果导致空矩阵或NaNs时,最容易发生运行错误。所有有关NaNs的操作都返回NaNs值。因此,如果有可能出现NaNs结果,则当出现NaNs时,最好运用逻辑函数isnan来执行一些缺省操作。因为空矩阵为零维,所以对空矩阵寻址常常导致错误。函数find表示了可产生空矩阵结果的一般情况。如果函数find的空矩阵输出用于索引其它数组,所返回的值也将是空的。这样,空矩阵具有传播性质。例如: 8 d2 F4 ?! P6 u4 G) h, `' V/ } 8 x- {& S# F7 O0 c0 l/ |/ u% l>>x=pi*(1 : 4) % example data ; _4 T. j% t4 P4 A2 r9 l 1 V& }: Y5 ]# [# X8 e( u# Y/ v/ X>>i=find(x>20) % use find function 4 t! g& F( B/ o" |* j6 N- _- c) f) O: c% Y/ `# w3 r5 c
>>y=2*x(i) % propagate the empty matrix , e* F6 I9 [+ e" u: r7 v" ` G s7 h, U4 n
很清楚,当希望y具有有限维数和值时,可能发生运行错误。当执行一个操作或使用可返回空结果的函数时,逻辑函数isempty有利于为空矩阵定义一个缺省值,这样避免运行错误。/ O. j) w$ t+ Z' z" y a
7 x1 t; s0 t( [# @. M有几种调试函数M文件的方法。对于简单的问题,可直接使用下列的方法组合: 0 J# V0 ?$ W+ e 8 a: R5 D: O4 A* p1、去掉文件中所选择的行的分号,以便中间结果显示在命令窗口中。 3 S7 t. c, Y4 k7 | / _3 X7 E3 M6 [9 c* C! F# Y2、在文件中加入显示感兴趣的变量的语句 6 j' w/ e. ]" Y8 \/ [4 x' d4 Q2 V4 ?5 ?; z3 y' P6 Z
3、把keyboard命令放在文件中所选择的地方,给键盘暂时控制权。这样,可以查询函数空间并按需要改变其值。 6 E. C' }0 j4 D* R% \3 A3 g. q' k2 ^
4、在M文件开始,在function语句前加上%,将函数M文件改变为脚本M文件。当MATLAB执行该脚本M文件时,该空间就是MATLAB工作空间。这样,当发生错误时可以询问。) x: U; _% w; x$ y6 S" Q0 S
' d$ Y: ?$ V# ~' E/ D" @当M文件大,递归调用或者多次嵌套(即调用其它M文件函数,被调用M文件函数又调用其它M文件函数,等等)时,用MATLAB的调试函数会更方便。与上述所列方法相反,这些调试函数不要求将有问题的M文件进行编辑。表16.1所给出的这些函数类似于其它高级编程语言中所提供的函数。有关进一步的信息,以及它们的使用实例,参阅《MATLAB用户指南》。1 N# }3 S, l: F
# @8 n/ M: P" m
表16.1 # q9 c- l. f8 \3 A* Z 4 l8 X F& W7 r" w* ^MATLAB调试函数 2 v+ h9 r. s E; h1 ?7 n7 |& l! ~2 g2 O8 ?) t; v2 R
dbclear: % K4 ^# `, q6 U4 {: s 3 s/ e3 D& u0 B: a* U
. @% k8 n0 ]. t) W
取消断点2 q( F% U8 T- i& v0 R5 ?! q
5 k; p- L9 H! ]+ V+ Q
dbcont:, [7 d5 }; h) k8 A/ j" G
6 y" d- X; s- d- J( ]9 U
# O g: Z/ b: L# G! vsymsum(fun,var,a,b):其中fun是通项表达式,var为求和变量,a为求和起点,b为求和终点+ r4 G+ r* Q& n% u( g
7 i+ R: N1 h u3 C, k( P
例如:I为1/[n*(2n+1)]从1到正无穷的和,求I0 i9 e R+ \* N4 z
1 }& p) L9 A0 R% V/ t1 }8 a e
syms n;7 Z& M+ W0 d: q8 n4 g0 k) I$ \+ B
7 q9 _, F5 s, s7 \8 y( D" N
f1=1/(n*(2*n+1));9 N& n. T: |- ]7 |
& L1 p' u. f/ d! S; fI=symsum(f1,n,1,inf)5 P0 i& `- @$ \
3 L/ y2 h6 h A
计算结果为:8 m: o" @" o6 B! K W. O7 o
# l+ {$ K0 ~ I" ?# q; p( P
I =2-2*log(2)* w- O' g' t3 K* M' \, x# O; x
) p0 C6 y% H) u" m- E, r空间曲面5 _7 ^/ v# T& V- C/ q" C
; C) }& F9 G3 t" x" Q8 {mesh()函数语法: ) P4 ?" |; g/ K7 Y2 i$ c7 @. ?* w$ r . h7 [+ Z0 B9 q) N+ }mesh(Z): ' |6 m; L9 T1 b2 G. c& \2 l s- h$ P- _2 M: L- Vmesh(X,Y,Z,C):其中C是用来定义相应点颜色等属性的数组8 p1 I! V# k' v+ C- K, ^
% u- \: U, C1 x- m: Hmask=[1 1 1 1 0 0 0 0 - f+ u) X: X' f# G0 T0 B; V6 y u ! f8 g: F( {" q. n5 p8 M 1 1 1 0 0 0 0 08 F$ i; G) N/ R; R" F) }
$ g3 t6 n( t4 [- H) @1 w, @
1 1 0 0 0 0 0 0 & j9 V y5 B% ?! V1 L8 c6 I; A6 w . O% t- {7 d4 d F) H1 U 1 0 0 0 0 0 0 0 / h# |$ C% q8 M& b ' x1 X; U& H& U2 c) g 0 0 0 0 0 0 0 0 3 A' d3 p& z! l( R1 n % E. u2 ^6 m. t5 D- N; M: z 0 0 0 0 0 0 0 0 " v# S: z# ?" z! N 5 T- o0 _4 C& p) J' S 0 0 0 0 0 0 0 0; Z( X; b/ I" E7 y; c9 H: A$ B: z7 @
1 }% C( D6 a. \' `) T* f2 V
0 0 0 0 0 0 0 0];# ?* T5 H% Q5 S
; O0 P6 J, Z- V4 H) ]' a$ v
B2=blkproc(B,[8 8],'P1.*x',mask); + r/ u/ e/ R: a0 O- ]1 [( j / H6 E) @& a1 P4 k" n- Q%数据压缩,丢弃右下角高频数据 1 B" i! B4 o5 D, S : `( } `; }$ d) \) CI2=blkproc(B2,[8 8],'P1*x*P2',T',T); - Z0 O5 T; N v7 U# E) K , G* B7 u7 u7 \! C) d%进行DCT反变换,得到压缩后的图像 3 H% p7 x R) @ 7 I: i7 ^( l0 s; q* ~imshow(I) $ f# w6 k3 r$ a! p/ O2 r' Y* ]% W; k7 ]" r, l o2 Q' `
title('原始图像') % u% a% q# j$ n; W' I$ ~+ k% ^: [, d: L5 t) ~; ^* Y
figure; , n& Y, {5 z" E1 M! R & G) y1 t% K& ximshow(I2)1 G5 k; }6 y Q, {! s% A
% }) x$ ? M+ G6 @: G/ x
title('压缩后的图像') & n" ~9 l/ A, I* H8 g$ j. s" ~3 @& m7 x
应用到的函数: 9 ?% P' O. a9 z# ~# H. G9 q5 a2 Y / u. ?2 ?* Y2 A) i2 P, JI=imread('图像文件名') :读取图像数据,保存在矩阵I中; + T) M [9 B$ N* J& C! Q9 i4 D( @) H4 u $ k8 S: v7 Y2 D6 B3 K6 zimshow(I) :显示灰度图像I,其他用法见matlab帮助; 5 T8 W B M; t- g y) i3 J" @# Q$ R" i( `* }I2=im2double(I1) :把图像数组I1转换成double精度类型; 8 r+ Z J0 V$ |5 E1 p) F" ?2 c 5 @! R5 d7 S& C6 FD=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。. p9 H8 U" f" i' `: j
6 g3 U4 Q" `$ [+ ]# N& T一个n*n的变换矩阵T被定义成:7 U0 Q! ~/ F. \6 C( o8 S8 |
: M" Z. w( Z. q6 j& f, X! A# e
Tpq=1/sqrt(n) ' R/ m3 E; v7 K/ J
4 m: d/ o% M- \# n+ M,当p=0,0<=q<=M-1;8 F% o7 b2 j4 C `& N
, h1 t3 s1 @+ F: O6 C6 K) T6 `* a
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n] 8 n! w, k; r$ e. s5 h+ @
9 X; M" H9 R+ F& ~8 ?/ x! y
,当1<=p<=M-1,0<=q<=M-1。 ( o/ Q* D+ T& M- `/ @. T4 R) x5 c. z& U+ e) a4 X. G( l
B=blkproc(A,[m n],fun,P1,P2...) :块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。! s; f7 i1 ?: ^7 j1 \9 s0 `5 T
6 r6 z! S2 E9 V. e3 W& j9 z' A
figure:强制生成一个新的个绘图窗口; 4 ?, ^+ T" S6 [% Z$ K1 v6 ] 3 \1 d% A9 q2 c非线性方程求解! k) d6 ]9 ]2 W+ K( Z$ f# @. O* v
, G. Y1 F! h6 C( _4 P4 }% y
fsolve(fun,x0,options) 8 s1 C5 J3 y2 v: k. `: x- r! m. x6 y) d0 b) Q) v \; l8 @
其中fun为待解方程或方程组的文件名; " R5 \$ d) Q* q9 m2 D3 |8 S" O7 R& W+ p7 W! r. Y" Q/ L8 ~9 w4 w
x0位求解方程的初始向量或矩阵; % {* d, w( W3 ^5 {' [ 4 z+ a4 ]+ ], b* loption为设置命令参数 9 G2 L5 t/ {0 e# n; ]. O- u" G+ l4 A1 {1 s% f+ H9 o7 y# x
建立文件fun.m: + a) d1 r1 U9 t, d' d( i- }/ q+ y; E / G' }2 B( J( |3 a3 I& ]function y=fun(x)4 j* Q' {5 n1 W
6 _( h" @5 l& ?6 u- f0 P4 a/ `1 ^
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...2 T) j/ A% K1 v/ b% }
3 H+ W1 L7 U( k8 x) R
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; 4 ~( R! }" r9 q# Y; h) O c, ^2 L0 ]( Y/ ~1 T
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) `; A$ k) {( G: _9 z7 @0 A
. B8 i8 S, _& i, P9 a) S
注: 8 u7 V; s$ O1 k# g. H0 i8 Y0 R& W3 p; W& r8 B# z- P: S
...为续行符 " g! A" i# g9 n' o. ]# u/ X) }. E7 U) \9 Z8 y2 }( J4 D6 p
m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。 6 i( P6 ~( o9 B ]9 [5 a* L & r5 s4 p: h0 ~0 {! m* }, o$ R" f不定积分与定积分 8 ^; B/ S3 e" n% v 6 ~9 W3 K1 x. Z; q6 c. q2 K9 _不定积分:int(fun,var)% T' u4 i8 b6 W/ _- }" [6 O, t
& k+ a1 l3 k7 j0 ?+ o1 G3 J* g
例:求∫sinaxsinbxsincxdx, D$ n! A: w8 z8 w5 v! C, b
* w# Z0 x: H% u$ l1 rsyms a b c x 5 y* B8 M' y8 J% Y- {. V7 A& |$ V: T: ^# |: O. v) d0 T
y=sin(a*x)*sin(b*x)*sin(c*x); - X2 Y, ]! H4 q4 \1 M f2 u1 Q4 M( g1 F. m
int(y,x); 4 f- @7 w( C; p5 ]: i & _3 d/ X. R3 ^3 e: upretty(ans)% [* v, C" s9 E/ o2 o& N
4 k8 m: r3 {$ U6 t
定积分:int(fun,var,a,b) ; v$ q+ n% r B$ O1 e( R) K$ X0 j% f- `
其中a,b分别为上下限 ' h0 T3 t9 {/ Q9 L b7 Q. s" W. C* e1 g9 L
求解线形方程 # a d& `+ Q) Z6 [) K( N4 V& ]8 c8 l+ u3 y+ W0 x% e# d3 o3 g8 V
solve,linsolve; M1 I# i; g8 E# w/ N8 O/ m8 R( O
% Z/ J6 O( {+ P* s8 \
例: 4 m( p2 j3 V; a" A 2 V4 t! t, ?! U X. M& Z" Z/ r4 \A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];2 V, Z0 U3 j: X ^: Y
1 \- ?4 e! b# ]1 u. B7 Y2 H
%矩阵的行之间用分号隔开,元素之间用逗号或空格 _) J6 N. L9 h; ~+ O: I5 E0 E" ~( ` |) F2 n9 n- c# K
B=[3;1;1;0] 2 e$ D& r5 z0 x. a- K1 @# {2 K " k( Q& C/ }3 Y. |& HX=zeros(4,1);%建立一个4元列向量 [8 T, U: g" T
" K3 q2 Z' Z) sX=linsolve(A,B)6 i" D- Q3 e/ D7 m% X$ B0 N
1 [9 R% X' \. f+ T# J
diff(fun,var,n):对表达式fun中的变量var求n阶导数。8 k U' N! W: ]1 d. p
+ r- w/ X0 W" M7 {$ g例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式1 P' M; v+ j* N8 I. d8 H
/ W t3 p- {; w6 S( T
diff(F); %matlab区分大小写 0 o+ m% F3 E. [0 D b" n* O; ~% upretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式( N% L4 Y3 P+ ~- x! E4 h# Q( w
7 Z0 e4 h5 X/ z9 S- g, E& X& TProduct: MATLAB 6.0 ==> Current Version; ^- i o5 e# N! J& ^# X4 _# Y1 c
' M2 h2 j# M- X( r5 j
Platform: Windows 9 w& B3 g! e. f1 E$ h, G ! ?/ c7 z4 H6 g! TProblem Description& Q, O6 r; e; l
% Y9 T: X: t; W& G7 r O( j. a
Why do I encounter problems when running MATLAB 6.0 (R12) on Hebrew: B' x4 C" x3 Z. q8 k' v
) `! y/ n# b4 |, P# m) [
or % Z0 |) r1 ?2 i1 w$ S4 ?6 K" s8 ^% g( O" @, |2 z2 r) C. I
Traditional Chinese (Taiwan) Windows? I try to start MATLAB but after 3 R+ s; m4 {4 T A: D" v/ |# j- E8 a
the splash screen disappears, MATLAB exits.' }' {" o( ?' Y4 J. Q, u
+ s& O5 d v/ @! A* E4 P) i
PLEASE NOTE: This solution only applies to MATLAB 6.0. If you have a : I: ^$ Z2 K: h! B F8 H e5 @0 _& Q& O) f/ X- y' j
similar problem with MATLAB 5.0 or the Student Edition of MATLAB 5.0,+ Z3 }4 N G4 L6 p1 a/ g
# Q7 n& B( S" Z& d5 kThis problem is caused by a bug in one of the font properties files we ship" P$ _, M' y" v
5 o! S1 ]* Q9 G" o4 ?: [8 X) lwith MATLAB. The font.properties file is used by Java to map the standard: j: i3 e1 F9 O
* d- N3 q+ _, Y7 \6 b+ Y1 B
Java font names to system fonts for a particular language operating system." c4 f" ~9 x# r8 o& t: Q
3 t9 @1 F2 z. c3 B0 c$ DHowever, we made a few assumptions that do not hold for the Hebrew or2 J/ f, A. l. u' X* u
) y4 w4 L6 U; p# }$ C) WTraditional Chinese Windows, causing this problem.& g0 ]) l: w/ a u
) q" K3 i2 `' r/ U& V6 \: p
We have created a fixed version of the mwt.jar file that you can use to( y L; t: G) _
1 E5 i$ x9 {& o+ m3 U/ O7 q( Vcorrect this. To use the fix, first rename your mwt.jar file as mwt.old.- l* P0 ?7 U& Z; ^2 k) q* p" }: d. o
9 w' S6 g/ y7 TThis file is found in the $MATLAB\java\jar directory, where $MATLAB is your' l3 A) z y. D" `8 T5 G% A
% d! f+ `5 x, s; p; B S- l n
MATLAB root directory. Then download the newer mwt.jar file from:! i. ], [3 i1 r& K2 H, n
$ t# C/ a' }5 u( ]; n& K ftp://ftp.mathworks.com/pub/tech-support/solutions/s26990 / ~! h% @+ J; @& C 5 R$ a2 |0 A( X5 `( p! \, a6 j. ^* x! aand place it in your $MATLAB\java\jar directrory. Then restart MATLAB; 8 u7 ?! |6 H; j- M4 c 5 o8 j* u/ D# D4 c8 l- Nthis should correct the problem you're seeing. T9 E0 O" }5 B4 P# D! N* Y ~8 c* J7 K! ~" L! R
2)我有一组x,y,z值,非规则排列,如何在Matlab中绘图? 4 v6 a- L. M+ \# q7 T' h# ~! J/ P+ a, G) G/ v) r4 J
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, BigGreen/MathTools #: @: H; _3 r% j" Q
0 G: I7 {2 a, R参见第一节问题7) 8 n4 H9 N. `9 f% f J+ |" F5 Q" X' p4 h9 I T* \
3)如何在给定句柄的axis里绘图? v" ]* U3 W% @; x; [7 k0 | " X3 h( s: z- ?: \0 i, @5 l1 a:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/12, SMTH/MathTools # * W5 i+ q g# Z3 D7 X' ]. s- D# I3 N: s8 X3 J
plot(data,'parent',haxis);/ h6 \0 D# ^) i( p, j
1 R7 X, s1 Z2 e/ R
或者 6 j3 \$ c% C+ e+ M2 k: |$ ~9 ]5 ~0 q' [3 |& E' L
hbar=bar(data);( v; Q5 d) g: U O. H
* w) F5 F" r! q; o) B
set(hbar,'parent',haxis);2 H, b& G( s/ ^1 E- Z
/ f" F0 A, x$ W ~: N7 ^
4)由Matlab符号运算得到的公式怎么才能将数据代进去运算? " ]3 D5 Q- Y% |, t1 Q6 @; Q: y% k) D( Q! B
:#ramjet (德芙)2002/3/3, SMTH/MathTools # & v' P' x2 D5 Z$ M% L) s) F- Z0 F4 _, {/ U
使用subs(),或先将值赋予一个符号变量,然后用eval()# j1 s$ e/ u9 `, ^
% {2 H1 [, d" O% h. n0 \4 j
5)在Matlab中如何求最值点?如何求一维数组的极值?. N% Z+ D' L [
3 X2 @( r$ u, R
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/18, SMTH/MathTools# 1 M. _# K! [* e 4 i- h4 S+ \0 |5 V( D! q2 ]最值: # }8 O1 l" b2 l# Q& k# A6 Z4 q3 b+ f l; l& Q
一维或多维数组最值用max(data()) J( Z$ G/ J* a; Z5 ?" ]
% F8 [1 q* V: q7 S, N) H
如果想返回最值所在的位置,用[Y,I]=max(data) ( S. b# @9 g: i5 `& a, h2 m8 k3 W ( l I8 X! k7 X: o# Y. g2 h0 J:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2001/4/21,UESTC/Math#/ T/ `+ h1 s7 r/ S% v2 v: p
& V' \2 m4 `; V3 p3 k& u/ E& h) eAn elegant chunk of code to perform least-squares circle fitting was # f% X2 N8 F7 i9 C9 i. [8 @5 P! T% j# f/ u& g) b) _6 b
written by Bucher Izhak and has been floating around the newgroup for" e& Y7 A! t6 j' D/ D4 b8 r! e, v
1 Z& [2 w9 U0 a
some time. The first reference to it that I can find is in: * }# Z( W. i) }2 D! j6 r0 P6 f& `! {+ Y- D$ l0 c. ?
function [xc,yc,R,a] = circfit(x,y) ; M2 M4 O8 ]) C# r. l # Z' y6 H A4 Y* F( l2 N8 o$ {3 u%CIRCFIT Fits a circle in x,y plane3 B2 F/ W/ q4 Y4 f) B
, [: z+ K/ U+ H
% $ r# V: d% Q/ W# B2 H6 _% F6 o9 k' F; X) [ U
% [XC, YC, R, A] = CIRCFIT(X,Y) ; F9 L6 R8 d6 i7 x3 v# X4 O5 p+ Q# H3 f& Z" t8 E T, `! w
% Result is center point (yc,xc) and radius R.A is an optional # p$ O" d' t* A! y9 E/ _ ; m3 L3 z- x) e% Z) u' v# S. ]( c% output describing the circle's equation: 1 P: Y9 P7 D: |0 g! L: q% [ 4 `/ p) u0 a' g% 4 }/ ~# j( O8 E, f1 ?% i% i' r; ?6 O N & K3 E6 v2 o3 t3 r& ^% x^2+y^2+a(1)*x+a(2)*y+a(3)=0+ [ }! e* ~5 x% k
# d$ L3 ~! D+ @, j3 @: z% by Bucher izhak 25/oct/1991 4 `9 U# R4 q5 ~/ I7 k w " H0 J2 t2 q8 }" Y8 J) nn=length(x); xx=x.*x; yy=y.*y; xy=x.*y; I- [9 G7 M: G 1 B) h m' Q# nA=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)]; $ s) R( L0 Z. h" _! p- o j/ S( }+ j5 L2 [% n" {( l
B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)]; # `/ e! v6 u, w9 T$ X' h % X& `- j7 S& ~8 va=A\B; $ W6 Y ]. D) V$ s8 r+ x* r ) W C# n' u1 K$ ]xc = -.5*a(1);, [+ g* I5 |% U5 _" S- K5 Y U; N% a
( D7 S7 J7 j. ~1 E' jyc = -.5*a(2); " X) N- s- J. Y9 T" t! Y7 k. a2 Z; M$ O( Z
R = sqrt((a(1)^2+a(2)^2)/4-a(3)); % ?. o, [8 m# X |& L U9 L7 H5 d" [
Tom Davis provided a more sophisticated approach that works for more 4 ^& Y) b B/ p! m1 [ 7 O9 L; P, E* y/ H5 ycases in and Code included. ! O; a" `4 }' m& d" I8 y! Q' a8 p( x$ z, q6 Q* l
8)Matlab中如何绘制箭头? 4 T, ]6 |( h# u2 H% Q) V 5 i- V4 H' Z) c n:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, SMTH/MathTools #, `+ l0 ?6 M$ a+ N
, m5 O1 A9 b3 }
到http://www.mathworks.com/matlabcentral/fileexchange/index.jsp 9 Y+ }5 U8 a- \4 f* ^- a6 a9 ? * g; n' I& c0 H% m6 g3 U6 u2-D Plotting and Graphics中查找arrow.m,或者 . ]5 s" e" V3 t 1 m+ L; Q/ l/ f) Z9 Shttp://www.mathworks.com/matlabcentral/spotlight/arrows.shtml . \. K$ \9 p0 u/ x2 E2 c * B! I1 M {9 Shttp://www.math.umd.edu/~jec/matcomp/matcompmfiles/mfiles.html 5 v' O7 a- z0 ^7 I9 H9 I 1 X% s5 m; d% t3 y3 G; t+ b* @2 J; V9)Matlab中如何作二维数据的插值?; F; t! f9 v% B+ v5 ?) K8 u
$ N; [1 m3 ?8 ?: K' z
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools #( [; n3 r5 E1 O, O# L
' n' ?4 a6 }1 @7 {
对于一维、二维、三维规则数据点阵使用interp1/interp2/interp3,1 C0 T1 l) R' ^
: d' F! I# U' [* i( j" `2 {
二维、三维非规则数据用griddata/griddata3 J& u( f: N6 M& C# ?; [& ?( j
2 ^! b/ ^* \$ i* B' t1 r
10)Matlab中如何绘制三维数据阵?$ c4 o( d4 l" q* C0 a9 b3 H) B$ u- N
* k! i% J. I' ?; r3 ?6 r- @
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21, BigGreen/MathTools # 6 @3 T, e% B' k * z9 d- J( T& m% t# k* O1 D" r如果使用matlab,打开帮助窗口,在目录树上找到1 V J. Z1 l# \
! k! l4 [/ J; D& ?8 s0 J- LMATLAB\Using Matlab\3-D Visualization: Volume Visualization Techniques+ ^6 U$ Y/ Q* U- ^: P; k3 a
' K/ D3 ] B* ? f7 G: K
如果图形复杂,建议使用Tecplot,参见Tecplot手册中数据格式,将你 6 w% ?) Y9 `; i d; E. U+ i3 P6 X$ I n- R5 K$ E1 h
的三维数据读入Tecplot,双击zone,可以设置mesh/contour/surface 3 U A, V$ d+ F4 _* Z3 l& | ) E" Q8 E9 O9 o/ U7 }" i7 _transparency等。 . Q3 T; e* R% Y- d , Y# N: N+ g4 S. j/ Z在Field菜单中有3D Iso-surface Details和3D Slice Details,可以绘制等值 4 ^, h b# ]' N! e& k/ z" r2 P5 R$ N9 v$ V/ s& Q
面和任意平面的截面图。 0 O! ]# O( @/ @7 ?4 [ 5 [- G& N% o! V) |3 p11)Matlab中如何注解一大段代码?! x. Z+ k2 I4 ?" y
- _: o% u. @2 [3 R' ? |: a+ w
:#misc,2002/6/21, SMTH/MathTools #9 V& }3 H% }+ i, J& I
/ H# g& m p& C, F' t. A0 _Maple中为implicitplot(),implicitplot3d() % d( ]: P7 b( A0 Q' G1 j. j; ~. F 9 Z# s' a$ e$ M2 l参见$ w" v" _& }; P4 X5 @
" w% ~/ A( O5 I. q# J+ j" Ehttp://engineering.dartmouth.edu ... oad/source/Implicit A' t% H7 \; d/ ]4 I5 P- R 7 [$ N/ W' K; r$ S+ UPlot3D.htm * S0 n+ B% C b& Z J ! x; V3 |4 G: }19)Matlab中什么函数可以删除矩阵的某一行或列?- i" O; r8 s% O# v+ J/ y. ?8 C- |4 z
O( v1 j. G ], Z: U" h: `
:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools # 6 ~1 ?- R( G4 k# \0 \; k& B% T) d, H
A(j,=[]; %删除A的第j行. J+ u( {, r+ s3 |$ |) Y
2 H; G9 W9 h9 ^" t* Q- Z# m. {A(:,i)=[]; %删除A的第i列 " C+ Q' g$ i' w* B+ }* j! D2 |7 I0 R. D5 m
20)Matlab中能开的最大数组是由什么决定的?6 j3 {# h8 R% \ a$ E) L& Q
: K( P& d4 A0 R) ~
:# chenft (mike),2002/6/1, SMTH/MathTools # 9 D# ^" L I( v- ~+ I4 x( V& V" F- o- |4 I3 D
I have had similar problems. Below is an explanation I received from Ian% G8 B3 K* c- U. Z, T6 s1 D
l' T6 h. u v% s8 E* |# v8 eBoyd2 e; [8 |9 \! z9 W, w
3 ]3 ^2 t3 V; a2 L( F; S9 \from Mathworks (just giving credit where credit is due) that explains 7 J: w( z' M8 |2 X& B" Q ' G) F: \3 e! e. z& gwhat's happening. You solution is to run matlab with the -nojvm mode. % C* y& H |6 K: M* O! Z% v1 }0 B. T& |
"The heap memory system in J***A consists of data and handle elements. 3 k5 l; [9 K5 q1 G6 H+ m; [1 K( @: l% O% s& k3 u9 F) x
When you allocate a variable you get a handle and data. As long as data # ~" f1 I5 c) P# `, K% Z% }% C8 h# O/ ?6 o* j4 l1 y. t- m( n
has an# ~2 s, o/ ~* Y: ?, }
|" N- j4 G8 ~4 q; \& f" n- |
associated handle, the JVM considers it valid and will not clean it up.% ]! Z6 {3 K5 b/ b6 k4 K6 G' T7 v
_. S/ e+ K8 e. ?However, when you call the clear function in MATLAB, all handles are 0 Z% r, f) w9 \: `- f: ^1 v X # a7 x5 g$ j Y6 B/ j3 c4 n# udestroyed, and the data associated is now invalid. This means that the ( k+ B% W3 F |3 e6 j! ^- `8 I5 W 2 O, f! U: r: v9 U, C" jJ***A $ i$ L; D5 x3 p( Q! R # p" R0 w7 v( g, _engine can free up that data (garbage collection), but does not mean - T4 U ^4 w) g9 ^% `& t% C" `. C- c& W. t/ H
that it will clean it up at that moment.8 m0 j% L& W3 D B Y
8 q7 R+ k: a* S* t6 x& m+ b! f' {
Calling the PACK command encourages J***A to run the garbage collector % s# o0 P! k! i/ R4 A* t: d( ~$ a& Q5 g* i+ h
and de-fragment the memory. But it does not force it to (This is part( x$ W+ B, w5 E9 }
; c V6 C4 k3 ~3 @
of the J***A design). Even though the memory is 'freed' on the heap,0 R# T/ t9 [* w3 [+ w% l% C$ x
' Y1 w, j5 V; b, t2 Rit is not actually free to the OS, it is only free to the JVM. Here! S8 ]3 B) g, r
( y H# J$ z% X- B1 {4 M! fis one way to think of it: * M9 ]; Q w( o 1 `/ U9 o0 |- v' d# ?5 w[MATLAB] 5 w0 S% ^9 m$ U& R+ G" K6 Y) n- k& p7 y% r) h! Q
[J***A] + w+ r" b& o i, i0 A" [2 j 6 n6 A, W0 Q" r- A" M5 N, m, K[OS] ' y5 |* S9 C9 d; _9 C& z ! B1 r( ]/ j3 _7 q* g( N1 s* S2 QMATLAB runs on J***A (virtual machine), and Java runs on the OS (physical & q2 } S; x& {% W3 C- s , S* y0 {+ Q( K; |* X% mmachine). So when MATLAB is running in J***A mode memory allocations : }! L5 d1 v" Y2 D$ H6 ?& m3 c2 k8 X' q6 g( L0 f
are requested from the JRE, not the OS., G+ I& m1 f! n. | E8 K
a' [* Y7 Y# O5 T+ i* {; q8 MOne problem you may be running into is that the default maximum J***A heap . B+ P" O& G- J, ]1 ?4 I, z8 j' T0 g' d. B* l6 E
size is relatively low ( <= 64 M, so that is all the memory one session k/ r$ s2 l4 M9 N- ~1 k4 Q" W$ ]
1 Y7 V1 x$ u8 m P, ]6 J. B
of MATLAB will ever get on your system.# t a; ?2 f, L, d1 L E8 R
) r3 Q% p+ l" W& \6 @, D- }+ nThe good news is that you can increase this value. You will need to create 0 n" |; P% i. a: I4 l ( } ~ T* N, g9 I" s' ra java.opts file in $MATLAB/bin/$ARCH (or in the current directory when% S' J( ^. o7 x1 m% X& a
i* i/ b% `8 G G4 V
you & t, ?4 S7 c S' x- O! I2 l- L" c% J7 k
start MATLA and put the following command:! ?/ f0 V) k/ ~0 i* e$ K
8 U X% T6 C& g3 E/ c! u
%%%BEGIN CODE%%%: o0 \1 a; z$ U; Q+ D5 D: g
2 U9 U7 e; F8 [1 e X. s. m
maxHeapSize = 268435456 2 r; T( \4 k& N2 V# j+ W 9 _3 X: `. o# u J1 C%%%END CODE%%%) i- T' s$ R" O4 W+ |, G
2 m: G- o4 i* ?This will give you 256MB of JVM memory and you can adjust the parameter 2 i5 K# H3 M6 G8 ?- [# \! l# a0 p- y/ u6 ]7 a9 i
as needed.2 Y, ]/ K n+ n: l5 s
% a! Z- Q3 f9 G5 Z6 r
Note: $MATLAB is the root directory and $ARCH is your system( G, s, U) D2 p" x$ \/ ?: g( J
; B0 h5 _5 t5 Q) M5 Q a
architecture. This solution works on Windows as well as Solaris, Linux, 5 X5 s+ `' M q5 L7 n/ d! p/ T) a* g! E: x* _' B
Alpha, and SGI. A similar operation is possible on IBM and HPUX, but with! W1 R; }4 R% v; S# k( @
8 d6 {- W9 X3 @& [) x1 |a different syntax. 5 V9 X: m ?& \& n7 }' g$ \* N5 F5 w8 X. ^2 ^" d& Y% X u
For the 1.1.8 JVM (Windows, Linux, Solaris, Alpha, SGI) our defaults are: 7 H( g$ W& a& y: r3 A% B6 U8 u6 {: @/ A& Q
minHeapSize = 16000000 U G7 F5 v* H0 L9 H 5 C$ r% S3 L V6 J8 l4 hmaxHeapSize = 64000000 3 ?, O, p( i: r$ `" b+ P7 e1 N& H3 }+ n
These are the structure field names in that correspond to -ms and# P, o: f2 ~1 w3 N& c
4 [/ I" a3 [7 M% q. Q! P1 |
-mx, and the settings above are roughly 16MB and 64MB. & E* i* ^- {7 |# X" I& @ D0 k, L ; `8 K) ?9 b' I# [; ZTo investigate the Java heap a bit, ask via the following: ( [1 M& t- k% n4 P1 [" B# l8 D O( G V% V; H
>> java.lang.Runtime.getRuntime.totalMemory S! J; f/ N2 t: l! A4 C
( ]* G* y+ s0 x0 b! q% C5 q. ?+ RWhen the free memory hits zero, Java will double the heap size (up to the 5 p& }- W0 V/ Z( r 4 K7 I$ x& U# E3 O0 ^. C2 X8 ], Vmaximum setting)." }1 b7 V6 V9 u9 j2 \
: l4 G/ p8 N: ]& U6 x
If you choose to run without Java, you will remove the overhead of the 6 t& ]% j0 `) {6 W; u. E: @+ p. _. v" h i
middle man, but you will also lose some MATLAB functionality (mostly 1 `0 M; C) A- r/ J- l$ H) ?3 s4 h0 y) Z' ?
graphics and the Editor). You will still have most of the computational t- ?- n; D6 b8 E/ S& C# |# i& S# e' h, ]
power though. & r5 p; Z9 h- \ & A( J1 s( l3 C o5 l+ x9 i3 ^, N3 J# YWithout J***A, memory management will come directly from the OS, and a7 v9 t. R* `5 L
& A& g }0 c$ P' CCLEAR operation will result in memory being freed back to the OS. ' j0 z7 K% T3 r0 u* J/ L ; P0 N4 o. |. A5 {# |21)如何在Matlab中添加新的工具箱? : @( |2 q) k! |! \ + |( R' i& V5 w. z:#FangQ(Qianqian.Fang@Dartmouth.Edu),2002/6/21,BigGreen/MathTools #8 O/ v u' Y" Q0 f5 K% K8 Y
- J! O7 Q9 O) O h( n+ E( _
如果是Matlab安装光盘上的工具箱,重新执行安装程序,选中即可。 ! x9 v" }8 ]; P0 }& S9 c: i( g 4 b! V: ^! T( b/ {如果是单独下载的工具箱,一般情况下仅需要把新的工具箱解压到某/ B. D/ L- ?$ ~; ?
; Q. l s& ^# \% Z7 P% b0 _5 \个目录,然后用addpath(对于多个目录的使用genpath())或者pathtool添( z. m* M( C' P) o _3 v
( \: s" M- L! g4 [/ G. a加工具箱的路径,然后用which newtoolbox_command.m来检验是否可 * j) r- _, W) I7 |; i 9 L3 o* Q6 V. u% o/ p9 e% ~6 _2 k以访问。如果能够显示新设置的路径,则表明该工具箱可以使用了。 8 \" i: t; d( Q0 V- l 6 e+ R. ^8 D1 ], f4 @6 ?9 s具体请看工具箱自己代的README文件。) {. ~9 c) F+ S* y N( u
! b; e; \' R2 T4 \" J- z2.把为inf/-inf或者歧义点的积分限设置为一个初始值,k=1 * h+ \ J. f( d 0 I6 R8 M* L- b7 C% C3.计算定积分Q(k)% G$ A5 E4 C, A, B9 Q+ M
- O5 c: Y. Q' Z/ _# b r
4.然后朝着inf/-inf或者歧义点移动一个步长,然后计算定积分7 T8 ^7 M, M4 T) `5 |
T9 e5 \( c7 g G; mQ(k+1)- V' h8 A, @$ z% b
; I% |! C$ l' e
5.判断(abs(Q(k+1)-Q(k))8 Q) _) w( G* }% T
( _: E& F y( B
QuasiMonteCarlo或者Oscillatory]+ m$ f( a) \2 w
7 }1 b* x" S7 v4 G- g39)为什么我的Matlab程序这么慢? . P0 Z# T! p) S1 i 0 R1 v2 L+ q+ J% n# z:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/6/22. BigGreen/en_Matlab# # K, b+ S/ K- _& r r6 I* G8 [7 Z
我们工学院的收发室的门上贴着一张小纸条,写的是 . O8 }$ J9 h. h8 m1 _# Z' D8 Q, k: p' d" e7 ?1 i" D6 @7 P
"Our policy is always blaming the computer" 3 U+ W4 X4 U# y# A( @( A1 M/ F4 [& @: d; U/ E; |1 x' }5 w
大多数的人在遇到问题的时候,总是责备计算机如何如何,别人如何 ; V" ^+ e) e. c* U0 i c- w+ k9 S, {1 R% L; b; p0 h如何,其实,最最主要的因素是在于自己。6 w8 \8 o, W- Q
0 M- ~1 z# A4 t$ i9 Z5 r
一个程序运行快慢,有很多因素决定,最主要的是算法,简炼而优美5 [3 n7 z' K, D! I" o z7 |
8 O+ ^) j# Z* G5 i6 j; d
的的数学公式胜过100遍的优化。能从算法上改进,才能比别人有根) ^. h q) H. w' X5 B& Q
( y8 u8 c/ x) L/ J! v7 K; c4 y; b
本的优势。计算机也很重要,以前我总把自己用的PC看成万能的加4 n" W* D; n. x. A( Y8 V9 q; H
2 z; N q4 B* r& R
以崇拜,对UNIX嗤之以鼻,结果当自己真正开始算起来,才知道差 1 b, g6 `6 B$ D* `) y: L8 M" D9 Z( I; u( D! N, T9 Q
别有多大。搞大型数值计算的,没有好的工作站或者并行系统,就输 ; {# Y0 e3 f' ]6 o 7 u1 s* i U2 P( K* L1 {在了起跑线上了。然后是程序的优化,看看变量是否占用太多内存,, g" E9 @# b* T x8 L7 W
9 V% T8 Y3 w/ W8 z: c
看看是否有功能重复的模块或者计算,经常的是用牺牲内存来换取速$ e5 H T- K, k* S7 X
+ K! e$ ` r& f
度,具体取舍,具体需要来决定。用profile看看哪些语句占用时间最7 o7 I$ ^ {" q {3 x6 o y
' }8 q5 z6 c" F4 H( c7 M9 {2 z多,然后把核心部分进行优化。; r D8 C0 K2 z/ d- Z
( m; z. K- W1 T
如果是使用Matlab,使用vectorization和矩阵整体操作的代码要比大量 / y. A0 K' I4 q; W r! {# L/ e1 N O
的for循环快很多,eval/inline函数如果出现在核心循环,也会让速度下 0 q+ R$ U \) ?- U 5 W1 ]6 R0 s$ Q- L0 c# d* @降几时倍的。 ; E3 C0 P1 B% x8 [) {2 i4 x% `5 M
40).Matlab中如何作非线性回归? 2 O2 l' K' k6 s+ n" q$ v 9 X* Z2 q/ ~5 |:#FangQ(Qianqian.Fang@Dartmouth.Edu), 2002/6/22. BigGreen/en_Matlab#8 `) ~- `& J, ^0 l3 f! t
o! u P' C7 U+ b+ [datax[j]=sin(2.0*63.0*samt*3.1415926+1.15*3.1415926); 2 p6 U$ L' t7 U. g* y Q0 N( Q& o6 E$ p) ~' E+ a) v+ d
} {/ [" @( D2 Q
: r y5 O S, O* y
double *pPxx,*pFxx;3 d" r {/ `1 X1 E% N
) H$ o. w( I- y& T# Aif(!(ep=engOpen(" \0"))){//打开Matlab引擎,建立与本地Matlab的连接" \' j- k' P. L7 f9 ^
: F9 ]- k. ~$ U6 s- zdouble datax[1024]//采集的数据3 z5 E& b- [* y" A
+ ~' ^2 i( w, f# h5 Z+ Bx_rhs_mxCreateDoubleMatrix(1,1024,mxReal); 0 w. J5 S8 E0 M' i5 j$ b * j+ b- O5 {9 P( b# Omemcpy(mxGetPr(x_rhs_),datax,1024*sizeof(double)); : N- x# ~( L$ q0 n * ^0 u0 a- C, ?noverlap=512;* p/ S: E+ K: t: N
! ^( y; d6 o$ [ ^$ I- r4 L
………………. 1 L! Q' T' X% r0 K( h7 ^- N! { : N+ o8 p9 R5 `6 V, l& Y……………….$ A1 V. |! B V+ W
; |7 t! p' d: |* X, t6 c- Z
mccCopy(&Pxx,&Spec); ; q( `! [2 P' A $ u( N9 \( h( O! R6 bmccCopy(&f,&frevgg_vector);/ G* D; G3 b, H1 [
9 Y& ?! b: |$ Q# c! r7 \; V" c
for(int j=0;j<(int)(nfft/2+1);j++)% v1 d' N+ F4 R% K9 i8 q j
1 ^7 _" R8 C" m) h3 y{ ( F- `7 L0 p) ?; S! v: Y7 k- c
datap[j]=mccGetRealVectorElement(&Pxx, (j+1));//功率谱密度存于datap[]数组, A; _% Y* w. ^/ T' j, h. z
. C0 ~% c6 b9 s+ g7 U
dataf[j]=mccGetRealVectorElement(&f, (j+1));//相应频率存于数组dataf[]中 ; i, Q4 |2 u- r! h; Q / @1 Z ?! U! Q2 c7 b}0 b. p5 m# v' J4 ~% }" ?8 b& \
4 }+ }6 m/ {' [6 |0 \9 q/ K5 B- ?
mccFreeMatrix(&Pxx);' O/ B3 N1 D1 f2 e! w- ]
& e5 Q! P: t& h……………….3 D( L3 Y& T' K) t
8 X Y) g' I" L0 v B% NSendMessageBox(WM_PAINT,0,0);//利用Vc下的图形函数画图 / ]5 F) d9 v! n. } j; i ( B+ h9 |/ h6 O, M' mReturn; : {; v% T6 M: C" g! R 9 h/ y, @, n3 B6 C}/ Y0 e! U4 Q2 u. y! }0 ]0 R% \1 ^
3 @7 u' ^( W( S, |1 \- F 6 H" Q V' r' ]9 R& t
6 U7 c( M/ K# x+ E( [: Y
如上生成的程序可读性不太好,而生成的c++代码则可读性较好,但千万注意只能用 Matlab的MATH库,不可用c++的MATH库,否则编译会出错,限于篇幅在此不述。 \0 Z% m/ B, {9 ?' G8 v2 G
/ A h' P6 E/ m' T, G; a
3)利用Matcom调用工具箱中的函数 6 `( O0 y( A; |8 f 9 Q/ _9 F6 w& ^% ]3 E; XMatcom编译M文件,先将M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的c编译器将cpp文件编译成相应的exe或dll文件,所以第一次运行要指定c编译器的路径,否则无法编译,指定好的编译信息就写在Matcom\bin\matcom.ini文件中,不过这一步按装matcom时,它自动寻找编译器并将其写入matcom.ini文件中,matcom4.5版中使用TeeChart3.0 OCX控件,因而它支持图形操作。6 I% f/ [3 E# w: I. E! n9 `1 o
& p/ q' H7 C* ]! n% e2 J' m3 R# h, @我们依然用上述的testwin.m文件,不要将图形函数注释掉,利用Mideva来生成可被Vc调用的信号处理程序。 : Z+ Q& i5 c% H8 I4 J: C' R' _( z1 p4 J
运行Mideva在主界面上直打开M文件,在菜单中选择compile to dll,输入testwin..在Matcom debug目录下可以找到这样的几个文件,testwin.c ,testwin.h,testwin.cpp,testwin.lib,testwin.dll,testwin.exp等。 $ p- f% d" q+ E- X. D+ j' J8 ]: j7 B3 v
将上述testwin.cpp和testwin.h加入工程中,project/add to project/files并且在相应的文件中加入”stdafx.h” " z: u2 _) d- }$ r" e# ?2 S ( e( W4 A5 X: E9 q& b4 f5 N加连接库:Tools\option\directory\ ,选include选项,加入e:\matcom45\lib (包含matcom.h). X# p' C( Z" p5 K; W, N) q# }
" F# _5 i4 o0 G y. a% R! L% E
library选项,加入e:\matcom45\lib7 \1 `) h0 k0 Q+ I
7 H5 |* }- M* E
4) project\add to project\files 文件类型选项选(.lib)将e:\matcom45\lib\v4501.lib加入工程中编译运行。相应代码如下: ) A& b/ M1 L) y, r5 g9 v% J- h" L5 F3 r# q( P3 S6 @
void CtestmatcomDlg::OnpsdButton(){ 8 w" T% B% a: z 6 h- ^4 T8 _: u3 D' Pdouble datap[512],dataf[512]; & N# F( {* d. B8 y- S3 b5 k5 B, x' ^9 W4 e; m. M, h+ F1 R+ E
initM(MATCOM_VERSION);//初始化matcom库/ U v6 }% I4 T$ y- j
. v- o# U0 p6 P7 h
Mm Fs,nfft,noverlap;//创建矩阵1 K( _" ?3 n& j
7 D: T1 C. d; O+ vMm x=zeros(1,1024); . |3 h+ P. B$ @- E3 n" E l! T4 w: B4 D8 E F
Fs=1024;nfft=1024;noverlap=128;% p$ g# l( B, b
; d B+ l: [: g
dMm(Pxx_o);dMm(f_o);//创建并命名矩阵$ }7 g4 y$ N$ j0 a {9 x