数学建模社区-数学中国

标题: 极限测试之Matlab与Forcal矩阵运算效率测试 [打印本页]

作者: forcal    时间: 2011-8-1 08:00
标题: 极限测试之Matlab与Forcal矩阵运算效率测试
1、小矩阵大运算量测试
! I- B# x- E- `6 i/ G3 l2 z; r
) w6 x& {, q/ \+ y  B, w  WMatlab 2009a代码及结果:
  1. clear all
    8 _. o6 R# T" }) _* V. l; c, d
  2. tic* l& a9 a1 J9 g& `4 O# a' r
  3. k = zeros(5,5); % //生成5×5全0矩阵( \7 ?% |* ?- J: L/ D2 M  }! Q
  4. % 循环计算以下程序段100000次:
    , P9 ?3 g( K0 e7 P
  5. for m = 1:100000$ z) K; x" D+ S# g) M1 Y
  6.     a = rand(5,7);# B# e) o% b( J% K4 J! l
  7.     b = rand(7,5);%//生成5×7矩阵a,7×5矩阵b,用0~1之间的随机数初始化
    6 E1 ?9 |0 I0 I3 f' X7 i% |
  8.     k = k + a * b + a(1:5, 2:6) * b(2:6, 1:5) - a(:, 7) * b(3, :);
    & G2 z8 _9 K( j4 g0 k
  9. end
    ; R+ Q9 x0 Z+ D! H- E2 [8 i, Q
  10. k
    * o: W% `  j6 L0 [
  11. toc
    # c/ z. u5 Z( ]: [

  12. ( ?$ l$ `! S0 P3 _1 Y* k7 \# P
  13. k =9 b) g( N. @! a
  14. 0 j' ~* S; m1 `' G+ V
  15.   1.0e+005 *  t! ?- _; V8 _. Z- o) Z

  16. ! Z9 M+ _2 I5 h/ r1 a) d
  17.     2.7525    2.7559    2.7481    2.7525    2.7511
    6 W3 K3 r: U9 u6 l
  18.     2.7527    2.7535    2.7430    2.7545    2.7484& c3 p/ }; k  M, A
  19.     2.7493    2.7553    2.7440    2.7513    2.74858 b% A' l1 d4 S, j% ]8 f3 ~
  20.     2.7481    2.7506    2.7425    2.7457    2.7460
    % u3 _5 W7 M( n9 o
  21.     2.7506    2.7525    2.7429    2.7488    2.7451& t* P; n. k$ _3 {

  22. & M. ?! G( d+ w4 _. r; B
  23. Elapsed time is 1.979852 seconds.
复制代码
===================
( l% }+ X$ Q) ?" L0 f% J3 f9 k, A/ F& e7 t) ~
Forcal(OpenFC演示)代码:
  1. !using["math","sys"];) R1 L9 I: Q7 N' s5 P% Q! j( P. @
  2. (:t0,k,i,a,b)=
    & C9 ]# n, b2 I/ ]
  3. {
    - _3 L0 J% u7 A; [/ U6 C
  4.   t0=clock(),
    3 c# u0 y9 P8 k1 j6 g) ?2 x+ K
  5.   k=zeros[5,5],
    : l! W) W2 X0 A2 y
  6.   i=0,(i<100000).while{7 `- L4 Y8 P" ~; i9 ]2 ]$ ?! z
  7.     oo{0 p1 w0 ~% g1 _' ~$ W# S( j2 v
  8.       a=rand[5,7], b=rand[7,5],
    2 N! @( k6 K( \% `# Q" q
  9.       k.=k+a*b+a(0,4:1,5)*b(1,5:0,4)-a(neg:6)*b(3:neg)5 B  Y  K) c  T( e6 G
  10.     },5 X' h0 ]( N, V$ U/ U* a
  11.     i++
    ; z1 ^' `4 j: y! `2 c
  12.   },
    4 O& T! g# \% O8 u
  13.   k.outm().delete(),4 [. V& ]( F, W6 M
  14.   [clock()-t0]/10009 V0 E1 {( J8 ~. c" v
  15. };
复制代码
结果:
  1.          274978         274892         274913         274949         274953
    0 v$ T- {0 k' w) H9 s8 ^& x6 O7 ]  H
  2.          274994         275050         275001         275037         2748922 J! C0 ?, w9 L
  3.          275001         275063         275019         274963         274971
      Y! @( M  J; l: j7 ?. s9 r2 g. o
  4.          274945         274999         275017         274983         274982
    . ~0 [* G4 J1 e( U, J) j
  5.          275009         274984         274971         274955         274923
    8 m4 n# E/ C' c2 |, `& O

  6. $ W5 Z3 n) N9 }! V0 o1 w9 I+ f
  7. 3.516  秒
复制代码
此类运算Forcal的效率有Matlab的一半稍多一点。
  M% M$ S* n* F$ C% Q) J  K. x. L
8 Z& m9 g8 {7 m- u! K==================  Y) u1 u9 d) {; g9 Y
==================) {$ l' t9 R. h6 W% F

; _0 T6 `- K/ H* Q0 n8 J& X2、大型矩阵乘
5 W" @: B+ ~$ x0 ]# c! ^4 E( D$ w( h
2 w# u8 a. U/ D3 @( K! N- hMatlab 2009a代码及结果:
  1. clear all
    1 _3 ?0 L. E# G2 ^! h8 `, K( R1 B
  2. a = rand(1000,1000);2 I4 U% \- a% D
  3. b = rand(1000,1000);, K7 i/ w/ O/ B# _! W, w
  4. tic
    ( R5 S8 [9 q8 z, ?% h9 p* J
  5. k = a * b;
    ( F/ g/ U* @8 w! m# r0 ~: J) m
  6. k(1:3, 5:9)4 U2 M* s, C9 B+ R2 W# j. J
  7. toc6 f  H8 ]6 o! l% }2 d
  8. 9 ?9 }8 b. _3 q, }
  9. ans =
    * |! T1 q! I! ~
  10.   R$ n, @2 P" r1 y* L3 Y1 M
  11.   246.1003  244.3288  252.9674  258.1527  243.9345
    2 r& A; L1 Y2 D
  12.   246.7404  236.1487  249.7140  251.3887  246.0294
    ( N7 \" |5 Q) P3 u6 J7 i+ i
  13.   249.4205  240.5515  252.5847  257.0065  249.71375 C/ c% a+ V: U5 g4 D" |

  14. ( w$ J, H& ~1 @5 Z7 t
  15. Elapsed time is 0.310022 seconds.
复制代码
===================, f! o" S7 F8 Q

- L$ _7 p  ~7 G  f: [% x, ~7 DForcal(OpenFC演示)代码:
  1. !using["math","sys"];
    # w* U$ S4 c% u% Z. n  h: m5 `" ]: S: m- r
  2. main(:a,b,k,t0)=: X! Z; X$ N" G; M: R/ O
  3. oo{
    : A% J% V* k5 R
  4.   a=rand[1000,1000], b=rand[1000,1000],0 j# Q0 T# g% G4 a
  5.   t0=clock(),
    7 c5 k# l8 d* H8 E' z. g8 }
  6.   k=a*b,  //矩阵乘0 |7 g( Q, ]5 y) M4 V" i1 b1 {* r2 I
  7.   k[1,3:5,9].outm()
    5 F' T  x+ u' P& q, i& l5 i( u
  8. },
    5 Q9 }  ~% _/ k$ x* @, N
  9. [clock()-t0]/1000;
复制代码
结果:
  1.         247.009        245.731        242.454        247.412        244.482. N1 J  R$ i: t1 u& S1 T) J6 r
  2.         258.268        255.417        253.738        255.159        253.042! `9 V1 d  R! C( l
  3.         258.088        252.324        248.927        252.392        247.731
    # V7 n, X! Y0 j( B

  4. " @5 U; r  [  u6 Q
  5. 2.25
复制代码
此类运算Matlab的速度约是Forcal的7倍多。
' V- q; Q7 E) D: n( D0 H1 c- k4 H  ?2 x. F! x3 g
==================/ a7 [0 g$ Q# U' ]
==================' C$ W( I2 K* G& {/ f, R/ S- f! [

  B& V! `! b8 J$ v" l2 p: x) h矩阵运算是Matlab的优势。不过,个人认为,矩阵计算速度取决于算法,矩阵算法只是众多数值算法的一种,不属于语言的基本特性。然而,拥有高效的矩阵算法是matlab的骄傲,就像优化算法是1stopt的骄傲一样。& u$ t% W  y' N5 H9 O. L1 p
0 a2 F: P+ d( Z0 E& M; S9 F
Forcal的矩阵乘是用普通的矩阵乘经过改进而成的,效率自然低,但所有的数值算法包括矩阵运算是由Forcal扩展库实现的,只要有高效的算法,Forcal便可大展身手,为所有这些算法提高更高效的服务。
" v+ T0 X& S" [, j! |, y
" E; l4 s3 E! C# A9 l- \) _除了矩阵运算,Matlab还有许多非语言特性的优势,例如函数图形功能(不包括其GUI,Forcal是嵌入式脚本,C/C++、Delphi等的GUI就是Forcal的GUI)、符号计算功能、控制仿真、金融建模等等。这些实用方便的算法模块使matlab获得了广大用户的青睐。
作者: chairong    时间: 2011-8-1 10:38
这个不错啊 嘻嘻。。。: \/ j4 {2 K0 W$ _& ~0 D) J
6 d) y! j$ C5 p9 _2 \: S

作者: 发现者2011    时间: 2011-8-1 14:04
henhao  ............- X" Y1 Y) M& N& y9 l3 B

作者: 碧天云淡    时间: 2011-8-1 16:42
matlab的优势很明显的
作者: alair005    时间: 2012-2-7 13:01
支持一,下楼主辛苦了45578073860093
作者: zcBCuikgh    时间: 2012-8-11 21:27
济南夜场招聘,济南翰林商务会所招聘夜场模特佳丽13156404415,400每台,小费日结无押金。qlktv.net




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5