数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal代码矢量化
[打印本页]
作者:
forcal
时间:
2011-8-2 15:02
标题:
极限测试之Matlab与Forcal代码矢量化
代码矢量化是matlab的特色,但这点似乎不难实现。代码矢量化的优势并不明显,通过一个例子说明。
//用C++代码描述为:
) R* J& T: {1 R' i# \
s=0.0;
0 Y' C* `9 H( w# y; @/ K/ G- F
for(x=0.0;x<=1.0;x=x+0.0011)
' d$ s) i& _6 ?; O" X# Q1 q
{
- R: N7 y$ k1 Q- e( Q, f$ e9 W
for(y=1.0;y<=2.0;y=y+0.0009)
% r* l* u) d& ? E! U
{
; o( Z3 \$ o0 R% w5 D
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
" j1 @: V( {: v( I4 C
}
9 K+ ^& p1 b5 n$ {
}
复制代码
Matlab代码:
tic
8 `3 R/ A. ?- P) D
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
& s) ]" P5 l' i
s=sum(sum(cos(1-sin(1.2*x.^(y/2)+cos(1-sin(1.2*y.^(x/2)))))))
! D( |- ?0 R! b- u" n- z" M7 c) U& ^( ~
toc
4 u" U( @9 q- x2 N* y# Y
# c$ Y+ ]3 e% V" P
s =
5 ?, c7 b u% q% h4 x
9 C* ~: m- G/ U5 h% Y
1.0086e+006
) n+ t% _' m0 D5 Z
& i2 j/ B- ]. l; o [
Elapsed time is 0.561108 seconds.
复制代码
Forcal代码:
!using["math","sys"];
( L( M1 N4 i7 s* w) Z, d
mvar:
/ s/ u' C" ?# l2 Q j" b
t=clock(),
$ Y# Y! w- n+ C- t9 r2 D
oo{
& p+ x- r' A0 r2 D& K6 @, K
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
9 s- ^+ m" N6 a
Sum[Cos(rn(1)-Sin(rn(1.2)*x^(y/rn(2))+Cos(rn(1)-Sin(rn(1.2)*y^(x/rn (2)))))),0]
7 l7 ?' [2 l( f4 `# d: p. L5 [
};
! ^9 ]" C0 Q2 D) f+ }
[clock()-t]/1000;
复制代码
结果:
/ T, Y6 R' S; Y( a4 x9 E
1008606.64947441
8 q5 V3 C7 w4 E3 s8 x' |% R9 t
0.641
2 u, {0 ]" J1 C- I N6 p7 F: z* i) ?
% \ o( Z, a6 E6 n- ?) O
Forcal比Matlab稍慢些。
$ H; Y, T* Y3 P
0 A( q, t/ K/ w; y6 |. j1 p- @
----------
! D5 \5 ~- v2 \& I9 ~
+ C# i. P1 O/ ~" H- @! K) W
再看循环效率。
# B& V4 x1 L4 K
$ U3 c7 p1 t0 l, D3 [; e
Matlab代码:
tic
8 Q, k% s# }4 _# j# q
s=0;
) U% u* {) f/ q) c
x = 0;
4 J, o7 ?- ^3 z. B
y = 1;
9 ^7 G: F% p# B( {- g. Z
while x<1
# w! t1 N/ C9 D, A- _" s
while y<2;
* [; R6 v) N. l; ~" t/ l9 x" @9 v
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
0 v% N; T" h2 ^& t! g: T
y = y+0.0009;
5 r, x$ n: H4 I9 \( _
end
+ U; G" f, s R6 r" p1 Q" a
x = x+0.0011;
! b/ h o3 O- a& Z" f0 C
y = 1;
8 Z2 P% N3 S- x B8 n6 I
end
+ r: L' f0 `* z
s
! {+ U$ u7 d% e- u0 `6 U
toc
+ R: d) }" j4 W2 e
5 G& T/ q' M% b
s =
. C$ `' o ]: q, w
* H* {3 ~( t: y+ ]( G( V
1.0086e+006
0 P0 {& ^: M- e2 V4 T" w; o
1 _2 `7 [; y' j, d
Elapsed time is 0.933513 seconds.
复制代码
Forcal代码:
mvar:
0 y9 n/ F$ P0 v& Q6 J
t=sys::clock();
4 b, Q8 R, R, k
s=0,x=0,
7 j) [0 W! P9 i- I v) ]
while{x<=1, //while循环算法;
) {8 Q3 Q. Z4 C5 J& |, o
y=1,
6 Y5 W6 U) R1 H/ _- ^8 J
while{y<=2,
' t0 v5 L1 I" u7 V/ n
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2))))),
( R h/ c1 h/ E3 l z! u4 T( U
y=y+0.0009
5 ?; g6 x+ k4 |! ]
},
9 F5 c6 F. [9 Q2 n8 D: A, F- a$ F
x=x+0.0011
+ Q* p) s+ ~0 @1 A* b
},
- I& w- J* [1 x% w0 w% m/ A
s;
* s$ M/ L, @, P! Q* a7 `, O
[sys::clock()-t]/1000;
复制代码
结果:
) Z1 g7 ~! H3 v
1008606.64947441
: u7 o3 X; s5 @& D9 e* h% b: K. o
0.734 //时间,秒
" W) O8 L( T8 Y+ v$ |4 w
, A/ t5 o, v9 Q5 G9 C6 J! b4 @* J
我很奇怪,在这个例子中,matlab的JIT加速器为什么没有起作用?
- {; K' i/ |8 q$ {) i. B
t! k- G% a! d* r
-------
3 f( m' l* g. A! G) ^; x) a1 ]
- V, r' w0 `* I4 Y9 ]
Forcal中还有一个函数sum专门进行这种计算:
mvar:
% ~( I. m1 |; P$ B0 G/ K5 A
t=sys::clock();
+ [, g0 _" S7 x m/ P
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
' c- D* M' f9 v$ _) W# j# |
sum["f",0,1,0.0011 : 1,2,0.0009];
0 `) Z1 n& y u" v: I& u+ H9 e
[sys::clock()-t]/1000;
复制代码
结果:
& Y: A1 G. F, W) b3 S
1008606.64947441
% o" p x# M! m$ [( y/ D7 [* X
0.719 //时间,秒
作者:
forcal
时间:
2011-8-2 15:24
说到代码矢量化,就不能不提到大名鼎鼎的arrayfun函数,现在再来看看它的表现。
9 p( O5 X8 r" X
1 j5 r% n0 y; n5 z8 p) b1 ^
matlab代码:
f=@(x,y)cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
% q/ Y4 R8 B4 L# K4 K7 L$ }
tic
8 E4 D4 P3 D7 N& D1 y
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
/ ^& w( n# J$ f
sum(sum(arrayfun(f,x,y)))
+ c! S; N3 }" H
toc
6 Y6 M$ ^- }4 N
) J: A6 @ F$ O& X& k5 S( ]
ans =
* a% q, I; S0 p. Z
V2 N! S, E6 L/ u/ Y: u! b
1.0086e+006
; S; J" u( S% \
1 t/ `* E8 G4 K( Q
Elapsed time is 7.339923 seconds.
复制代码
Forcal代码:
!using["math","sys"];
. d% ~7 O/ U+ a A
mvar:
" @) D1 @3 {5 W2 ?( Z: w9 x& e
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
! m; v* m/ @* L9 V
t=clock(),
6 c& q* e, R9 @+ ~
oo{
7 K* q. A/ _0 x# _
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
. n. h8 E( p3 l
arrayfun[HFor("f"),x,y].Sum[]
- N+ A$ n; K" I5 N* L( m& H. e
};
4 i$ @- l, l' M$ w/ p
[clock()-t]/1000;
复制代码
结果:
& r; O) T1 z, E6 ^! V. k
1008606.64947441
0 q( @/ Q( S# t7 ^
0.735 秒
9 Y( ^! a* S5 w* n5 {, i- d
1 e1 y) N$ o; ?$ u/ J
可以看出,Forcal的arrayfun函数远快于matlab的arrayfun函数。
" }4 G) p' k: e1 n" r
$ Y2 G$ h- z* |, A8 _
--------
2 `2 l6 M! f$ C) g
' C, W3 X% o- N2 i: D- ^
从这里似乎可以看出,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