QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8744|回复: 0
打印 上一主题 下一主题

Lu基于系统内置对象创建扩展数据类型,小矩阵乘效率测试

[复制链接]
字体大小: 正常 放大
forcal 实名认证       

45

主题

3

听众

282

积分

升级  91%

  • TA的每日心情
    难过
    2012-8-27 18:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2011-10-23 09:37 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
        本例中,我们将基于系统内置实数数组创建矩阵(matrix)类型,即:基本类型为luDynData_realarray(标识实数数组),扩展类型为matrix(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。9 l$ t: s% k" N8 Q

    0 D/ f& w3 p% A! N& B4 w! G9 G4 R    基本要点:
    ; M* r% X- t2 T5 Q: }6 Q0 _  b  N* r
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。3 E! E& A# S' J7 I( u* I' e

    % n0 e* K. \1 n! b. ]( A    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    3 S) d8 A  B8 f1 d, K  k4 z
    ! o8 y8 r1 {2 U8 _9 T" ~/ `. a6 Z$ _    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    2 n1 E2 N4 |4 \; n, t6 x
    ; |, [0 Y5 B' G# d* C3 w    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>' M7 [' n+ T  s: o5 q
    2. #include <iostream>
    3. $ F# x% G% U: f5 W% @$ ^' o
    4. #include <math.h>
    5. \\" z; N- z\\" |9 P) s
    6. #include "lu32.h"
    7.   F$ \9 N5 K/ L! s2 Y. I) X6 w\\" z
    8. $ U1 w6 @6 }  r3 z
    9. #pragma comment( lib, "lu32.lib" )0 I* m. I$ A* e8 g. \# U
    10. , o% C5 T' {& M, e6 a
    11. using namespace std;
    12. / b) \4 y; K' P* y7 ?

    13. % ~) k2 r; v4 `9 r6 N: a- O6 z, ?
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    15. $ X# _, R1 o3 u# `( D

    16. , _3 [& x. b1 F; i$ A% v4 a7 i
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    18. ; Q% M2 @! t- B& l  L
    19. {
    20. * w$ N: R6 y\\" ~, i3 O( q. J
    21.         wcout<<pch;
    22. 7 Y( A( w2 n9 s5 J6 J+ \7 Q
    23. }; U2 X6 z6 z& q! W* G0 V2 S, {: d
    24. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    25.   q\\" ^( @$ o4 o2 L0 t) i/ U
    26. {) S9 D0 j* p! f. N6 s, l4 D
    27. }* F5 o$ {: t' `; p
    28. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数( _! f  g9 O. Z; {
    29. {5 P2 D' P- G# F' A; ~* J) `1 a
    30.         LuData a;
    31. , V* H  w1 d. t1 t5 z9 m. P
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;5 X  Q/ m\\" p7 D0 R/ O8 C
    33.         luVOID i,j,k,m,n,u,v;. o& {2 Z! c4 A4 D
    34.         double *pa,*pb,*pc;4 j4 G* \0 E& h; [9 |  i
    35.         luMessage pMessage;
    36. 8 W# n\\" h- N# \- O\\" c' y( {
    37.         wchar_t wchNum[32];, d) F4 A$ y( K  Q
    38.         char chNum[32];
    39. 5 A) h) Q2 x- ^( }3 }0 H
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    41. + N% B# R8 Q( h4 n$ P' m1 E
    42.         switch(theOperator)
    43. % K) s. l# q( K3 i
    44.         {
    45. 8 |5 ?\\" Q- y% _3 T- F( i
    46.         case 2:        //重载运算符*5 S3 g; f4 N; h8 T# |  W
    47.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    48. / M7 T* {) A\\" i7 r\\" E
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    50. - @( ?( h\\" Z% v' W+ z
    51.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    52. 2 x2 b6 d+ [: r5 z) x
    53.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    54. . L+ @/ P( a0 u, A( Q& k1 W& k
    55.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配$ |: U& \4 W3 P7 R4 W* r
    56.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    57. $ a* @\\" G( U9 i9 J
    58.                 if(!pRealArray3) break;
    59. * |( L% O: \6 c8 a
    60.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小9 t+ {( m9 r9 s; [( M. @* w3 b7 J
    61.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    62. : c3 t( A) h9 K: `7 T8 V' Q! o! P7 Z
    63.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    64. 4 P, V3 y6 u9 v1 i% G5 l
    65.                 for(i=0; i<m; i++)        //矩阵乘& P, o2 K2 I! S# v9 n\\" R
    66.                 {
    67. 2 x0 p* \: _! x4 S. [+ s# U# D
    68.                         for(j=0; j<k; j++)8 ~' B\\" Z3 S6 K
    69.                         {
    70. 9 S8 j, l& m# o3 x: {
    71.                                 u=i*k+j; pc[u]=0.0;
    72. 8 Y, }) ?& x9 v. z4 `5 Q
    73.                                 for (v=0; v<n; v++)- \& o7 V0 D2 W  K& r5 c+ K9 `, R
    74.                                 {+ ]6 A; a- q4 R6 ?$ T8 s
    75.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    76. ) Q' F* S, U- Y8 @4 ^- R9 r& g
    77.                                 }
    78. 1 [! F( ?5 `2 ]0 m) F7 j
    79.                         }
    80. % i3 |0 v# D* q
    81.                 }( M- q3 F5 k& j5 m7 M: s! M* E
    82.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象! f; w$ T5 V\\" k& L( \0 D
    83.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;\\" w4 n+ E: L. q7 R2 w, }
    84.                 break;5 k5 ?0 q# A  s4 [* G) n
    85.         case 25:        //重载运算符.*
    86. 8 G- ~* y( t- {\\" P+ h0 I
    87.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);3 A. k3 Y. H1 _  {- Y, I
    88.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);( ^1 a9 D3 w+ r; K
    89.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组9 t! N  i7 T  m/ |: q1 q' K
    90.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)/ Q2 @6 N5 I& y\\" E( G0 B) K\\" Z8 B
    91.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同1 M4 W4 h) n: |! Q4 t
    92.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象! t6 i. _! U\\" h2 R- z, [
    93.                 if(!pRealArray3) break;
    94. ; o$ L4 R. K% @2 j3 j- X! X
    95.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小: M8 E* c! _/ K( ?) }
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    97.   y; T) @: J# T$ }/ Y
    98.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    99. 4 f4 S* F2 {+ m
    100.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;6 x8 `! H$ j5 ^5 P) ]
    101.                 break;
    102. + g4 y7 N\\" t! m. l+ Y' [, Q
    103.         case 46:        //重载函数new6 M8 I% A, [. \1 b0 E
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数6 [7 h& i8 x, j0 Z
    105.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型6 H6 W# s0 T\\" i2 M5 r% I7 P# d2 l
    106.                 break;
    107. \\" x% ], W( ]* s( m; A2 ~* J
    108.         case 49:        //重载函数o$ y/ r- Y; i$ K; _6 d; E5 I
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);/ a: m! S) ?% P% \9 s
    110.                 if(!pMessage) break;
    111. 9 v# t( N) j/ k9 l. [# V
    112.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    113. * E* E\\" q( T( Y  q\\" A  I+ H. L
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    115. : |2 Y5 b0 y- H2 {0 c$ f\\" E0 a1 a
    116.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    117. ) U! Y1 Q* M4 h  T( O1 e
    118.                 pa=pRealArray1->Array;
    119. 1 P' ]3 d; C- p$ C3 y) t$ K7 \\\" M
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;0 i4 M3 T$ ]/ w8 A5 T$ O: ~
    121.                 for(i=0; i<m; i++)        //输出矩阵
    122. 1 d. \1 v8 `  U1 y
    123.                 {
    124. + H' U* K5 L- G9 D; W2 ?
    125.                         pMessage(L"\r\n"); k+=2;0 z! T; C- g6 D' `# v5 J0 `
    126.                         for(j=0; j<n; j++): J, Q0 o' ?. L& o% u
    127.                         {/ P. l% K3 c# A: f5 b8 T7 P
    128.                                 _gcvt_s(chNum,pa[i*n+j],16);
    129. 7 p0 x' U1 `4 o+ c$ B* i$ B; e: j
    130.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    131. 7 f6 s. Z) }; v) y) o5 i
    132.                                 wchNum[u]='\0';' e* ~3 m% J5 I, n2 A
    133.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    134. $ ?3 L% J5 G7 U( L9 y
    135.                         }' S9 r+ G/ y/ z: v4 a- Z) A\\" R
    136.                 }& H\\" ~, Y+ }; A/ M/ q: z
    137.                 pMessage(L"\r\n"); k+=2;
    138. 0 q: F& h- B3 t
    139.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    140. , z\\" n) g$ A. k2 E; Z\\" L
    141.                 break;- t* w6 h# F* S4 W8 ?
    142.         default:
    143. 0 x\\" V& t( y1 X\\" L
    144.                 break;
    145. & j% ?* p- Q' d
    146.         }
    147.   r. b2 |# X% u* g8 p- K$ B- s
    148.         return a;, G* W\\" s- ], C- n* A
    149. }. R) N; [' T\\" u4 Y( m# w+ \
    150. void main(void)+ I6 ~6 I: a6 u& H
    151. {8 Q: k  G! ?3 w$ g
    152.         void *hFor;                //表达式句柄; P  a\\" V. @; y3 e) p# S
    153.         luINT nPara;                //存放表达式的自变量个数. k) H. g$ e0 b# z
    154.         LuData *pPara;                //存放输入自变量的数组指针
    155. 1 T7 _( y3 X- b9 Z: K: J/ m# B
    156.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    157. ' X* B  S. j: M$ Q
    158.         int ErrCode;                //错误代码- \& v) _9 Y' ~\\" P- d$ Y6 M  f
    159.         void *v;
    160. , n/ |3 o0 \0 b' U3 u% ]
    161.         wchar_t ForStr[]=L"o{new[matrix,2,3,data: 0.,1.,2.;3.,4.,5.]*new[matrix,3,2,data: 1.,2.;3.,4.;5.,6.]}";//字符串表达式,矩阵乘
    162.   b) a2 G& n& D- z
    163.         //wchar_t ForStr[]=L"o{new[matrix,2,3,data: 0.,1.,2.;3.,4.,5.].*new[matrix,2,3,data: 1.,2.,3.;4.,5.,6.]}";//字符串表达式,矩阵点乘
    164. 0 `) D, Q9 [$ A5 Z4 n- _3 x
    165.         LuData Val;
    166. 9 n& N2 T1 s2 ]
    167.         if(!InitLu()) return;        //初始化Lu$ m6 B2 P  r4 ^* V* ~
    168.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    169. 2 y; c. y5 R# X9 c% A2 a8 s3 [+ W
    170. 5 J7 X5 u% q  x( K- T+ S
    171.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量% r8 R4 l; v+ p2 D* E
    172.         SetConst(L"matrix",&Val);        //设置整数常量
    173. ' r% g4 Q6 H7 G8 y* F
    174.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息  b( h7 p+ ~+ A# `
    175.         wcout.imbue(locale("chs"));        //设置输出的locale为中文5 `2 r! [* ~6 K0 D) L# o; N
    176.   
    177. \\" x8 i* Q) E6 f/ Z
    178.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    179. ) a; u* K+ W2 w
    180.         if(ErrCode)
    181.   k7 P7 m\\" }. W, |/ Z9 n  ]
    182.         {, x4 r* x! v, s( d
    183.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    184. 2 k4 @6 J* I3 H6 A6 `
    185.         }
    186. ( M9 Y: ^; }7 Q
    187.         else2 m' n; W5 N& [- M( v/ U+ O) y
    188.         {
    189. / q  j, n% M/ g
    190.                 LuCal(hFor,pPara);        //计算表达式的值( l  R! r. S8 A1 r9 v( K
    191.         }
    192. ( g' I4 v+ f: m
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用. p% r4 D- i& s$ z3 U+ V8 K0 ]# ~
    194.         FreeLu();                        //释放Lu1 `2 n/ w' m) ~  K\\" W
    195. }
    习题:
    3 Q) ], j$ q2 l" b& x8 H1 S" v
    0 e7 M* F& {$ n0 Y0 q/ B0 |    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    ! k, [6 I8 Y' J) I: F
    6 I/ k+ `( P2 {) z9 W. D    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=- E2 }* z) m1 w1 A' ~/ P0 k
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],  R  n1 }5 g' r9 }
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      4 z. o& K) p# [6 R
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      # C4 O* y+ s# d+ l7 k8 {* p% R
    5.     t=clock(),
      . Y/ o. f) x5 `\" \& p$ B$ X/ z% |
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
        t+ H. E4 J- \- t; r1 N: Y1 X2 X: j' x
    7.     o{d, "time=",[clock()-t]/1000.," seconds.\r\n"}
    复制代码
    C/C++中的字符串定义为:
    1. wchar_t ForStr[]=L"main(:a,b,c,d,t,i)= a=new[matrix,2,2,data:1.1,2.,2.,1.], b=new[matrix,2,2,data:2.,1.,1.,2.], c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.], t=clock(), d=a*b, i=0, while{i<1000000, d=d*c*b, i++}, o{d, \"time=\",[clock()-t]/1000.,\" seconds.\r\n\"}";//字符串表达式
    复制代码
    结果:
    1. 4. 5./ S0 r$ a2 g4 m% Z7 h* _2 U% R! u3 G
    2. 5. 4.* X( B! k0 \) [1 |$ r
    3. time=0.875 seconds.
      * A; |% X1 ?% f  i  {* M
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      + x% ?& e7 |! [& E1 s
    2. b=[2.,1.;1.,2.];/ o7 m) U! z  m6 O: s) v
    3. c=[2/3.,-1/3.;-1/3.,2/3.];* o: x5 o\" m  Z( R. x2 C6 t
    4. tic,
      8 C2 k1 u3 H# c$ O7 A! C
    5. d=a*b;9 L8 ?- X1 V/ |6 B
    6. for i=1:1000000
      * A3 x. \# _) |9 T7 R
    7.     d=d*c*b;, w5 W% }/ @: V. y* l
    8. end\" X& R\" i( _  h
    9. d,
      * x* A) a% ]( V\" U8 @. |( D
    10. toc
    复制代码
    结果:
    1. d =
      9 H: F/ A6 M. ]# y5 n, p
    2.      4     5
      7 W! z3 b% E) h# T0 O7 E
    3.      5     4
      & L  G: J5 w6 m
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    : q8 @9 S2 p0 N
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-2 05:15 , Processed in 0.435828 second(s), 51 queries .

    回顶部