数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-1 08:00
标题: 极限测试之Matlab与Forcal矩阵运算效率测试
1、小矩阵大运算量测试, d8 E3 Q. e% s2 a
# ~7 F, W: [2 E0 }3 _/ j& K
Matlab 2009a代码及结果:
  1. clear all" E- P% _. P6 Z5 O8 d3 B9 j2 S
  2. tic6 v) j- A/ D6 ?  X0 j$ Y, h/ z
  3. k = zeros(5,5); % //生成5×5全0矩阵7 n& v2 t' o: n5 Y( }5 D
  4. % 循环计算以下程序段100000次:
    : n6 A: h# E& t' |
  5. for m = 1:100000
    3 b; k* I1 q2 |: C: q7 U- R- f
  6.     a = rand(5,7);0 z* G  v# `7 F7 b9 k7 Y
  7.     b = rand(7,5);%//生成5×7矩阵a,7×5矩阵b,用0~1之间的随机数初始化0 X6 T+ ]& B$ e5 ?* z+ l% g. ?
  8.     k = k + a * b + a(1:5, 2:6) * b(2:6, 1:5) - a(:, 7) * b(3, :);
    + k. b" V; i2 n& {
  9. end
    6 r7 k0 P, H; t5 e, ]) b
  10. k
    8 o* n# \* K: {4 D0 O
  11. toc4 }, }1 n. K) q* \  V! D

  12. : q' J  x6 O% X! i# z' ~; t
  13. k =
    & z0 M; E/ \$ N# l) P3 S. j9 }7 ^

  14. 7 {/ R! H+ R7 q. u
  15.   1.0e+005 *' K7 ~8 T- p2 D" a0 k% Q( h& M
  16. 0 O: D- O/ {: U5 J7 z
  17.     2.7525    2.7559    2.7481    2.7525    2.7511
    : U$ ^$ ]  Y* y' U" o7 ^+ K; _
  18.     2.7527    2.7535    2.7430    2.7545    2.7484
    ) W" \- l: |2 J) m# v* c
  19.     2.7493    2.7553    2.7440    2.7513    2.7485  c3 B+ f' g6 _+ w! A! `) P4 p) {- z
  20.     2.7481    2.7506    2.7425    2.7457    2.7460
    5 M# ~5 Z2 v( Z8 ~
  21.     2.7506    2.7525    2.7429    2.7488    2.7451
    ! J: W* C$ q- E
  22. 0 G' a7 a5 ~, f# S- j$ @
  23. Elapsed time is 1.979852 seconds.
复制代码
===================. i5 a; {  s/ A9 u

" z0 D- Z7 ~5 i0 {8 y- _' nForcal(OpenFC演示)代码:
  1. !using["math","sys"];9 j% x0 }6 [/ y* u+ Q  E9 V
  2. (:t0,k,i,a,b)=- q7 [0 S+ F- N: C+ v+ i% n
  3. {& a, U" p( l. `+ g; y  w5 U4 p
  4.   t0=clock(),8 e+ s. s! f$ X" X1 e& J: d
  5.   k=zeros[5,5],
    ' D9 z3 z0 ^+ D: ]1 |
  6.   i=0,(i<100000).while{
    2 S/ x. c( \8 e/ y0 T
  7.     oo{6 c3 i. t2 \4 h" r1 c! b
  8.       a=rand[5,7], b=rand[7,5],
    $ d- R; U7 F# ^9 A* ~( p$ o! W
  9.       k.=k+a*b+a(0,4:1,5)*b(1,5:0,4)-a(neg:6)*b(3:neg), u5 f# v# y/ i+ Y( i4 ~2 G, N
  10.     },) Q! ?# Y0 E; R/ l6 ?
  11.     i++, m8 f9 V7 Q2 N* k
  12.   },- l' v, c- [- D5 L% ?
  13.   k.outm().delete(),4 q* i# g* H2 r- X, w
  14.   [clock()-t0]/1000
    ( ?  c8 W" O$ B0 L# I8 X( t+ G
  15. };
复制代码
结果:
  1.          274978         274892         274913         274949         274953
    ' C% h! M/ Y% U, {: X
  2.          274994         275050         275001         275037         274892
    " w0 g# n8 ~5 B/ B
  3.          275001         275063         275019         274963         2749712 y. P* {/ g1 b+ E+ z+ W
  4.          274945         274999         275017         274983         274982. o# ]2 H: ~& e" G% P! {
  5.          275009         274984         274971         274955         274923( t" {# L4 }3 L5 g1 Y' S

  6. 6 z5 X  Z; _8 F: h( U
  7. 3.516  秒
复制代码
此类运算Forcal的效率有Matlab的一半稍多一点。
0 N0 \# O. W2 A* P( X# ^2 H' d) E( ~! g. G
==================
. N& u5 [) d: }; }- v==================
0 |; O$ T' U5 W$ f" O% Q5 Y) X% G+ {: |
2、大型矩阵乘3 g: ~7 z, v* N3 r% y" [. N

& s* V( |+ w" A* k! `Matlab 2009a代码及结果:
  1. clear all
    9 M! X! q7 k  z1 b3 n
  2. a = rand(1000,1000);
    ' n& {6 g( h) U* y* [9 r0 z
  3. b = rand(1000,1000);/ Z' |$ g* m, C: j! O
  4. tic9 t: G( j, Z  r7 u% S& E  q
  5. k = a * b;
    9 D' Z& N' u& [% Q5 l4 l, l! f  ~
  6. k(1:3, 5:9)) l: H, V1 }! A% a" o8 q
  7. toc
    - K4 @# I# E' z* `! o

  8. ( g3 z& Y  }$ o# C* W: l6 W" p( T$ `
  9. ans =
    4 a$ G4 p6 @2 u: T0 s2 M
  10. - o- E" I4 T: P0 b  @0 ?( t
  11.   246.1003  244.3288  252.9674  258.1527  243.9345
    : e+ D6 ?5 v) [/ V( {/ i
  12.   246.7404  236.1487  249.7140  251.3887  246.0294
    ) w2 t8 U/ n/ E1 _
  13.   249.4205  240.5515  252.5847  257.0065  249.7137, h; ?, N8 a5 n8 N( N

  14. ! D3 `& U, j. b3 o8 ]. a, x- V
  15. Elapsed time is 0.310022 seconds.
复制代码
===================- C6 l6 d& S# |3 c6 o* o1 ?

" K8 V9 P: R, l7 M: |# [Forcal(OpenFC演示)代码:
  1. !using["math","sys"];4 X' d- G9 q3 \8 K% u3 F
  2. main(:a,b,k,t0)=3 G! F$ i0 b6 a& \# s) X( z
  3. oo{
    , r. n9 B3 |$ D! [% M" \
  4.   a=rand[1000,1000], b=rand[1000,1000],  Z+ u' A+ `4 M# ^
  5.   t0=clock(),0 ?; W/ K, ?  s3 C3 t
  6.   k=a*b,  //矩阵乘! ~5 v6 c- p3 K# z
  7.   k[1,3:5,9].outm()% p* E- B% o5 X5 D
  8. },
    $ D2 R# G' y4 M" I, t! _
  9. [clock()-t0]/1000;
复制代码
结果:
  1.         247.009        245.731        242.454        247.412        244.482( N0 C9 H3 u/ X. z. q
  2.         258.268        255.417        253.738        255.159        253.042- g) z  q7 \! y9 x& k7 C3 m
  3.         258.088        252.324        248.927        252.392        247.7314 i# U# M* l7 j; o$ q6 N0 N3 A4 t

  4. + T! |, B( I" T: \( o1 ~. F* E
  5. 2.25
复制代码
此类运算Matlab的速度约是Forcal的7倍多。  Q+ R- q! t( v( C- ~6 Z( j
$ \  m9 F: g  o, v, v) j
==================
8 c5 w/ m$ o7 r  d- w' ^==================
! L2 h, A; Q2 O+ ~, @: B6 r7 i7 H4 B
8 a, r7 _5 f4 s( M! x0 t, |矩阵运算是Matlab的优势。不过,个人认为,矩阵计算速度取决于算法,矩阵算法只是众多数值算法的一种,不属于语言的基本特性。然而,拥有高效的矩阵算法是matlab的骄傲,就像优化算法是1stopt的骄傲一样。7 B" ]5 x! W' M0 A+ H
# A% k) u( Q7 {4 o
Forcal的矩阵乘是用普通的矩阵乘经过改进而成的,效率自然低,但所有的数值算法包括矩阵运算是由Forcal扩展库实现的,只要有高效的算法,Forcal便可大展身手,为所有这些算法提高更高效的服务。8 m7 |- k. L5 Q5 s
# H7 a( d& c2 H0 C( }+ _
除了矩阵运算,Matlab还有许多非语言特性的优势,例如函数图形功能(不包括其GUI,Forcal是嵌入式脚本,C/C++、Delphi等的GUI就是Forcal的GUI)、符号计算功能、控制仿真、金融建模等等。这些实用方便的算法模块使matlab获得了广大用户的青睐。
作者: chairong    时间: 2011-8-1 10:38
这个不错啊 嘻嘻。。。
/ E2 r# P2 u8 X! F. ^& B% L4 b6 w

作者: 发现者2011    时间: 2011-8-1 14:04
henhao  ............& w( P/ g, ?$ g; ]

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