QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8898|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。' v3 U' J$ P+ C' P* A) Q8 b: t5 t
    # b! y- f) ?, @
        基本要点:
    % b; I# z5 o4 n# s7 r: m+ e& A1 `8 V/ u) P8 B7 a% y3 u
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。, O- f2 B* X- y8 @( i& g

    ; M7 l/ t; f& Y0 G" V# S# q    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。% m. i9 o& v! h2 @
    # }4 _. s/ s0 D
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    ( N9 w/ J" r* z2 W! g; ~5 }
    . z* g0 l4 q7 I    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>! _3 f4 F6 i8 N4 e5 J8 D
    2. #include <iostream>& ^6 s\\" K* q! f$ Y. l8 s! Y. d
    3. #include <math.h>: D% ~  p+ I( i% J' E0 |
    4. #include "lu32.h"+ b\\" M% p9 I\\" ?* M5 ]4 K0 \
    5. 2 b+ r  S+ k9 [) j
    6. #pragma comment( lib, "lu32.lib" )- t7 i0 J8 U6 y2 w( m
    7. 3 k/ o4 M+ T  ~! M7 L, c- r0 m
    8. using namespace std;% U$ g) Z! k/ o& ]# m) v5 `: V

    9. 3 A  b5 W% N/ ^- b8 {$ e) W! d) z
    10. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定. ^* ~- r4 b& k

    11. , ?3 `/ c$ Z3 w0 ~
    12. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 0 O) q% k* L$ ~2 \
    13. {
    14. : L) x' E) f1 U
    15.         wcout<<pch;$ h+ |1 t$ L9 N9 x8 ^2 x
    16. }: H5 g1 w! [1 s& U' c) |2 o+ b
    17. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    18. \\" J\\" F6 n$ x6 \2 a6 j
    19. {
    20. , D) ?1 c' a0 O: k; ]4 L# e0 i
    21. }
    22. # G- K. S* c- F- L' f\\" K% d
    23. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数! _8 y) N, W2 ?) X* ?* A  q
    24. {
    25. ! w! r6 V\\" ~) O9 _+ |; c2 [
    26.         LuData a;
    27. 6 o# a) v% w) v, P- `' u- ^  p
    28.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;\\" a* Z; r5 x9 W# I6 d' ]2 o7 u
    29.         luVOID i,j,k,m,n,u,v;- v; Y7 c- x. T) N
    30.         double *pa,*pb,*pc;+ e  f2 {$ ^+ x6 M( J8 [
    31.         luMessage pMessage;* g) D$ c+ t& T# H
    32.         wchar_t wchNum[32];
    33. : W$ Q( B$ [7 x% @6 N
    34.         char chNum[32];
    35. 7 P9 r, y, Z' ^\\" Q+ s- y; a
    36.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;, [3 g% _( f& _1 M1 G; E
    37.         switch(theOperator)
    38. $ G' _/ Q/ |- ~* l1 r' M
    39.         {
    40. ( a% j0 P. H+ H, a6 @+ v
    41.         case 2:        //重载运算符*
    42. 4 [. f4 l5 C- [3 K
    43.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);1 {# z0 C& S% `
    44.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);\\" R; w7 W6 F+ N0 g. N
    45.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    46. / K6 ^\\" s7 F* Y( b* c8 g) T
    47.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    48. 6 w  j' h, S0 e3 u3 z
    49.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    50. & P7 ~+ T1 ~9 x% ]) c+ E( S
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象+ u6 c. j9 |7 s\\" k' ~0 _9 q
    52.                 if(!pRealArray3) break;
    53. : J+ g9 W7 z$ H1 L8 K. U2 S+ e, U, D
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    55. . W0 ^$ x7 P) o: K
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;/ N1 F  @6 ^7 V
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    58. \\" `( Z1 ^) q0 c5 \- t
    59.                 for(i=0; i<m; i++)        //矩阵乘( u0 n5 N  R; L7 k( q3 P
    60.                 {
    61. - Z$ Z4 p! U2 W' S$ j
    62.                         for(j=0; j<k; j++)
    63. \\" [, b  {. O/ Y& u
    64.                         {, _  X/ z( f+ a1 A
    65.                                 u=i*k+j; pc[u]=0.0;
    66. 3 d' ?9 T1 G. g) N5 T! Q+ f7 P
    67.                                 for (v=0; v<n; v++)4 ?2 O0 k* C5 k, {- s. ~
    68.                                 {- F; T$ d2 C% [2 O/ v2 @2 E& p+ C
    69.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    70. , D  b% R0 o; ]: D6 \/ J
    71.                                 }1 O% r! j+ ~  S! u6 [: I
    72.                         }7 |( ~$ I0 r) T
    73.                 }
    74. & I7 B) A+ k, O* d
    75.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    76. 5 ^& f7 w6 {6 S/ p$ P
    77.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;  x; K- J( h5 G8 g$ W7 x
    78.                 break;. V) j6 W3 V4 d8 D1 g
    79.         case 25:        //重载运算符.*
    80. / ]4 ^$ [' O' N
    81.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    82. ( J8 l- O6 A\\" {8 n; ^9 y, r# a$ f1 S
    83.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    84. 8 a( p3 e0 [2 t( ^( K
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组1 _# H& W$ ~/ N0 c6 J
    86.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)4 h: Z1 C+ s, ~9 P5 \8 K* T
    87.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    88. ) |5 A* R) g' r
    89.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    90. & y5 Q6 d4 W. F8 J1 _4 _9 G& R5 k
    91.                 if(!pRealArray3) break;
    92. ! F+ U( P+ ]8 `. P* t# L% R6 A- `; w/ `
    93.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    94. 4 K6 A& L5 h- ]2 Z+ z
    95.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    96. $ Z\\" r; B* N5 ?5 O9 U
    97.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象. q\\" L1 X5 t5 `3 g6 L
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    99. - s$ F& K+ N/ T# `5 E. p1 H% o; C3 w* h
    100.                 break;
    101. % Y( d5 c0 r3 G) _: c' I1 X\\" ?9 J
    102.         case 46:        //重载函数new+ \% C2 l& k7 r. Q
    103.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    104. . b' }! X: D* c- L9 |6 B' m
    105.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    106. & C! _% T4 i! S4 }6 v: h
    107.                 break;9 e  ~) Y7 C( m4 n! e1 G
    108.         case 49:        //重载函数o4 |' l, u% V! i5 h
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    110. 2 A8 U6 D- h- G! v# f/ U, o1 L
    111.                 if(!pMessage) break;/ P8 y8 w: J: c. G! l
    112.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    113. ' i$ [  }) G# |7 H! _+ S6 U
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    115. . d5 o) Q/ L% i8 B$ g* Q( F  h1 N
    116.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    117. % {\\" m9 w4 T6 G- Q0 C. h\\" d. |
    118.                 pa=pRealArray1->Array;
    119. 5 o1 X5 K# P. U4 v$ e- z+ b\\" U\\" m
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    121. \\" I7 F8 e' ?% \' q) b$ B
    122.                 for(i=0; i<m; i++)        //输出矩阵
    123. \\" w/ |- o0 K\\" m( N\\" G: _6 e
    124.                 {\\" b+ o; U1 s- {( ~7 U4 L
    125.                         pMessage(L"\r\n"); k+=2;, F1 i  i2 T$ E4 g; z
    126.                         for(j=0; j<n; j++)1 }% M  T* O1 T7 g
    127.                         {
    128. * t: ]% r3 p& G6 s  l. [- b
    129.                                 _gcvt_s(chNum,pa[i*n+j],16);
    130. 2 Q2 d* l+ T. H1 j5 w0 M' g9 D
    131.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    132. 8 B$ E) o7 ]( b
    133.                                 wchNum[u]='\0';
    134. 3 S8 }0 V* S, X2 [: Q
    135.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    136. % T+ E2 ?9 x3 g+ d5 F/ E
    137.                         }) `7 u; t+ S9 K/ y
    138.                 }
    139. 7 n8 S  X4 g( G
    140.                 pMessage(L"\r\n"); k+=2;# |\\" e) @2 z( Q8 u$ L; ?
    141.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    142. ) s! l; g( y1 w$ F
    143.                 break;
    144. \\" [5 c1 ~1 ^0 Y* J/ ~. |\\" {6 S7 k* F
    145.         default:3 _; J9 E4 X% G0 l) @
    146.                 break;) M; J9 y+ ~: t
    147.         }1 C  C! k1 J3 I8 e- W/ |
    148.         return a;
    149. 2 C( s$ t4 |. r1 X\\" q2 p3 Q
    150. }3 h- [\\" v1 ?4 y1 c\\" o
    151. void main(void)
    152. $ V' S* f+ Z! p+ j4 q6 E
    153. {
    154. 3 u8 r( h6 R6 ]- @) F3 q/ e
    155.         void *hFor;                //表达式句柄: r# C  @. }0 v0 z# C
    156.         luINT nPara;                //存放表达式的自变量个数
    157. $ ^. E0 a. X  h) U( @
    158.         LuData *pPara;                //存放输入自变量的数组指针% F; q4 }/ {! _& ]+ Q! A
    159.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置4 \- U1 {. K6 W+ m8 b- A6 O7 I
    160.         int ErrCode;                //错误代码
    161. , C. c* R  b5 Z7 R4 I
    162.         void *v;  Q) Z6 |2 V3 V- u, G! |: R
    163.         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.]}";//字符串表达式,矩阵乘
    164. ; u  ^) c$ q8 W8 F( a; u2 |% M
    165.         //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.]}";//字符串表达式,矩阵点乘
    166. $ Q3 |- L' G5 Z
    167.         LuData Val;
    168. + x4 Q0 x3 n# R' r
    169.         if(!InitLu()) return;        //初始化Lu
    170. ( k4 X- }6 i5 p7 Q9 p( A3 G# ^2 P
    171.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型! A0 ^; n0 y& `' A( T; r4 E' i+ ]) n

    172. / L5 E+ O4 X, x6 {\\" n; O8 G
    173.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量2 Q! j) m- R( u4 I  r
    174.         SetConst(L"matrix",&Val);        //设置整数常量( e1 G+ x# N. Y) ]
    175.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息5 g: z( N$ K0 x) G9 X
    176.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    177. - b5 T! s- c7 S5 m  ~. Z
    178.   
    179. & e: [: ~. y9 e( G* d# z/ e4 ~
    180.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式6 r$ ~9 O\\" ?5 g5 _0 p# e
    181.         if(ErrCode)
    182. ! o; i/ ]- v2 J# H6 t
    183.         {
    184. # ^+ n' i1 b1 i\\" C
    185.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;& @8 z. E- c* t1 @% i
    186.         }& G8 i& X7 y% C! v( `/ y
    187.         else
    188. / e2 s8 y0 d6 O
    189.         {8 U3 N( w2 ~5 q8 ^) U# q6 z! M
    190.                 LuCal(hFor,pPara);        //计算表达式的值
    191. . |* ?5 h4 i+ v
    192.         }) @8 X! n& T; [+ l
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用\\" T% H3 w/ D5 Q! r# ~1 \, m\\" X
    194.         FreeLu();                        //释放Lu# I  u% D. w8 c\\" r
    195. }
    习题:
    4 ?. M: x& C; W; J6 j& e7 J
    1 K9 A9 U: x5 B4 ~+ i    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 4 W; J( X. R2 G* A0 p8 ]
    + ~0 T4 `9 b$ T  }: g9 }) |
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=7 f\" e  _. {+ ~4 z! f
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],' x1 E/ b+ ]2 L, x: W6 @
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      1 H, O- [  \! a- u1 l& X) T
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      : i# k  S! U3 q6 B, C
    5.     t=clock(),) e& q7 b* j. [* p* e  n( n
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
        X# B; e0 H+ ]5 V
    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.
      & }: ~; b0 A\" _3 M( c* P& A* p
    2. 5. 4.$ U+ k) R0 f$ p/ q: }, \5 O0 }
    3. time=0.875 seconds.
        X8 N8 b/ j2 Z. \
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];0 a6 |% E7 H$ \# L& e
    2. b=[2.,1.;1.,2.];& `9 q2 \\" q! e: |6 Y% `
    3. c=[2/3.,-1/3.;-1/3.,2/3.];& ]/ {' r* r$ w+ N3 S( i$ S
    4. tic,
        P2 D$ A: V6 m$ M. J
    5. d=a*b;
      % k  w$ @8 b/ V1 X- ^( s  k. N  Q% i) v
    6. for i=1:1000000
      , @3 t; m2 X- M( z
    7.     d=d*c*b;
      9 h( O. O- B; a
    8. end
      ! D6 i5 ?2 E! M8 c& n$ y- @2 s# \
    9. d,- f4 q' `8 H\" }\" a( w( n! \5 y  `
    10. toc
    复制代码
    结果:
    1. d =! C\" ^\" Y5 P4 r
    2.      4     5
      3 Q) d8 p, Q6 X, ?4 n
    3.      5     4
      & E0 P1 C: j, a9 U
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    $ S7 H" w- ?, A7 R. ]1 \) ?
    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-8-31 22:04 , Processed in 1.857372 second(s), 53 queries .

    回顶部