QQ登录

只需要一步,快速开始

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

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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。, K! M8 d" R) F  D
    4 v  R! p, e4 |. a' ]3 W: D2 `
        基本要点:3 \* Z# |: N4 @" U
    7 Y7 r- X) K1 `
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。4 G  t; o& T& w) g2 r+ Z( W

    & {% V4 X. [4 @7 v% v5 S    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。4 ?$ ~1 J& t% e& n

    7 k. ^% |' M( ^6 [, c    (3)为扩展类型matrix编写其他操作函数(本例未提供)。5 h$ V' u. ^' F+ _' b- m! y8 Z

    9 n9 X2 \! V+ e& L    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. / @/ [# y% W- z* N1 e0 n0 g
    3. #include <iostream>
    4. 1 }/ e9 g7 l; R2 D/ h3 r8 _6 E
    5. #include <math.h>
    6. : t1 L! c5 H4 f) j, H# O
    7. #include "lu32.h"0 b  k2 v! }  ^4 `; }) }
    8. 9 \. C. d8 ~$ `- x& x
    9. #pragma comment( lib, "lu32.lib" )' R' c6 H% J; i6 Z7 f

    10. % P7 t8 j9 i3 E
    11. using namespace std;
    12. 0 o5 `% H9 o* M- s; \, J4 E
    13. : X4 w2 O3 N- M
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    15. ; R: z- g6 c& f
    16. 0 l+ A1 J, O4 @/ j\\" ]  d& z  M9 F, Q
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 & s  J& M7 B6 n3 v/ ~& f
    18. {* w0 o' ?7 q3 N( o; n) z4 \  N' ]
    19.         wcout<<pch;5 ?. T# U. |, F' ]! {
    20. }  e! C; V+ R, e0 A/ C; J  t
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    22. , O( p% Q* p* |  p4 j# X/ D
    23. {6 E: }* T0 G+ R0 C
    24. }
    25. : H! x( d! U& J% l; r) c
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    27. . M9 O\\" y, g& }3 |9 K5 p\\" d/ H4 M! K
    28. {' u! S4 M! ^# Q( q0 P- T
    29.         LuData a;& m  z8 R  x- m5 \\\" l& Y
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    31. # Y. l1 j+ ~' _. ~  o- h
    32.         luVOID i,j,k,m,n,u,v;
    33. 0 {6 K\\" j; F; M: }\\" y6 _( `1 H
    34.         double *pa,*pb,*pc;
    35. ' I, }1 G5 q- \: _# W' q
    36.         luMessage pMessage;
    37. # H\\" p% a# W, z2 f* ?5 i$ V2 {
    38.         wchar_t wchNum[32];
    39. ' o$ r. ^\\" _, W# J2 |# O
    40.         char chNum[32];
    41. ) v$ B7 p5 S4 C! k: h; k
    42.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    43. & k6 o+ H- a4 m% |( _( U5 ?
    44.         switch(theOperator)
    45. ! j# `/ j+ k- H& h. E
    46.         {1 u5 z5 F( t8 m# |
    47.         case 2:        //重载运算符*5 U& Y' J+ c/ r. x9 v+ N
    48.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);5 Z; b/ q0 {\\" ]3 p\\" c6 |$ l
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    50. 1 L2 {8 w9 V\\" ]7 T; F
    51.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组) }( K( X/ t8 D  e' e/ I
    52.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)/ [  \$ l- y! U5 U2 _$ N/ ^7 m
    53.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    54. . L! |3 r. i% R/ b' b7 E
    55.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    56. . F9 [, i; p8 g
    57.                 if(!pRealArray3) break;7 E  }\\" D) h- Y
    58.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    59. # s0 f! A7 L2 E& Y( P% ?+ r+ {
    60.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;- a* v: o( A2 j  ^4 @/ x\\" f
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];8 t- _5 r9 e: h
    62.                 for(i=0; i<m; i++)        //矩阵乘\\" S; }& l' H1 Z/ i  K* p\\" P0 l
    63.                 {
    64. ; q/ C; c- D. v* c- l7 g2 B/ u) B
    65.                         for(j=0; j<k; j++)& r, |1 o# f4 u7 D# r4 E
    66.                         {
    67. + x9 F/ o% W) f\\" d* O2 A  \
    68.                                 u=i*k+j; pc[u]=0.0;
    69. ; C* N0 n9 ~8 r
    70.                                 for (v=0; v<n; v++): H3 }( H\\" R9 z6 w/ {0 j6 U2 S
    71.                                 {
    72. % M3 z. h\\" j8 c9 x% d! r
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    74.   X+ v, \2 U/ g! ]8 |
    75.                                 }
    76. $ x& i' {# H: @- E; L
    77.                         }
    78. 6 Z5 f; W* e# X3 H\\" P
    79.                 }
    80. ; q5 i- K% W9 |7 p% M
    81.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象7 u) b6 [6 v1 v, |$ P\\" `: D/ ?- E
    82.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    83. 3 `; j5 p( S8 x5 w8 F/ V+ s
    84.                 break;& Q7 v% \: U6 O
    85.         case 25:        //重载运算符.*, f$ Q  g$ V$ @3 t* C9 u
    86.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);6 O. Y) P/ Q1 K( S
    87.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);' d* j1 l, z0 \
    88.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    89. 7 N+ O* M7 P! a0 W
    90.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    91. 6 G4 R- x\\" `3 o8 }  _% M
    92.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    93. $ Z. t\\" g7 V5 Y& U\\" P
    94.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    95. * ^/ O6 m+ g2 f$ f$ K
    96.                 if(!pRealArray3) break;/ |' \3 k3 b0 I$ P8 u
    97.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小: y3 b1 m+ E8 U6 Z
    98.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘3 v3 D. H2 g5 e. z* J0 ^
    99.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象! V0 n. e1 b7 g( [5 W
    100.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;# r3 R3 `& ]: O5 o; w5 q9 y
    101.                 break;4 \1 ^6 T# i3 v0 L! G
    102.         case 46:        //重载函数new; a$ o* x+ R7 ^  @( P
    103.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    104. 9 d4 A, z5 F4 ?2 w
    105.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型) d' M! Z2 y1 F! U( l  ?
    106.                 break;% T* t  U* {+ u\\" Y  b5 E# F# Q: `
    107.         case 49:        //重载函数o0 [! s; ?9 a+ O\\" W
    108.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);+ M2 a9 I; o! A/ f7 O( t
    109.                 if(!pMessage) break;, [( q( T1 Q* O
    110.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);. ^1 R$ o: h6 b& ^: M
    111.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    112. & e4 G  ]. M- x  m( y
    113.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    114. 1 _: \6 i8 N; P# ]
    115.                 pa=pRealArray1->Array;
    116. \\" u! N' m* h; P$ `
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    118. 7 g% I2 o+ X( N3 @$ [) s5 D
    119.                 for(i=0; i<m; i++)        //输出矩阵
    120. 0 H7 S) [3 y2 c$ u7 r% u
    121.                 {\\" j# h8 u( I! o- ~4 b$ ]
    122.                         pMessage(L"\r\n"); k+=2;& Y# W! o( w1 Y1 h# B8 O4 z
    123.                         for(j=0; j<n; j++)2 V/ ^* a8 b; c/ p! s; z% @! L
    124.                         {
    125. 0 s( i: x+ _6 K, d8 \
    126.                                 _gcvt_s(chNum,pa[i*n+j],16);& R6 e3 t2 _  u# r
    127.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    128.   ]& W* e0 }- m3 l$ V) }
    129.                                 wchNum[u]='\0';
    130. * Q  y/ A8 i1 ~& e
    131.                                 pMessage(wchNum); pMessage(L"  "); k+=2;$ o& t$ C' m+ U' c! m# _( S
    132.                         }& D  ~; t, i0 a4 O. P0 |& G0 o( W/ W
    133.                 }3 m' a& U6 d& V( `6 ~8 M
    134.                 pMessage(L"\r\n"); k+=2;% @$ _- M+ `; e
    135.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数; W7 n\\" o$ Q+ R1 m3 p
    136.                 break;& v3 O4 [' y$ w* b1 H# W
    137.         default:
    138. 9 G. }( v\\" S! B. n
    139.                 break;( [; q/ |! m( t$ h% N
    140.         }
    141. 2 X3 y; E+ R0 F) y
    142.         return a;
    143. & F0 v0 ^  F5 g9 e# t
    144. }
    145. # @\\" x+ L! R) x% K) c  ^
    146. void main(void)) U. G9 M8 s9 B# J) n4 f* G! u
    147. {
    148. , ~! i' q9 Z' t\\" J
    149.         void *hFor;                //表达式句柄
    150. 5 g  @' N9 |7 e# N  u1 r. B* {
    151.         luINT nPara;                //存放表达式的自变量个数
    152. ( A! {+ @. R4 {4 b. Q9 g7 L4 D
    153.         LuData *pPara;                //存放输入自变量的数组指针* b1 l! ~% j- r
    154.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置0 d3 C6 e) w. @6 n  v. v
    155.         int ErrCode;                //错误代码, s7 u( H2 f1 u6 p( g) G, E7 Y* K
    156.         void *v;
    157. * s4 J- C; a$ D. h( u2 y
    158.         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.]}";//字符串表达式,矩阵乘
    159. * Z\\" ~7 |6 A3 w5 S; t
    160.         //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.]}";//字符串表达式,矩阵点乘
    161. % z' R\\" ^% z) O# x# l) o
    162.         LuData Val;
    163. / z, _: m' P% N6 f; Q
    164.         if(!InitLu()) return;        //初始化Lu
    165. 7 T. f- D) v7 N, e6 X- Y
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    167. 8 a# }( \7 ^6 X/ [5 g' q

    168. 9 x7 K1 t, Y& ^7 y) J& |0 W2 m& l
    169.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量; O& {' o3 b% u* k% |- N\\" \6 {+ X
    170.         SetConst(L"matrix",&Val);        //设置整数常量& D' o/ M1 R* x( Y$ Y
    171.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    172. 4 E$ }  C# Y1 C1 m$ ~  C5 H1 D
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文0 m9 R: ?! e  v& g  a. s) d6 w
    174.   
    175. , I2 o; |& o+ A+ J# o
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式9 h3 l: ^$ x\\" N
    177.         if(ErrCode)# L, ]0 X4 F( p) j. D! N* t8 \
    178.         {% P& J/ g\\" @8 l! t7 x
    179.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    180. : k6 [- g5 R, f5 q, \' x/ Z+ S
    181.         }
    182. 8 h# `% u) O7 t8 t\\" c9 d
    183.         else! `% v' j& J& N( j# m
    184.         {/ ]4 u7 ~7 z/ r9 k- {
    185.                 LuCal(hFor,pPara);        //计算表达式的值
    186. 6 a1 \8 x5 r0 q* G0 I! c2 ~
    187.         }5 y- N# m- W. @  X% g3 L6 S
    188.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    189. ; r4 S) o, ]9 I
    190.         FreeLu();                        //释放Lu- k7 g  h0 b. w) `) a! M/ u& d* o
    191. }
    习题:0 f: c# Q% V6 A" j' ]

    & h/ z9 z7 t; M    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 5 d/ u, Y; z, g) b# w) c+ A
    6 U% F0 ?1 O: C0 o
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      ) j; m8 p; i- I4 M
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],3 N! Y# K\" E' [6 o1 q! Z
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      - K* k2 l\" {. j2 K5 n
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      # |4 B5 b2 N/ U! {3 h8 |
    5.     t=clock(),
      , Z+ f  U( ~) v6 o\" ?5 l
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},. y* Z* `7 H, a& x; U
    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.
      6 ]$ L: T* ?2 p8 T6 @6 M0 K
    2. 5. 4.$ `8 J( Z, G/ d
    3. time=0.875 seconds.
      0 T0 p0 t9 O- a2 L
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      : x2 v1 _6 X- u# J
    2. b=[2.,1.;1.,2.];
      2 O4 }' U# A  X
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      + S7 `+ B7 k& D
    4. tic,. R( s+ I8 m6 J0 Z/ _7 c) ]
    5. d=a*b;/ r2 Z3 K4 C4 y; [* E3 B6 e6 q; Q
    6. for i=1:10000002 H: T, M* D) u/ |# u
    7.     d=d*c*b;
      9 ~/ I, w- N8 m+ V! v
    8. end
      / Y1 }  G* A; b/ ]1 m
    9. d,
      9 E, J' p3 d/ B' s( t' _7 {
    10. toc
    复制代码
    结果:
    1. d =$ ?# I/ h6 `6 }# a( n% O
    2.      4     5- D5 ~3 A) w6 \
    3.      5     4
      ( G. d% k, j8 V& i' z; r! T9 H
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    & x9 X) d' l% y! `
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    2#
    无效楼层,该帖已经被删除
    3#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-19 21:25 , Processed in 0.566878 second(s), 62 queries .

    回顶部