QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8675|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    7 _) B; H3 g9 G: r9 Q/ }' _& n6 U# D5 C8 f% {0 w( Q# \
        基本要点:
    - i, W( `& Z1 F; e& W$ g
    ( B5 v2 o0 q* v  N9 `  j    (1)为扩展类型matrix编写运算符重载函数OpMatrix。* k. n6 t0 Y; w% y  N% F2 G6 S3 t5 m

      U$ ?4 J" A# T" y+ Y9 V, @; G    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    4 t& ~. {' ]) s" r, n9 M- Y7 J. L1 ]. X, r! i' J: [& N
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    ) H! U$ I9 Y/ {* V) l2 Z6 {' M4 [/ k
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>6 a- R1 g( ^4 h$ G/ ^
    2. #include <iostream>1 O% L- ~; G% V. [
    3. #include <math.h>
    4. ! w. J6 _% Q# k2 G) l0 r. v3 c
    5. #include "lu32.h"
    6. - ]; y7 y3 w' U* u9 d
    7. $ V; M1 p4 k# \* m6 U' g$ ?3 S
    8. #pragma comment( lib, "lu32.lib" )
    9. ' r# i1 ~* L% A' L
    10. : [0 I0 h9 {6 {* q4 g4 P
    11. using namespace std;! t8 J/ w5 W7 }
    12. $ G3 v/ E5 J: Q# L0 i
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定7 M' `4 r6 u& H- [! Q/ [
    14. ! w/ ^4 \' ~  i; s) H2 Z, k
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. \\" ]- q6 _! E2 o3 P# K
    17. {
    18. % ]\\" U' w0 c- M
    19.         wcout<<pch;3 l) q) }; B* b& k4 _
    20. }
    21.   u* V\\" T+ `: k4 G, O0 o% ?6 `+ g  T
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    23. 9 S6 C9 L% V! r8 R, G
    24. {3 c! N, m\\" R( x( n4 W: m1 n5 ^& K
    25. }
    26. 9 q; n5 E+ r9 M\\" g! w
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数0 H* W3 M3 I& b' l4 J
    28. {
    29. , A# w% H4 b7 P\\" s- v/ M
    30.         LuData a;
    31.   z8 f- n: T2 m6 N# X\\" Q4 Z$ S
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    33. 9 R5 x8 G- C% B6 Z1 R' S, n9 `
    34.         luVOID i,j,k,m,n,u,v;
    35. \\" I' ^3 X\\" `: S4 c- [4 ?
    36.         double *pa,*pb,*pc;5 s% L9 f\\" J( j: u9 H9 C  u) L7 G
    37.         luMessage pMessage;1 M. `! F6 V# b4 v
    38.         wchar_t wchNum[32];
    39. - w7 T; d/ q, t
    40.         char chNum[32];
    41. : s& |' Q6 [' O$ p0 v
    42.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    43. ! c# N  \* R( M! I+ Z) O4 ^9 ~
    44.         switch(theOperator)- N/ m5 Z5 f: x. y! @; z+ f8 \. @
    45.         {
    46.   I+ f4 [4 V: \' U\\" m
    47.         case 2:        //重载运算符*5 Z( r2 D/ G# I
    48.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);1 m( n2 A: n' v4 r9 s3 Y
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);/ y) f7 z\\" Q. x
    50.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组* E; j\\" `1 W% }* J+ c6 e% e
    51.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    52. ! |6 ]+ A- b! G\\" z) o( t
    53.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配8 `* M/ Z( A2 h. r% j; e- _
    54.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    55. ( z5 Y% m8 w' h* K3 D
    56.                 if(!pRealArray3) break;
    57. ) U+ s9 f) `1 T: m9 ?8 W
    58.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    59. ' |) N+ Q* D0 A# j
    60.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;0 \+ S; M6 L, u  |
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    62. 1 o  A$ t4 n: @4 b, y/ F
    63.                 for(i=0; i<m; i++)        //矩阵乘# B7 j- Z5 u+ `5 q- r/ o5 q+ W3 E
    64.                 {& ]8 k; {6 _1 B) G! d( f
    65.                         for(j=0; j<k; j++)
    66. 9 B2 A( O# u* \$ T/ c% L
    67.                         {2 w' }7 u$ X\\" C: K3 J$ Q7 h8 f( ~
    68.                                 u=i*k+j; pc[u]=0.0;
    69. ; O! B/ ]+ h: b0 J
    70.                                 for (v=0; v<n; v++)& V5 r9 u3 N$ I9 L9 e+ w, b* z# |6 g
    71.                                 {
    72. * k8 J/ Z6 L+ J! z
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];. U5 k+ P+ v4 v
    74.                                 }9 ^5 z. Q( ^. w7 \8 w
    75.                         }
    76. 4 ^: Y# ?) k. G+ O6 x+ h0 h
    77.                 }, o# t  s5 g0 O\\" j+ ^0 P, _# o
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象2 L. `. Y1 U4 u5 i\\" Z
    79.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    80. & Q  z5 f: j5 k, V% I! Y
    81.                 break;) S* F* O# \5 ~1 `# o
    82.         case 25:        //重载运算符.*: @  c6 E0 k0 e! C
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);; Q9 f1 P( Y/ w# ^) ]
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);% O2 G) a; {7 V* |4 C
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    86. ) X$ w6 g& E\\" {, `
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    88. 8 A- A( {  X8 g  B7 \4 S
    89.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    90. $ P; a$ F! }. C# P. e7 y9 G
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象% b4 y% w* Y% b\\" r
    92.                 if(!pRealArray3) break;\\" i  m/ w) a! j
    93.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小7 L9 [2 ~% b( d9 R- {5 }( k+ w
    94.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    95. 5 S, m: I2 b\\" P\\" ^1 ?/ B
    96.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    97.   x. O! B7 z3 G0 k% y' c6 x
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;* _+ v9 P. x5 y+ `/ H8 t
    99.                 break;
    100. ' k\\" Y. B9 [; C3 C
    101.         case 46:        //重载函数new
    102. 6 @; z' j( }4 F
    103.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数. c5 g  |8 C% y! q3 y
    104.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型- |3 z& \6 m' k6 T: z1 x/ {. {) L
    105.                 break;, P' t) `( \- G) B
    106.         case 49:        //重载函数o! D  G- `6 b3 p$ y. l/ [& X+ O
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. 2 l. Z8 s# ^2 K* A  I) |. j! p
    109.                 if(!pMessage) break;
    110. . Z- H1 `5 P& L  v! z) V' ~. ~
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    112. * Q' P% b- L3 X& n2 Q) Y
    113.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组2 G4 b$ `9 l: A
    114.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    115. 3 `) m5 z& ]& \& C8 p
    116.                 pa=pRealArray1->Array;2 k' C2 S- h5 R. p  n2 L
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;* ?% s' S% m, F\\" ^) A' f% o
    118.                 for(i=0; i<m; i++)        //输出矩阵8 U2 I! W# r: w! J2 @
    119.                 {
    120. 3 D0 U0 \- v( l
    121.                         pMessage(L"\r\n"); k+=2;. S- _4 ?9 w1 A, n! v' c! _
    122.                         for(j=0; j<n; j++)7 d3 ?) C& p' z% i' c) L* c
    123.                         {* Q# h! M, U' h; c% u: L
    124.                                 _gcvt_s(chNum,pa[i*n+j],16);
    125. 8 K8 I; |\\" O2 f6 ~% N$ ~9 B6 _
    126.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    127. $ D1 u  [9 |0 r& E3 {
    128.                                 wchNum[u]='\0';5 \; c, H6 _4 l/ Q. I3 x# M/ e% ~7 S$ l- Q
    129.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    130. % h- W/ [7 G7 ~8 p( D
    131.                         }
    132. + x6 p1 n- s; s; W& c6 c
    133.                 }8 I$ u6 n+ h! z2 s$ Y* V: s
    134.                 pMessage(L"\r\n"); k+=2;
    135. % X$ j% G0 Y8 w% W& C2 F
    136.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数1 J2 f% g+ S  t/ A
    137.                 break;9 H& S4 N0 q) [% `
    138.         default:# G6 ^) b% Z1 _5 _$ A) z
    139.                 break;3 k, W* k\\" P1 p8 L2 _/ }) K' O1 m
    140.         }
    141. ) n$ o# N& _4 c% \9 f9 o% i
    142.         return a;
    143. % Z  {; _0 k4 z/ z
    144. }/ }2 T) J8 G) o7 k( v
    145. void main(void)
    146. 2 k. i- k7 M# d  i; C! S3 V0 K
    147. {; ?( c. v+ }! q! e* c6 }
    148.         void *hFor;                //表达式句柄: @  F8 K. c- j( I\\" c\\" @
    149.         luINT nPara;                //存放表达式的自变量个数+ d: D) [! y; [1 S
    150.         LuData *pPara;                //存放输入自变量的数组指针
    151. 1 ]: d( z3 f4 B+ M; P3 F3 b, `
    152.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    153. # g8 F, M. K8 g+ S
    154.         int ErrCode;                //错误代码
    155. * a( q: n4 ^8 d* F
    156.         void *v;! ^/ G) t. p  i. p! M
    157.         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.]}";//字符串表达式,矩阵乘
    158. 2 k+ P, p+ W3 C
    159.         //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.]}";//字符串表达式,矩阵点乘
    160. # }- x/ l' J\\" ]7 M
    161.         LuData Val;
    162. & v! k4 P, R9 X
    163.         if(!InitLu()) return;        //初始化Lu
    164. ; v# C\\" Q& i9 h
    165.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型. I: W8 D7 k; X1 W# \

    166. ) D( D( c, c4 `% M+ M
    167.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量/ i( V% l  |( z3 \
    168.         SetConst(L"matrix",&Val);        //设置整数常量
    169. , V  D6 w% t8 C0 \+ E/ @, c
    170.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    171. ' h0 ^3 I* ?9 n0 I
    172.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    173. 8 l- j8 T; S( a
    174.   
    175. & x: z( F! z. Z7 P: S' K
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    177. ' _( J- @9 G/ D8 i6 u; a/ d' T
    178.         if(ErrCode)
    179. * a3 f0 M4 n! P/ G6 a9 R
    180.         {* A. Y9 x8 b  C6 c\\" r
    181.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    182. ) @- }  v6 Q- R, |5 G2 N
    183.         }
    184. # C% P5 N$ p\\" X2 v
    185.         else\\" ]2 p5 ~6 d1 X* Y1 D  [# w
    186.         {) e3 g. B6 X/ ^2 Q  a5 F) n8 w. B, a
    187.                 LuCal(hFor,pPara);        //计算表达式的值
    188. - K7 T( q1 ]1 l' v( t
    189.         }
    190. 7 @6 q' A, J: n& [- O0 d5 z
    191.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用+ O1 P2 l7 N  m& W8 W, I% V% Y! E
    192.         FreeLu();                        //释放Lu% r5 |' L1 H; q6 x% O# l
    193. }
    习题:5 V5 o) C' }1 \/ q
    " e, {) p' U, y+ u
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 " M1 M( T$ c9 ^3 ^" x

    9 F1 {$ D% V' ]6 {! t: M    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      8 U& l% L/ H+ B) p0 @
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      * ~+ w* l- Z9 i$ D; a
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      4 M\" l6 V& j' w1 e+ j( y
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],+ G# h/ ?7 W- r, `
    5.     t=clock(),! \1 d) z\" `  _\" o
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},+ V\" R% P) A  _* O
    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.7 K9 E9 t9 m0 \4 q
    2. 5. 4.
      - }- a\" O2 L; l9 G; H: \) X4 k' C
    3. time=0.875 seconds.
      5 f' a4 j( B3 {  v& `
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];* t) k& p/ X- T\" j
    2. b=[2.,1.;1.,2.];
      $ q1 O# s1 j: A+ P0 m$ ~
    3. c=[2/3.,-1/3.;-1/3.,2/3.];9 K  ]$ m' i# |3 v, [6 ?) p9 ~
    4. tic,, P) m/ J& S& J- u. S) P; U
    5. d=a*b;+ M* [6 c0 _/ O! K
    6. for i=1:1000000
      3 u$ J& [  J\" |( z  s
    7.     d=d*c*b;7 s% N3 u; O: s+ k9 z
    8. end
      8 M! G* @8 v3 k% L( }5 e7 c$ G
    9. d,
      & v  M& z9 y\" p* A; i+ k
    10. toc
    复制代码
    结果:
    1. d =
      ) x- [9 W. |- E. J9 T- v/ ^
    2.      4     5
      \" G. K2 Z/ J! ~9 h
    3.      5     4
      4 C7 V- F; w8 G/ P- Y& G1 s9 C
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    ; c0 w  {) I  \0 l# Z+ x8 U
    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-4-12 21:43 , Processed in 0.649589 second(s), 52 queries .

    回顶部