QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 7580|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。. m* I: U" B/ I, a" ]2 u3 ^
    ( |. e% u8 b; E& W
        基本要点:5 A/ f* R/ r5 H% R& a1 h
    ' w, s4 S2 l( g6 ^/ Y9 I
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。* q2 a1 H1 V8 ~. R5 e! x6 t

    3 T) p1 E/ g0 _    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    " K2 M/ P& Q1 ^
    ; c1 T+ B# d9 r3 e( S' g% k- |% i, f4 S    (3)为扩展类型matrix编写其他操作函数(本例未提供)。' b1 d0 ~' }* g9 T3 E( Z
    1 E+ a, i8 \6 X2 H4 Y2 k
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>8 C$ T; V) J0 m9 }
    2. #include <iostream>
    3. 0 r) \, }4 h8 w
    4. #include <math.h>
    5. + w6 |5 B& i+ Y; _' Y- _6 ?
    6. #include "lu32.h"; {2 I5 U$ P7 z# w& O. s! I3 k

    7. ( k5 p& c$ X0 H1 M8 U6 E, o
    8. #pragma comment( lib, "lu32.lib" )( @2 J& j' a) S) D3 |% k0 B

    9. # Y! S6 z9 P\\" h
    10. using namespace std;
    11. ) B( O: d: m: n4 L7 u! o. S

    12. 1 T4 A- }. E( V8 a
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定1 M$ p6 g$ s3 m: [, \- Z

    14. 4 u' ^2 O# r) G: S1 \# z
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. / h* e- t3 l- S+ S$ U( V
    17. {
    18. 5 t9 `; b8 I4 _0 n2 x  u' D$ Q' }
    19.         wcout<<pch;
    20. : s1 X: Z7 d- R( s) w3 Z7 E1 w3 c
    21. }5 Q. F2 p5 H9 y5 h
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做8 ]# ^0 L$ s+ I2 O\\" Y
    23. {
    24. \\" A( b1 Y; w' a, t- e
    25. }) P( d( M& q8 a: h
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    27. 7 C* P& H6 [% s  d  e
    28. {
    29. & W. L\\" G! N- c6 ]& D1 z
    30.         LuData a;
    31. ; v$ v) a7 F$ {\\" I% `\\" |0 m* m
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;  Q) P$ N1 \, I& H\\" l
    33.         luVOID i,j,k,m,n,u,v;
    34. ) C9 h% u6 p3 B& N6 v% ?( U
    35.         double *pa,*pb,*pc;
    36. + d4 F' I' I4 }4 J. K# E. U
    37.         luMessage pMessage;
    38. 0 C6 F' n* e+ v\\" ^* `7 q1 Y$ @
    39.         wchar_t wchNum[32];# q* u( m' v- ?& G9 S0 x- x
    40.         char chNum[32];9 K2 P4 p, J3 S& z& M
    41.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;' F  T, R% O1 f. H! T
    42.         switch(theOperator): X! X+ E, D- b+ b' q* x* O9 u1 H
    43.         {4 f& X& n4 \: l; f; y
    44.         case 2:        //重载运算符*
    45.   `' |, H' ^# Y4 d
    46.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);3 d# p  a# r. y
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);) B9 n, L5 I! i- q
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. / _2 G! `! M% Q
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. 8 l2 u: l7 B5 x0 j9 N
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配; A2 U$ s\\" `1 a$ I7 @
    53.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    54. & n1 A$ ^7 Y3 ^\\" s# |* P6 e
    55.                 if(!pRealArray3) break;
    56. 9 r& U* z- ^4 G8 g7 C0 B
    57.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    58. ) l! d\\" P6 B1 ]& G
    59.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    60. + [, V. y! [% J3 k5 n& R& F& u
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];3 o$ p# O& M6 C. L1 o8 e/ t- k
    62.                 for(i=0; i<m; i++)        //矩阵乘2 s, _* f$ R2 g. I% e3 Z
    63.                 {6 b\\" v: x9 K( b& `6 R
    64.                         for(j=0; j<k; j++)
    65. ( d! r; @, M8 G- u1 [
    66.                         {
    67. ' [/ I3 [- L9 P$ L6 ]9 a
    68.                                 u=i*k+j; pc[u]=0.0;6 c9 l9 t/ W/ T\\" X& r/ ~4 ]# {
    69.                                 for (v=0; v<n; v++)
    70. \\" U3 o  @( N( |! g
    71.                                 {
    72. ! ^) y9 [5 m, Z1 d  N) S
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    74. 2 V9 H5 u  N  n
    75.                                 }
    76. 0 O( I. c- P# ~- S
    77.                         }9 _6 O8 _8 K5 a5 q
    78.                 }  d% J5 R$ i% ]1 O& b5 G8 r
    79.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    80. + }4 D& ~) x8 X4 f. ^, @
    81.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    82. ' T4 g' V) Q5 L: {# V, M9 S
    83.                 break;
    84. ' A5 ]9 [9 a: Z5 a$ I- I
    85.         case 25:        //重载运算符.*
    86. 1 E4 o; @6 Q- {& z
    87.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);) c7 z\\" y# R\\" B1 [( X9 ?' V; o
    88.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    89.   v2 d; J9 q! [7 v: t
    90.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    91. 9 @8 ?( u9 ?) G4 u  P; g
    92.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)% z$ w% r5 m) a2 D: I
    93.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    94. 0 l; v& L, U$ \2 |$ t
    95.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    96. 2 b. i1 @# _* S3 o
    97.                 if(!pRealArray3) break;8 Z8 D- y' O+ [! f4 A- m
    98.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小9 ^7 J; V+ n$ _3 c
    99.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    100. % F7 o  n& B% {
    101.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    102. 7 Z7 E3 i! n7 s! O. ~. V; M
    103.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;7 k/ V# q8 S, c+ z% v7 V
    104.                 break;
    105. 9 s3 Y+ I8 S5 _* V4 ]& H* U
    106.         case 46:        //重载函数new* K% r1 Q+ f5 _, x6 |$ q
    107.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数: x  g) {! T  B: e
    108.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型; s1 G8 k/ t+ X8 u3 c
    109.                 break;
    110. ; H% \: N9 o) N* E- u' B8 x2 u% N) H
    111.         case 49:        //重载函数o
    112. ; a2 g: }6 N2 w# x- ]
    113.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);) t3 _6 y7 J  g: t, C& x
    114.                 if(!pMessage) break;
    115. 8 v\\" k* f3 ]6 U/ a5 J
    116.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 B1 I- J- u) e  d1 e' o! S' W
    117.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组8 b- b\\" [: h/ h/ h/ I* d) N7 A# }  i
    118.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    119. $ L: Z$ Q2 W: D  X: \9 z
    120.                 pa=pRealArray1->Array;6 p% D# J1 k( N
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;' j' f7 q9 i# z, L  a, \
    122.                 for(i=0; i<m; i++)        //输出矩阵
    123. 4 Y3 F+ j! d. l; ]. N( y
    124.                 {
    125. 7 h+ a6 ]6 o: Q, L
    126.                         pMessage(L"\r\n"); k+=2;
    127. 5 y( `% C. ^0 ]8 n
    128.                         for(j=0; j<n; j++): w0 U3 i; {  t3 [7 g
    129.                         {
    130. ! Q0 [& h: b9 ~% r# g6 U( [
    131.                                 _gcvt_s(chNum,pa[i*n+j],16);  z, i  g# N( {% y7 L( t7 @
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}, Q/ o/ \, o\\" Q\\" Y
    133.                                 wchNum[u]='\0';  x2 u& u\\" |9 ~& k+ I0 F\\" n0 m* V
    134.                                 pMessage(wchNum); pMessage(L"  "); k+=2;- a$ O3 v' D* S
    135.                         }
    136. 2 e1 M/ L\\" E, \/ u) D5 E
    137.                 }
    138. % l6 C% E# n\\" o5 c  K8 H& t. [
    139.                 pMessage(L"\r\n"); k+=2;0 I) v0 J6 X2 Z! B& @4 _6 T
    140.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数$ n0 l5 V+ l6 m# U
    141.                 break;\\" w- M5 U' f2 R\\" u+ e  e
    142.         default:
    143. & b- ]3 }% d% ~
    144.                 break;, c# U6 E+ D5 r. E- W! j
    145.         }  J0 t; H. S4 q2 F9 l- z
    146.         return a;
    147. ' i5 [' I' I9 i
    148. }
    149. , K3 I, u/ N9 i8 m) v9 d; R\\" h
    150. void main(void)
    151. . r; B; H: G4 \$ |/ |( d
    152. {* t7 s' K. B  R  J8 N, T, M9 ]
    153.         void *hFor;                //表达式句柄: }6 N3 W! ]7 v( }
    154.         luINT nPara;                //存放表达式的自变量个数0 W7 z% X. P  v7 v4 l. H( o5 F
    155.         LuData *pPara;                //存放输入自变量的数组指针
    156. + b7 q0 J\\" O+ R9 {: d/ f
    157.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置; K- d' Z. J. I3 y2 C: z$ C8 {
    158.         int ErrCode;                //错误代码+ F1 e! j$ k' c7 S4 P
    159.         void *v;
    160. # Z; }\\" i1 i& l, |7 [9 w% @  z
    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. 8 k( G9 N2 T8 P\\" N/ A1 a. f
    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.]}";//字符串表达式,矩阵点乘$ e8 a  A: B8 Y& h8 u1 u- q
    164.         LuData Val;\\" D, @$ m; k) F# X1 n3 n# w
    165.         if(!InitLu()) return;        //初始化Lu\\" e' n& z9 {* a3 x# i
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    167. 3 ~+ T1 C6 U0 Z7 t$ s+ @
    168. \\" d( a9 }% v4 b, P
    169.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量! D. G# q9 I  n, L, T
    170.         SetConst(L"matrix",&Val);        //设置整数常量; t( `6 Q. O/ g
    171.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息( l2 O+ @' k7 u- `+ H: b) l
    172.         wcout.imbue(locale("chs"));        //设置输出的locale为中文! s3 J# s( m* n5 u8 b7 j
    173.   
    174. 4 _+ W1 Q3 f+ V4 K. A
    175.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式$ b; M5 l- y9 y  T. _
    176.         if(ErrCode)- h5 P9 }' r; F
    177.         {) Y4 ?: X- V' y1 u  w- P
    178.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;, @  R2 X. A4 C' T
    179.         }
    180. 8 u8 \! d2 Z: H\\" V, ~+ M
    181.         else+ n+ D% z3 L8 ]. o( y( s) i
    182.         {\\" p\\" r- Q; r5 v
    183.                 LuCal(hFor,pPara);        //计算表达式的值
    184.   p! `' c3 B% ~, R$ v\\" a
    185.         }9 X- I2 v. g* I) _; h- }
    186.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用8 Z* W+ m1 c  P7 h
    187.         FreeLu();                        //释放Lu
    188. + y( P6 o4 O9 Z. L& L% Y' ~
    189. }
    习题:
    2 k8 ~3 T/ f/ O1 z. }
    + U- c- H  [, V& J0 ]9 ^) a& i    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    " R- n% W% C% |' M! }3 T% B6 r3 p- F5 ]) P1 E, X# e
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      . |4 |- l1 i7 L7 Y* }9 H
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],* b, l* |3 D+ V+ k+ a1 u
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],) X\" {) o! M  N$ X0 m
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],6 Q4 y- d9 r( O
    5.     t=clock(),
      3 }. m& O; D4 J0 ~$ ^\" Y1 ?: w
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      3 f0 e6 l$ E5 i$ Z\" \# K
    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.
      ( g  U2 b& m9 B8 T
    2. 5. 4.& ]( |, ]6 n( ?/ A6 w$ G0 f7 l# o
    3. time=0.875 seconds.  u- |0 L1 {\" R\" w' v* ^
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];; ?, s0 w: L# w
    2. b=[2.,1.;1.,2.];0 {* s  V4 e2 e4 u# A
    3. c=[2/3.,-1/3.;-1/3.,2/3.];# D7 Q9 }) g3 a- G+ z; L7 `# ^
    4. tic,3 |+ }0 i1 Y+ r, U
    5. d=a*b;
        p+ V' R; I! B% O3 @& x
    6. for i=1:1000000! e( p# {7 {: V\" l/ J7 l% \
    7.     d=d*c*b;& M: ~; ]; l0 L5 V, {- _3 R
    8. end
      $ V) u- G% V) l( @3 l4 r. u
    9. d,) n2 J' b: I/ d! r\" P
    10. toc
    复制代码
    结果:
    1. d =% \( t  j1 E: E3 w1 A: S* ~& o  U
    2.      4     50 |5 Z# D/ h0 w9 l
    3.      5     4
      # B! }\" P' @/ w9 v% P
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    0 q& W5 Y& H$ x" j! y5 i
    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, 2024-5-1 22:06 , Processed in 0.372429 second(s), 62 queries .

    回顶部