数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-1 08:00
标题: 极限测试之Matlab与Forcal矩阵运算效率测试
1、小矩阵大运算量测试
8 e3 V, C( M# J& D! x& U3 M
- h% `( V% _& u) a* t$ ?Matlab 2009a代码及结果:
  1. clear all( x; b2 T9 C$ Z. k6 W  g, {
  2. tic
    " U/ g- b9 z& c6 Z, Z' }6 z1 k
  3. k = zeros(5,5); % //生成5×5全0矩阵/ n6 Q3 D3 u& g+ w3 B: Y  O1 V
  4. % 循环计算以下程序段100000次:
    9 R; @+ x( I6 I" k( o4 M2 W
  5. for m = 1:100000
    $ \1 V( W1 Q% J6 _5 H; m" t# ]
  6.     a = rand(5,7);5 K$ v! T# y" ]" Z
  7.     b = rand(7,5);%//生成5×7矩阵a,7×5矩阵b,用0~1之间的随机数初始化
    - L/ a# R! m1 e1 n) y
  8.     k = k + a * b + a(1:5, 2:6) * b(2:6, 1:5) - a(:, 7) * b(3, :);
    : n0 I1 r; p, U* _2 `9 {  @3 O- m$ Q
  9. end! Y8 W0 w: \* q' a9 A
  10. k+ b0 L4 \. v9 O$ L
  11. toc
    # Q. i1 j8 `: ?6 v& ?
  12. % m4 j% J: |& C+ V: b3 u+ w
  13. k =' K- D2 U) b$ t- q  t( d: G0 w& q
  14. ' a/ J( j! W" E8 h* e. \- R
  15.   1.0e+005 *
    8 K2 Z, u: ?8 I8 n. @* u) m0 g/ P

  16. ! b. N6 x- J9 n% V* H% a) x) R$ Q
  17.     2.7525    2.7559    2.7481    2.7525    2.7511' h3 ]( Y! f+ l* _+ ]* c# d
  18.     2.7527    2.7535    2.7430    2.7545    2.7484
    ! p; O$ P9 J- ]4 X- h( m
  19.     2.7493    2.7553    2.7440    2.7513    2.7485
    ; w- `8 n8 z, ?3 ]. e5 a/ P
  20.     2.7481    2.7506    2.7425    2.7457    2.7460
    , [8 @; C$ G/ L9 ^
  21.     2.7506    2.7525    2.7429    2.7488    2.7451
    9 c; o7 t2 t, W# P1 \
  22. 2 x1 F1 R* i0 j9 n0 _, l
  23. Elapsed time is 1.979852 seconds.
复制代码
===================
- b" d3 F  ^' r" ]; O$ A8 I4 W# A% o9 G; L6 P7 ~& l7 G
Forcal(OpenFC演示)代码:
  1. !using["math","sys"];
    9 u  a5 a& b& W" p* {
  2. (:t0,k,i,a,b)=
    8 V' [& D  m6 I% b
  3. {! f5 @2 a5 t2 e9 c2 h- G& J  a
  4.   t0=clock(),9 [6 E+ j/ z4 P/ a
  5.   k=zeros[5,5],
    " m9 A7 I4 @$ w, N5 Y
  6.   i=0,(i<100000).while{; e2 m# ^' X5 i5 d' |
  7.     oo{  X4 p3 k( d7 Y/ d" |  L
  8.       a=rand[5,7], b=rand[7,5],
    ) H6 A# O% ]0 ~/ G: X
  9.       k.=k+a*b+a(0,4:1,5)*b(1,5:0,4)-a(neg:6)*b(3:neg)
    : ~9 I3 k$ O4 m; }
  10.     },' G5 N4 Y3 p9 Y. ]9 O
  11.     i++' W1 w- N0 Y* e8 o8 @- ~
  12.   },4 A$ C$ W" [( `8 E# ^
  13.   k.outm().delete(),5 H4 L. W, e; q. l
  14.   [clock()-t0]/1000
    % q: N9 ]9 c6 Q7 X7 ]
  15. };
复制代码
结果:
  1.          274978         274892         274913         274949         274953
    - u4 \3 O. F( h9 k0 n% ^
  2.          274994         275050         275001         275037         274892
    5 U* |* d& C/ ]+ [
  3.          275001         275063         275019         274963         274971* u* w3 P+ A9 N7 Y; O3 _
  4.          274945         274999         275017         274983         274982$ p" s7 {% e+ y. g
  5.          275009         274984         274971         274955         274923
    ; z  Z  o0 F: y2 M( B; @/ [/ s
  6. + W9 {1 {! p6 V7 O, e+ P
  7. 3.516  秒
复制代码
此类运算Forcal的效率有Matlab的一半稍多一点。
3 ?. c$ T/ W# A1 t2 [% {5 d( Q" c0 \/ Z+ |
==================$ {' r) r+ k5 _/ N4 @1 s
==================
  [5 R% |; [2 Z1 o; L: L! `
& O* c2 B$ O0 p& y  U( I( A2、大型矩阵乘
$ Z% u% _8 |% v5 @$ }
3 t, [* Q  N2 I. n  n) wMatlab 2009a代码及结果:
  1. clear all. P0 `& h6 ~! `% ^& Q' T7 a
  2. a = rand(1000,1000);, K1 l; R% [- B: W4 {! _! {/ Q
  3. b = rand(1000,1000);* N- s+ j5 E; F# w0 S
  4. tic
    $ m' u0 X% P- h$ ~2 t
  5. k = a * b;
    # w8 [0 k* ^- V/ u" W% W$ O
  6. k(1:3, 5:9)3 Y3 A* K/ G: F, [5 x
  7. toc& }9 J0 h" N6 ~$ x7 @

  8. , S, c& K' o8 r5 @& g' t( S' r
  9. ans =
    / y1 u. i! [3 I) q0 U. s( ~( y% ^3 L
  10. 9 P2 V( z: r; R7 U- `
  11.   246.1003  244.3288  252.9674  258.1527  243.9345
    ' x" O5 h; R- A" d
  12.   246.7404  236.1487  249.7140  251.3887  246.0294" P2 e; d# ?2 l
  13.   249.4205  240.5515  252.5847  257.0065  249.7137
    1 I0 Q( g2 M. e" N/ H0 B; ]% i

  14. & K6 U9 Y, z4 i$ Z& J# N" x3 G+ C/ V
  15. Elapsed time is 0.310022 seconds.
复制代码
===================0 r4 b% w0 b5 Z+ u3 R8 ~' u8 B

# i9 T; [: j" qForcal(OpenFC演示)代码:
  1. !using["math","sys"];
    5 T2 [/ Y8 L. j! P# C& C" u+ d
  2. main(:a,b,k,t0)=8 u! ^2 `- L3 w; |$ C" a
  3. oo{- l  n* c. U% X/ M" I: [
  4.   a=rand[1000,1000], b=rand[1000,1000],
    / R- E( B8 k  c6 C$ I
  5.   t0=clock(),
    ; \  q0 r7 V- H5 l3 c( d. G4 S- D
  6.   k=a*b,  //矩阵乘
    * Z6 I3 D  c- T" @( y+ l/ i# y
  7.   k[1,3:5,9].outm()( v" {" Z8 V* |% _" Z
  8. },
    ! ^: N( F! ~: A
  9. [clock()-t0]/1000;
复制代码
结果:
  1.         247.009        245.731        242.454        247.412        244.482
    6 n/ F5 y/ k% F+ d- ?, E
  2.         258.268        255.417        253.738        255.159        253.042  I0 o6 i+ j3 R) ]: m
  3.         258.088        252.324        248.927        252.392        247.731
    % w, ~9 M$ P. r0 I( f/ T
  4. & q: L- V3 a+ e1 G* L
  5. 2.25
复制代码
此类运算Matlab的速度约是Forcal的7倍多。
5 {9 U0 e; ]1 W0 r" L+ c! f- k# X& W; I$ Z: B( G: _$ N" g
==================: `0 }" Q9 [: y$ Q! p$ O& i
==================
! }- s" k# u* }2 |  E
# s* C% _/ I9 M  j+ S矩阵运算是Matlab的优势。不过,个人认为,矩阵计算速度取决于算法,矩阵算法只是众多数值算法的一种,不属于语言的基本特性。然而,拥有高效的矩阵算法是matlab的骄傲,就像优化算法是1stopt的骄傲一样。
" V: G( Z. e8 ~. ^" D5 f, ^1 v! z* p8 r0 G* e) }; E
Forcal的矩阵乘是用普通的矩阵乘经过改进而成的,效率自然低,但所有的数值算法包括矩阵运算是由Forcal扩展库实现的,只要有高效的算法,Forcal便可大展身手,为所有这些算法提高更高效的服务。+ }( u$ L' j: x2 @! F

8 E: U  G% |1 ~" Z# ^: m$ ~除了矩阵运算,Matlab还有许多非语言特性的优势,例如函数图形功能(不包括其GUI,Forcal是嵌入式脚本,C/C++、Delphi等的GUI就是Forcal的GUI)、符号计算功能、控制仿真、金融建模等等。这些实用方便的算法模块使matlab获得了广大用户的青睐。
作者: chairong    时间: 2011-8-1 10:38
这个不错啊 嘻嘻。。。
3 H3 R3 j" p" D
7 u/ N  C* Z. t4 }6 q
作者: 发现者2011    时间: 2011-8-1 14:04
henhao  ............+ h5 m! `) r  _1 ?

作者: 碧天云淡    时间: 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