QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8896|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。6 A* r! ^* i- e* g2 E3 b5 S
    ) J! U3 n7 O: q4 Y3 g0 x* E
        基本要点:
    3 m4 x( O, s. }6 X% ]  D
    ) V; T- Q2 z* N9 n. r/ G* a) @    (1)为扩展类型matrix编写运算符重载函数OpMatrix。! g: M  H* f! ?/ X

    , `4 w. O$ o' X+ l    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    2 N! K+ O  P) Y0 S# [6 u% L# z% O* ?* K
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。; m$ `9 j) U9 e( q( O
      J/ c/ N9 d# Q  X1 K2 [0 K
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>7 _  f\\" H; N9 j# B1 _, z
    2. #include <iostream>
    3. 0 r$ Z- b# G; }
    4. #include <math.h>
    5. ' {- l6 D2 |3 W
    6. #include "lu32.h"0 y# p5 K\\" ]2 s6 F3 p

    7. , F: Z4 J; }: g: C
    8. #pragma comment( lib, "lu32.lib" )* f7 t& U( h: n7 W  k: z. I

    9. 6 G1 D# J3 [. |
    10. using namespace std;. @1 a  h' `# w  W; p+ O! }

    11. . U9 |% A  y+ |2 V
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定# V/ ^6 h\\" b6 t% E' }

    13. 4 z( L1 z5 D7 Z5 M- T% f
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 8 ?5 i5 ^# ~2 ~0 j\\" o
    15. {
    16. 8 r% `7 R. K: c# [2 G- Z\\" O+ u
    17.         wcout<<pch;! x+ O% f* T3 L# p\\" v8 r. a
    18. }* ?+ F/ w: V. Q
    19. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做& @& V3 ]! s. v. G3 i% |; o- s
    20. {6 I6 C5 T7 }( g# k/ L! c
    21. }
    22. \\" d' h% |; @, S\\" i5 F. w0 I
    23. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    24. ( b; [, r* G6 |1 s' w
    25. {
    26. % v8 Q+ `7 Q1 N& Y8 a/ k
    27.         LuData a;
    28. 3 D5 Y! ]; j7 r% `; w\\" c5 n
    29.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;/ g) l& w5 M, p
    30.         luVOID i,j,k,m,n,u,v;
    31.   J/ X8 j8 U  N# f
    32.         double *pa,*pb,*pc;
    33. 6 Y, _9 {5 x' z2 C
    34.         luMessage pMessage;2 S) [) s+ |& @$ a
    35.         wchar_t wchNum[32];
    36. 1 D7 x4 P0 x: s& V( [
    37.         char chNum[32];
    38. \\" Y, ~. q5 ?8 L/ `
    39.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;/ G3 R; [7 _' ^+ T
    40.         switch(theOperator)% e7 q4 E1 a3 T/ s
    41.         {
    42. : y8 ], |* d9 B* z  r6 d
    43.         case 2:        //重载运算符*
    44. , B& s' ?$ ^  m7 w, x8 g
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* _6 f\\" F; P( o+ Q
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);; E! e\\" a2 C: E+ t
    47.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    48. $ C- f8 W$ O- Z+ U+ {3 z
    49.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)9 N6 O. B; S! D- e
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配3 c; |& O8 ^: _8 R. J2 {1 q
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    52. - k% F( y  }) ?& Q
    53.                 if(!pRealArray3) break;
    54. 1 t5 h  d5 g1 i
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小! P& O% I1 m; E- d5 F2 w& F
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;1 K2 R: @6 ~# i1 k0 K( Z
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];0 g' u9 I0 _7 C# R8 p
    58.                 for(i=0; i<m; i++)        //矩阵乘
    59. 7 g( u- c1 k! J& y( Q
    60.                 {9 E/ I' F\\" }# A7 V  Y
    61.                         for(j=0; j<k; j++)
    62. 7 G9 P; K- ?* c! ]' k
    63.                         {
    64. - ^5 r. p\\" d9 ~6 p
    65.                                 u=i*k+j; pc[u]=0.0;# w& a* H+ [' e$ ^8 n! `. Y
    66.                                 for (v=0; v<n; v++)6 e7 U: o9 z% {: H: y
    67.                                 {- e* i+ D. m7 M
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];. t! L; e\\" w  G
    69.                                 }* d6 M  d3 d* f7 ^' V4 a
    70.                         }6 }1 `7 E) j0 `' g
    71.                 }8 v% E8 I) H. C8 x0 h  h3 R
    72.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    73. 2 ], K# L7 F) R\\" T) E5 N- [6 q9 Y
    74.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    75. . j9 A$ a8 E2 F$ ]# D
    76.                 break;
    77. # Y2 B$ y3 s9 @- P
    78.         case 25:        //重载运算符.*
    79. ; K# E3 M- a0 f& o; w
    80.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 h, t: X/ I\\" V# W/ U
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);4 O; o! I) F* c\\" W# I
    82.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组& M6 j  q, X6 n
    83.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    84. 2 D. d* ^- r6 w. b6 G9 G
    85.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    86. ! `& {/ N. D. n
    87.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    88. \\" U5 d8 o. ]2 g5 O2 J. q; g
    89.                 if(!pRealArray3) break;
    90. $ \4 S! [& x4 c
    91.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    92. . v1 h2 p$ }, @2 t  t  ^& J
    93.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘  R' t! c) n2 ?4 f6 Z
    94.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象- s% S4 O& H  `) _
    95.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;6 J% Q\\" F; J' x) r7 N0 ]' ~
    96.                 break;
    97. 5 c4 F/ M/ x$ g  N7 X2 ^
    98.         case 46:        //重载函数new
    99. . ]/ W  `( B5 W/ g* N. Q
    100.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    101. , D* o( `) `0 ?: V8 v8 T
    102.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型7 d2 l! H# t+ s$ ^4 C( g$ _) Q) E
    103.                 break;
    104. 3 f\\" w/ `  u! Y9 E7 L( a* C! z
    105.         case 49:        //重载函数o
    106. 4 p$ A3 H6 g2 W\\" i\\" X* W0 k5 m: ^) b
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. 0 X9 y3 B, D* x7 x& ^
    109.                 if(!pMessage) break;\\" j; O- v+ k2 r9 O
    110.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);# C  I8 x! N) e+ v; ~
    111.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组- y8 U2 `/ f5 N\\" e! W* w
    112.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    113. $ l, n. w; M; O+ z. N. j7 c* \
    114.                 pa=pRealArray1->Array;
    115. * L' }5 g( v* ?+ f! P; b
    116.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 v\\" {1 X& K/ _! k
    117.                 for(i=0; i<m; i++)        //输出矩阵0 H9 A  E5 U: w, r
    118.                 {5 p  b: k& [: q$ M
    119.                         pMessage(L"\r\n"); k+=2;
    120. 0 ?) r6 ^. k+ T. _% i5 V
    121.                         for(j=0; j<n; j++). q; q1 u. x7 G
    122.                         {) m/ J\\" v2 J  K2 Q( e9 r, t# M1 G- V
    123.                                 _gcvt_s(chNum,pa[i*n+j],16);
    124. ) N7 r# ^; K! ^* ~. k. K/ g
    125.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    126. \\" ]$ u# W, F' @\\" }  x6 S1 R: i' I
    127.                                 wchNum[u]='\0';
    128. 2 }: T* y' o6 r
    129.                                 pMessage(wchNum); pMessage(L"  "); k+=2;$ R! D' s7 C/ w9 ~! X  X& b
    130.                         }
    131. ! G7 H\\" F. Q8 I+ I5 G2 a' _
    132.                 }1 m# ~/ H+ H- A9 ~( T8 A& Z
    133.                 pMessage(L"\r\n"); k+=2;
    134. , B9 F0 K. W\\" L- b& h% C9 C1 X0 k
    135.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数9 M' G8 s% R! |5 _! P0 Y( P/ x
    136.                 break;* s# j4 Q' |) y2 z0 C7 X2 R; M
    137.         default:\\" L. {2 h- q+ k3 M: Y7 ?8 E6 r
    138.                 break;
    139. 9 `! p6 L' m# r5 h. C
    140.         }
    141. : E& f9 x  G8 T) R4 z  L
    142.         return a;* n) n* u$ R\\" D9 [9 T5 h\\" n0 l
    143. }
    144. 3 c& o; w# Y6 K# _) B
    145. void main(void): V! J, G: ?3 M# N7 u. k. p
    146. {9 N# r0 N& A# y\\" V7 ~5 R
    147.         void *hFor;                //表达式句柄( p, i9 [\\" S; Z2 f
    148.         luINT nPara;                //存放表达式的自变量个数8 t5 S0 d9 {0 T\\" l1 e, N+ H. T
    149.         LuData *pPara;                //存放输入自变量的数组指针
    150. ; z* @7 @0 Z4 {0 M0 i
    151.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置) W$ L  P  a5 H6 K# V: X2 N
    152.         int ErrCode;                //错误代码
    153. ) r' E. A; w, e- N# t
    154.         void *v;: u$ Z/ d0 O3 g0 q2 l
    155.         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.]}";//字符串表达式,矩阵乘0 r$ C8 X8 ^% G# I
    156.         //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.]}";//字符串表达式,矩阵点乘6 [: _0 v+ L0 A
    157.         LuData Val;
    158. . X5 P' s& u9 }9 L+ J3 o6 |
    159.         if(!InitLu()) return;        //初始化Lu7 s0 a* C- p4 ]9 o
    160.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    161. ) X: {3 L/ j; I3 A7 ~. K, X. O
    162. : x, Z, G' K5 X, a\\" q9 d2 D* y
    163.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    164.   U9 ?0 |8 d& D$ _* \* l$ F1 P3 d
    165.         SetConst(L"matrix",&Val);        //设置整数常量
    166. 6 ]; s1 B6 F3 N
    167.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    168. 6 r8 f# r\\" y1 b  ?- I; z
    169.         wcout.imbue(locale("chs"));        //设置输出的locale为中文1 h3 o, j! h8 ?& p
    170.   
    171. ! S& c( l/ R( u* f! P8 g' w  N
    172.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式0 N, a0 _1 z\\" |5 K; Q\\" H& b# Z
    173.         if(ErrCode)
    174. \\" g7 {) p. ~+ G
    175.         {
    176. 7 E  x2 g$ E& U' S8 |: d. B6 a/ ^
    177.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    178. * H# u0 c3 p; a& h! |0 D
    179.         }
    180. * _8 d- F. t, q& W
    181.         else8 m* P9 }+ C# C* ~, U2 D4 A
    182.         {
    183. * K/ D$ E, \3 W% U8 P0 @, Y
    184.                 LuCal(hFor,pPara);        //计算表达式的值
    185. 5 U8 O6 t, z. j9 I
    186.         }
    187. 1 O, t/ N+ D% s+ M
    188.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用/ ?' T8 S' y6 N) H
    189.         FreeLu();                        //释放Lu
    190. ( o& g# ^9 d& R6 c/ }- D; A
    191. }
    习题:
    $ r0 H" X' p5 S% H$ p
    . n& B- d+ ?' N    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    ( j) p, g, V( E* s0 ^- X
    4 j1 F6 i. P, I8 Y- ^" f1 _    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=7 N# I; O. u$ d5 H\" X0 G
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],9 f5 X* U, g; V% E$ J\" E
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      * d1 Z$ e2 ?  ^3 i- G
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],# m! s. a2 @5 G* l) v
    5.     t=clock(),& j& c! o3 \' y  a* a. N$ Z
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},: |* K! o$ g: ]
    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.1 X: @6 Z5 C4 z  P( x$ G
    2. 5. 4.
      0 D$ K, }+ @) y. _
    3. time=0.875 seconds.
      # @! @7 u- o( E; i3 V
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      / ~/ H. |6 @\" g- C, t
    2. b=[2.,1.;1.,2.];3 u2 G% `( n( B* \# R7 Z9 H
    3. c=[2/3.,-1/3.;-1/3.,2/3.];3 n8 l& W& S  @9 W# \9 x
    4. tic,
      ( ]\" L- W/ j3 y\" G
    5. d=a*b;
      ( _) O: V# ^, f
    6. for i=1:1000000\" w5 k. ~- W. e& N  w3 C+ r, a
    7.     d=d*c*b;4 M, k0 L& L9 N8 E* ~7 A: f+ R
    8. end- C7 W& N8 v2 R; K# m; ^. L) i9 Y
    9. d,7 N+ R8 S' m, a0 j
    10. toc
    复制代码
    结果:
    1. d =0 O1 ^0 r8 A  X. |2 l5 W; R3 y9 p* H
    2.      4     5
      8 l) R  L  u/ r) g1 X+ {
    3.      5     4
      : d/ X4 b9 r8 C% y6 j1 Z+ h
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。1 J$ l5 v1 N( T% f- H
    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 20:55 , Processed in 0.547019 second(s), 52 queries .

    回顶部