数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal代码矢量化
[打印本页]
作者:
forcal
时间:
2011-8-2 15:02
标题:
极限测试之Matlab与Forcal代码矢量化
代码矢量化是matlab的特色,但这点似乎不难实现。代码矢量化的优势并不明显,通过一个例子说明。
//用C++代码描述为:
2 p( X# U' I$ |$ B& [2 a, l
s=0.0;
9 ^$ B- p; p, Z& a, H0 C
for(x=0.0;x<=1.0;x=x+0.0011)
8 |! v* o8 o* l4 ]4 g1 g
{
! g5 d+ R5 m* }. F' M
for(y=1.0;y<=2.0;y=y+0.0009)
8 A! E' M; [; r( q9 C" C
{
0 p0 v: |1 _( v
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
+ \4 G# F5 A0 S U
}
# a6 l! x: e$ ~% g# u
}
复制代码
Matlab代码:
tic
, } T! V G2 n9 h J5 Y
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
0 P4 v8 D7 B6 O
s=sum(sum(cos(1-sin(1.2*x.^(y/2)+cos(1-sin(1.2*y.^(x/2)))))))
! ?+ J2 H( Y8 z! T# N( G- y4 o
toc
- B4 ]+ F% W* g
4 x; k+ O& H, w; n9 [+ h! J U) e
s =
! U' K, G% E+ h# `7 h
8 m# i* f$ |9 ?$ z& d
1.0086e+006
2 @7 Y# }6 m$ C, g: `& }
8 c5 H |) x1 d8 q, O' B2 `7 i
Elapsed time is 0.561108 seconds.
复制代码
Forcal代码:
!using["math","sys"];
% N4 `. V% P0 X9 p
mvar:
* d8 Q$ l& G) P; G0 V
t=clock(),
H( V+ T! x! T5 k4 |
oo{
$ e1 u6 i3 ?# d! G
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
' K8 H, j4 \6 |8 R
Sum[Cos(rn(1)-Sin(rn(1.2)*x^(y/rn(2))+Cos(rn(1)-Sin(rn(1.2)*y^(x/rn (2)))))),0]
D% z4 `; j7 I6 e8 c
};
) ` E$ F, m- p+ t, C1 F
[clock()-t]/1000;
复制代码
结果:
' I7 e7 X9 y( _" I. u" J) \
1008606.64947441
/ l1 o* |* @! B7 i6 x5 `; }7 `
0.641
8 m6 k$ U( x6 d# @9 S9 x$ _3 A
5 a9 Y' ~! D( s9 l0 v0 X W
Forcal比Matlab稍慢些。
8 J/ {6 N+ x: I: A. g
( \6 ` ^; x" C8 n9 k3 I* i
----------
7 O; t0 D1 p/ z' Z5 R: [
4 H& r3 J) Q3 V& n$ Y( q
再看循环效率。
6 }" ]$ ~( ]6 b8 A+ q* l9 i% B
# i) F- `9 ?' k- t. [
Matlab代码:
tic
) ~& q- Z/ J, b, s, c# \
s=0;
) K8 S1 r; v, m. P/ o2 B# |/ C$ S+ R [
x = 0;
+ y2 f% o4 |4 A4 r; D$ H
y = 1;
4 r1 j( H- B% @) n! f
while x<1
1 c7 P+ }4 v0 i7 E# j* Q. S* O
while y<2;
7 }, ]" X4 \6 t
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
& R+ b B5 W4 J0 E9 }# B
y = y+0.0009;
( b: V1 G7 x: q1 W& T+ E6 T3 y
end
G' W8 I4 q( t
x = x+0.0011;
/ F8 e p }: V( o* e- L, {
y = 1;
" Y' ^/ t- T" N! W& m% j& m
end
, g+ L/ j& ]- b
s
+ q8 c1 N8 e& C2 m% J8 z3 ~
toc
& @! {) F+ B. h& `
& Y; `# i& f8 H: v- P5 V
s =
- e! O5 C% j- a8 }. z+ J n: @
/ C7 g/ `1 s2 `" A
1.0086e+006
2 [$ Q& m0 _9 v% l# a, J
" p7 l9 t9 |; X- `( m
Elapsed time is 0.933513 seconds.
复制代码
Forcal代码:
mvar:
# c. S- q, p* M2 \
t=sys::clock();
( ?* M& x! J. k
s=0,x=0,
' t1 v8 s5 R7 j+ y( q2 n
while{x<=1, //while循环算法;
: i6 D4 G& e# X% ]: O
y=1,
4 S. k8 Z" x+ k, A8 I: _9 ?
while{y<=2,
) k0 l5 V1 h8 B ?' R
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2))))),
4 H. e# w5 r- s3 @" @
y=y+0.0009
' v7 C8 f0 X& S+ H1 q7 B# U! ?. m
},
5 [$ a V7 v1 x/ W2 [
x=x+0.0011
4 |6 d; g% Z. n
},
* l x5 i$ v$ R* x, `3 G, x
s;
* I+ E6 d! f! P7 {3 z [1 {
[sys::clock()-t]/1000;
复制代码
结果:
9 W9 B1 W0 w3 {* g/ b ?) V
1008606.64947441
4 }( @' a" X. n, g
0.734 //时间,秒
5 S* k1 M- q) e0 J
2 ~ l2 S+ H* ]0 A" L; P, t0 p
我很奇怪,在这个例子中,matlab的JIT加速器为什么没有起作用?
c' p5 F! ^( ]$ L1 x( u' K
. N/ C8 _# o, g
-------
3 [% D5 Z/ t% m9 z
" w: W& M& U0 |" z# R( k
Forcal中还有一个函数sum专门进行这种计算:
mvar:
! _7 n! ]$ U2 a& c* O
t=sys::clock();
; h9 e; S f. E _' A8 Q5 F# u
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
7 q# u+ s5 M6 \% j
sum["f",0,1,0.0011 : 1,2,0.0009];
' T0 x1 D& x( C* Z: Y: x1 [
[sys::clock()-t]/1000;
复制代码
结果:
0 T( A/ Q: Z/ U$ {% B8 g7 A
1008606.64947441
! m B* B* ?# e! v) Z/ Z
0.719 //时间,秒
作者:
forcal
时间:
2011-8-2 15:24
说到代码矢量化,就不能不提到大名鼎鼎的arrayfun函数,现在再来看看它的表现。
& h" Y$ Z4 c" z8 e( A
; ~* j# R9 w0 R0 w) U) H1 u) N
matlab代码:
f=@(x,y)cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
4 d. c1 Z8 k3 O; _+ r. l
tic
& Z. t4 B' _2 ]
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
0 {" M+ e2 ?0 z/ u
sum(sum(arrayfun(f,x,y)))
/ E# V( A1 q0 G- H
toc
, t" I2 g. w# c& i7 H
# i1 M M) Z9 v$ V, E3 b
ans =
9 R4 a/ m$ v* p" H# `6 s4 T5 y
! I& v% t: }" j
1.0086e+006
6 ?. x: H. E( @) g0 B
$ \1 a+ @/ R8 l
Elapsed time is 7.339923 seconds.
复制代码
Forcal代码:
!using["math","sys"];
" A& R* K0 Z& D7 }" q: d1 v$ I
mvar:
+ f k/ u2 i6 t9 m' H7 B
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
2 L0 \: O6 \+ o, F6 |; Q. X
t=clock(),
$ K; y b/ [3 a+ E( [0 a& J
oo{
: t* |, F3 x* @
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
7 E: @& V& ~! `1 j8 ~/ H5 E1 F1 ]) j
arrayfun[HFor("f"),x,y].Sum[]
# P7 M( L s9 q6 w2 o1 k
};
6 p6 H) X" w" E+ A
[clock()-t]/1000;
复制代码
结果:
: G9 w% k- E. I' h4 Y6 O1 R; p
1008606.64947441
( @: q: Q4 A) U# |* o
0.735 秒
$ i1 e& O) m0 _/ j8 m. l2 A
8 ~: m |: I7 e8 r
可以看出,Forcal的arrayfun函数远快于matlab的arrayfun函数。
) e0 R& ]4 ~) i! D* l. o% ^5 N
! n& e6 W" j- W$ g
--------
* A* i; Q5 ?" c) C* f
$ U% F9 P# r y/ `& ]1 B5 U
从这里似乎可以看出,matlab若借助于arrayfun函数计算三重及以上积分,其效率将远远落后于Forcal。当然,Forcal不使用arrayfun函数计算三重及以上积分。
作者:
我就在你背后
时间:
2011-8-2 16:10
学习中。。。。。。。。。
作者:
海水
时间:
2011-8-2 18:00
看看看。。。。。。。。。。。。。
作者:
alair005
时间:
2012-2-7 12:38
恩,参考一下。。
1449529676012957
作者:
sxjm567
时间:
2012-11-20 08:56
一起交流!楼主给咱们提供机会了
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5