数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal代码矢量化
[打印本页]
作者:
forcal
时间:
2011-8-2 15:02
标题:
极限测试之Matlab与Forcal代码矢量化
代码矢量化是matlab的特色,但这点似乎不难实现。代码矢量化的优势并不明显,通过一个例子说明。
//用C++代码描述为:
1 B. i; \$ i6 O) g
s=0.0;
! z5 W* \" ?2 e! j
for(x=0.0;x<=1.0;x=x+0.0011)
& y8 b9 @1 l( N* l7 H5 r
{
7 N! G1 V. d& t: s. I' ]
for(y=1.0;y<=2.0;y=y+0.0009)
, {' Q. R( z8 y. r5 y
{
; n0 X5 V$ k/ K! [8 X
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
& a+ t, p/ K. G/ k9 a
}
5 e1 i8 i' u3 F4 a8 \: ]1 `6 {
}
复制代码
Matlab代码:
tic
) d; T5 f2 w9 q% O4 A& J
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
6 [; j2 N: h* U: A4 w* C
s=sum(sum(cos(1-sin(1.2*x.^(y/2)+cos(1-sin(1.2*y.^(x/2)))))))
; v7 K: y/ n+ u2 M! R( Q
toc
7 l, X r" U' T. o$ b* u6 |/ g
# A9 w$ c8 \) ~1 X0 P+ J0 q
s =
) s; n% M5 |7 t3 h% t5 ? D7 D
D/ d, A! n0 G3 o; y3 o7 h9 V
1.0086e+006
7 h- K0 ]& f9 V, Q* L% _/ T
9 c, ^# p$ H Q d/ d; `
Elapsed time is 0.561108 seconds.
复制代码
Forcal代码:
!using["math","sys"];
3 c$ ]1 L! P/ s9 b' s- k( `
mvar:
7 `2 ~# @$ a8 G3 ]5 X1 R, G6 W
t=clock(),
' t% \3 Q! J( u- Z8 F0 v9 {, P
oo{
( ?2 i7 O2 \% ]) ?4 Q
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
; Z" ~! g" _2 ]4 [( |, D2 n# K
Sum[Cos(rn(1)-Sin(rn(1.2)*x^(y/rn(2))+Cos(rn(1)-Sin(rn(1.2)*y^(x/rn (2)))))),0]
/ x2 |) `+ s/ i9 a) K
};
* [* T; s! [/ n- F- f
[clock()-t]/1000;
复制代码
结果:
. w W! ~ P' V T5 f
1008606.64947441
6 V) W2 S9 @$ [& w
0.641
3 B& b$ K0 T( ?6 ^ k& c0 i) k
" R8 D6 R9 m( Z3 S8 i( c
Forcal比Matlab稍慢些。
1 `; R8 r- p* z* D3 r- d# c
+ `! Z+ X" s* X# [
----------
* X& `* M2 U1 b+ u0 T! M
- M1 B4 M6 z5 _, a
再看循环效率。
& B! ]; t* a8 l( q( g
, ^. K# C6 c: y8 @9 k* n$ Y
Matlab代码:
tic
( U- I, D8 Z4 U! w2 K- l
s=0;
4 ]& D% U6 a5 U7 J* w6 R9 g2 y6 v
x = 0;
. t! i8 t! N" D2 ^- T$ ^
y = 1;
" h9 _, {% g* ^6 U% t# e
while x<1
( Y. I! l2 j) J6 ~9 ?: z! |1 N
while y<2;
0 M, Q# l) k! v! I2 d
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
+ i1 P: b4 }0 r1 F2 r
y = y+0.0009;
0 o$ i. w+ B8 f* E3 c7 e7 a( C
end
! ^: K. o5 ?$ ?2 @& x
x = x+0.0011;
6 j$ w4 k" v5 J$ q1 n; t
y = 1;
, V. B; q7 i( C; u% e r7 A( u% _
end
5 J5 R4 }* _: A F( Y
s
# N1 t$ {! Z* k: V2 H
toc
( n( {9 v1 C- p3 T
: {' N, h" K0 `' h' S
s =
& U: S8 c3 a" O( N% O' x5 T+ A6 \
' d5 E. J, |) ^1 B' z
1.0086e+006
, u3 L& a/ k4 k* B y, _1 l1 I
+ @( x# S+ Q# L' H3 ^
Elapsed time is 0.933513 seconds.
复制代码
Forcal代码:
mvar:
$ O) _& V9 P4 a, ^
t=sys::clock();
2 c% A L- M9 w& q& X6 v
s=0,x=0,
8 A1 ^7 y5 S& w) o' {* D8 f% Y
while{x<=1, //while循环算法;
# X9 e- r. Z9 J2 @% B! G* ?0 M
y=1,
% y7 Z% W$ k, u/ u
while{y<=2,
* t* g2 m# n; l- H* H# o
s=s+cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2))))),
" r8 S* M9 `. I0 o" P5 G
y=y+0.0009
8 T% F/ u/ S- C! N( M
},
/ V2 }) L8 \, v5 P& i' V+ w; F
x=x+0.0011
; `4 i E% t" H+ A- p
},
3 Z+ X5 ^- D9 f" K5 U/ s
s;
6 Q$ P6 U4 T. y. S) ]6 {) D
[sys::clock()-t]/1000;
复制代码
结果:
+ h. o$ U: O1 k# }
1008606.64947441
+ X; y6 d7 e) _9 n3 N8 `
0.734 //时间,秒
* K* t7 Q+ `" }. A0 N
+ b& P6 y* ?3 J& c
我很奇怪,在这个例子中,matlab的JIT加速器为什么没有起作用?
# b G: L" h& E6 R
! E# i; q$ j" Z" ^* v2 U
-------
# t& |! u( v! e
* S6 G7 N3 y, W1 o+ V
Forcal中还有一个函数sum专门进行这种计算:
mvar:
. [# Z& s- T. x9 h
t=sys::clock();
3 X6 `' S- Z$ W0 A2 e) z
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
" k# N7 ^. q/ e. c
sum["f",0,1,0.0011 : 1,2,0.0009];
! m+ U" p0 {+ F( |3 p
[sys::clock()-t]/1000;
复制代码
结果:
8 z) E! j( a( v9 r
1008606.64947441
2 R: P- W6 S7 g6 I0 }) r j6 x
0.719 //时间,秒
作者:
forcal
时间:
2011-8-2 15:24
说到代码矢量化,就不能不提到大名鼎鼎的arrayfun函数,现在再来看看它的表现。
, S1 U3 _; Q* h# B; @
6 u, T, w% r6 }% L. c: R
matlab代码:
f=@(x,y)cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
" f+ s' ?, W) C$ x" e. J( Z
tic
& k2 P5 x5 E$ n) P8 s
[x,y]=meshgrid(0:0.0011:1,1:0.0009:2);
) Z: F. V$ n5 P$ k! g) e. |
sum(sum(arrayfun(f,x,y)))
# D6 w' Q6 y: c$ t6 q
toc
, l4 t: {( B6 M) H& ^9 N
( Z: s: Q9 ^3 B7 t N
ans =
: A4 @/ c- c- w' p! p. b8 f
, n+ W _7 Z% W6 [* C
1.0086e+006
6 z6 G* q! s& c. z# B: W
5 ~( ^& M& o7 ?4 w& B, T: [) o
Elapsed time is 7.339923 seconds.
复制代码
Forcal代码:
!using["math","sys"];
( [ M+ K; D* ?
mvar:
- v5 s+ h' c, w
f(x,y)=cos(1-sin(1.2*x^(y/2)+cos(1-sin(1.2*y^(x/2)))));
' K9 F% D. G5 {1 d( ]
t=clock(),
1 F7 {& w; L9 r5 ^9 q
oo{
; W0 C) G. o5 `. u: j l9 k) l
ndgrid[linspacex(0,1,0.0011),linspacex(1,2,0.0009),&x,&y],
) a) B. o; i6 }9 e6 w f
arrayfun[HFor("f"),x,y].Sum[]
& U% ]: D( |1 K+ \
};
7 g& D x5 D; d' O2 t. [0 ?$ v7 A
[clock()-t]/1000;
复制代码
结果:
& c; |! Y! f3 G. O& y
1008606.64947441
4 r8 Y x \+ _6 P m# s5 r
0.735 秒
: w n( B+ g3 h, ]8 x2 p8 Y) W8 n
5 l6 P( |/ \& W5 N
可以看出,Forcal的arrayfun函数远快于matlab的arrayfun函数。
/ g. I% J- g+ B! ?6 {5 O
) [: _6 U/ K; W2 f7 Y2 d
--------
3 k. q* R# l" l+ A
2 t7 Z" N" \2 A6 [
从这里似乎可以看出,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