QQ登录

只需要一步,快速开始

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

Lu基于系统内置对象创建扩展数据类型,小矩阵乘效率测试

[复制链接]
字体大小: 正常 放大
forcal 实名认证       

45

主题

3

听众

282

积分

升级  91%

  • TA的每日心情
    难过
    2012-8-27 18:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    #
    发表于 2011-10-23 09:37 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
        本例中,我们将基于系统内置实数数组创建矩阵(matrix)类型,即:基本类型为luDynData_realarray(标识实数数组),扩展类型为matrix(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。6 z) D$ ?0 d! ~1 q0 ~3 L2 p
    ; O; ^3 T8 {9 A) o4 W
        基本要点:) y$ w0 \* k7 P. ]

    6 S5 z0 J  Y  Z    (1)为扩展类型matrix编写运算符重载函数OpMatrix。1 A! ]. q: E1 V& |& l0 d
    8 X2 N* b% J! ]# P0 t% ]3 X
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。6 C. p1 z' Y- \0 h, J' Y4 F  ?" M
    & S3 L: b" M! A9 [, s! [" b; X2 {" u
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。/ \2 T" U# A2 L/ h
    ( o" ~# I3 @' X- b- [, d3 Z
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>: ~- m% E\\" @9 f; K6 [
    2. #include <iostream>4 j- y( [+ |7 K% i
    3. #include <math.h>
    4. 5 c, d# g! j! d4 Z* u
    5. #include "lu32.h"
    6. 4 a- o& _# m& \0 X! Q/ N2 g

    7. 6 B0 ?\\" Q- O, E
    8. #pragma comment( lib, "lu32.lib" )
    9. 5 g5 w! V/ X\\" I4 S) r7 B

    10. # i4 h2 ~9 h, {! R: H: y% s9 d# A
    11. using namespace std;6 ^5 A) P& R: @- }2 P& i6 M
    12. 8 P( ~+ Q\\" n( g/ E+ W( ?! G
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    14. * x; b( Q9 d7 s% A: ~- }
    15. 5 o' F+ Y; y. {. F* J: x& X
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 ' X\\" \2 K4 Y9 j7 Z. _' ?; L
    17. {
    18. 8 \3 L4 h1 x) j0 ?  H8 W
    19.         wcout<<pch;+ V* F: U* u( c/ O' Y% o7 O( c
    20. }
    21. ( h# D, }\\" h\\" ~9 b
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做  `/ O/ _! L5 Q/ E$ c8 J0 ~
    23. {
    24. \\" Q+ x& k7 p9 u2 e' E1 G3 X3 R
    25. }
    26. 9 \# g* |( J4 ]( B) |9 t
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    28. 7 y! L# o$ ?7 B
    29. {
    30. 2 Y! E. U' R& B+ r& e5 V' |
    31.         LuData a;
    32. # C, J5 |& H% @
    33.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    34. ; p. V) L; X8 x
    35.         luVOID i,j,k,m,n,u,v;
    36. 9 n: W, e+ E$ l3 ^7 G* ~5 a0 D
    37.         double *pa,*pb,*pc;
    38. ) t* L, i, s) S) q
    39.         luMessage pMessage;
    40.   M( D+ e  \1 A3 h: W* R1 r8 S# L  I
    41.         wchar_t wchNum[32];* {/ W1 M& U! s$ z+ T5 A. s
    42.         char chNum[32];' y5 d4 y\\" C) q
    43.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;6 C  X/ x  h) B' j6 a% u6 @1 b
    44.         switch(theOperator); Z' _) z$ M( K5 g
    45.         {! P+ o6 e9 M  T! [! U
    46.         case 2:        //重载运算符*
    47. . ]( [+ }& i& k
    48.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* N* |6 c' Y/ ]4 E- {) b6 o7 a
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);  K( E+ W% {2 m3 v
    50.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    51. 3 Q% s# P& H2 j# x
    52.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    53. 3 O8 M* f* e7 E' A& i, q/ R5 \
    54.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配) u- ^: y0 B# H8 a0 ?
    55.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象0 B1 v: F# z\\" [( s: N8 {$ \  H
    56.                 if(!pRealArray3) break;
    57. 7 a4 Y1 P6 l( n; V3 I3 T/ D
    58.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    59. % P5 o7 o* @\\" {# [9 }6 t; W
    60.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;\\" {  c\\" }' h/ i5 P) R( _( u
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];5 X' A1 I5 l+ ~% U9 q
    62.                 for(i=0; i<m; i++)        //矩阵乘/ A7 e* C3 G- |8 T
    63.                 {4 B' S! p' b- h1 a! C
    64.                         for(j=0; j<k; j++), k6 `( I7 r. T  E' q& s
    65.                         {
    66. + F2 @, ?7 r0 ~4 A- K
    67.                                 u=i*k+j; pc[u]=0.0;  j5 v8 D6 H4 L\\" J9 J7 ]% y& m
    68.                                 for (v=0; v<n; v++)2 e& U: a3 o  F) E. p4 j
    69.                                 {\\" X\\" o  F3 D9 U( L3 p' i
    70.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    71. 1 |\\" ]0 N7 ^$ H' \9 q# l
    72.                                 }\\" c; e4 V6 g4 z8 J* R# _
    73.                         }3 F! H$ y% ?( C4 t* [$ Z: K5 q
    74.                 }
    75. ; z9 g- e- `/ v6 u# L: p: [1 w, y
    76.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    77. 2 w3 C' ?1 \# Q4 x& O, z
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79. ; L' L+ n: U  ~+ Y
    80.                 break;
    81. 5 p) g7 O  Q\\" B6 _: X4 ?
    82.         case 25:        //重载运算符.*
    83. ) Q, B, A0 G8 u( s# A1 i\\" O& p- ]
    84.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);, C2 ]0 p' k, m
    85.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);0 s, |1 U4 N! n' W
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组+ P9 n! _  s\\" _' j* |: z
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    88. . s, ^# K1 u' H' W$ M0 r
    89.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    90.   t0 b, `' d9 |1 D! ^+ T* b
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象+ {! M\\" E. C2 B5 ^- @
    92.                 if(!pRealArray3) break;
    93. 1 B9 t) ]) w\\" i6 v5 G5 p: Y5 r
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    95. 2 M1 V* z4 i1 b! j- \
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    97. - D+ f, y/ f) C. ^8 ^) g
    98.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    99. 8 T* ?3 `) d5 w\\" J- u; A
    100.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    101. + ]) S7 |$ I0 W# e& B, b
    102.                 break;
    103. ; n! z& p  ]. {% P8 w/ t
    104.         case 46:        //重载函数new
    105. 1 I7 I- h' H$ z, ~
    106.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    107. 0 y. m: h+ c0 w- `, S0 O\\" u
    108.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型. l7 |5 ^; Z2 w# I* i9 l: m  h\\" m
    109.                 break;- t/ m* k4 H$ x5 w: m- m& a1 F
    110.         case 49:        //重载函数o
    111. : v& k; D7 D! `/ {: G: K
    112.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);$ l( y( x( g* P( N' Q8 e& q! h
    113.                 if(!pMessage) break;0 L. ]% h% V1 o, o5 w& b0 R
    114.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* \/ Y; ]& J! y, a8 }2 Y
    115.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组' j& g6 t0 n7 s5 j8 }$ v
    116.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)! G) K9 j3 H! ~' J- \
    117.                 pa=pRealArray1->Array;6 ?4 L& ^* n/ k  |* A. L
    118.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 K& I  P6 T/ ^4 V* O6 M
    119.                 for(i=0; i<m; i++)        //输出矩阵
    120. . R! j0 |+ C7 z/ k' c7 Z
    121.                 {, J7 b( l\\" u8 M. g) Z# R2 J
    122.                         pMessage(L"\r\n"); k+=2;; D\\" v- @; i5 m\\" z! w. s: S4 f
    123.                         for(j=0; j<n; j++)
    124. $ T( k9 b  D! `! d# n+ M
    125.                         {& z  z9 h/ |6 A& a, o+ p
    126.                                 _gcvt_s(chNum,pa[i*n+j],16);
    127. 6 \+ j- [7 V0 c1 `4 w5 q
    128.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}0 }3 H: K# S% b+ Z8 _
    129.                                 wchNum[u]='\0';
    130. & Y( F( e  E3 ]- f# V: p
    131.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    132. + a; T, w; G# P; Z) V
    133.                         }4 K6 z$ C9 X- X6 a8 \
    134.                 }
    135. 4 R& U  z$ a8 s! ^
    136.                 pMessage(L"\r\n"); k+=2;3 h& M# _& n) \
    137.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    138. - W! D' I* L1 z3 o/ w/ |
    139.                 break;% r, Q% M+ r5 m2 w7 F9 G- J& ]. o7 F8 h
    140.         default:
    141. 7 u' A: F. i. r0 s2 s3 S4 F
    142.                 break;\\" N8 M  G( q+ v1 C4 j! `# u
    143.         }3 b. p, f, N; E) g2 J
    144.         return a;, m% Y- M+ ]: x' n
    145. }
    146. ! k+ C/ p% g* k2 P4 r9 n. b/ H: J' K
    147. void main(void)/ ^/ E5 t4 }- m# g3 z6 V% Q
    148. {  G0 a+ W, {3 M( S2 `, b) \
    149.         void *hFor;                //表达式句柄
    150. ) z+ a+ B  t' m2 g5 z- i% ^
    151.         luINT nPara;                //存放表达式的自变量个数, Y' S; @1 O5 ^; W) A, Q
    152.         LuData *pPara;                //存放输入自变量的数组指针1 }7 S8 ?3 g% E$ e
    153.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    154. 9 f/ l( G9 N( q8 S, w- h
    155.         int ErrCode;                //错误代码& f( o. c% U* b' y; V
    156.         void *v;1 I/ F$ Y( `  g9 Y! @' K! T4 Q
    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.]}";//字符串表达式,矩阵乘+ O1 P5 k# i8 F0 c. M/ J# Z
    158.         //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.]}";//字符串表达式,矩阵点乘
    159. 6 T' G, ~0 V! I$ M. Z) w) f2 A$ L
    160.         LuData Val;
    161.   w. j- ?\\" v3 w5 y) Z) t
    162.         if(!InitLu()) return;        //初始化Lu
    163. 3 Q; _! _2 |2 w
    164.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型. b, ]9 k. N$ |, v$ m7 z

    165. : e* n% x# p( q
    166.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量/ h3 U1 M  K8 H. }4 e% g! c
    167.         SetConst(L"matrix",&Val);        //设置整数常量* O# i5 I# }3 v# ?5 j( t
    168.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息9 h! a( Q) R8 U+ D6 Z5 h
    169.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    170. : Y$ a# H) w\\" }/ Z8 {
    171.   
    172. . y0 `6 e$ O5 x$ b( u/ j
    173.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    174. / q% c3 {, k# @# N# i, d
    175.         if(ErrCode)
    176. \\" e' z6 l; S+ l' X: P: Z\\" v, f
    177.         {\\" f. q& ^$ D) J8 o+ e% E) {
    178.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    179. 0 e& z, d( p, G+ @* Y2 {
    180.         }1 r3 v! `& u: w. E8 N\\" W' w
    181.         else& F% f/ D1 O; X0 z- _3 z5 N
    182.         {7 c7 {! Z- E4 N$ L
    183.                 LuCal(hFor,pPara);        //计算表达式的值
    184. ; `7 S; I& V! z8 `! t; D- B& b. m' y3 i
    185.         }% e\\" k7 t' O0 V, m6 X, J9 m4 i
    186.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    187. / y: _* t' |, m) j
    188.         FreeLu();                        //释放Lu
    189. # G# x$ R  G8 s
    190. }
    习题:! f: T* k* H9 U* n
    ! U2 a5 o! z" ?9 b5 B* e9 j
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 " ?' o, e" J3 v+ x" v" u
    % y, N6 Q. y" ~  `* O  J0 q% L
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=: v/ a2 h+ y8 _- ?8 n5 T5 r
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      * N; \2 J2 l* e
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],: F5 Z, m% E, }% a& J0 b4 U9 M
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      & @5 Y  F6 v\" D5 d4 [. g
    5.     t=clock(),
      & e3 n+ z: H/ ]\" y8 T7 U, W
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      1 D! ^' O1 T8 K% a# i
    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.! I. d% w! |- f0 o! [6 ~
    2. 5. 4.
      # d  E) k$ K3 x+ |4 g( s
    3. time=0.875 seconds./ W. B2 R5 `1 y' K
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];( |* \4 z! c. t2 w$ D
    2. b=[2.,1.;1.,2.];
      ) [( h! h; v( v4 D' S0 N
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      4 U4 @: I8 W* g\" }# Z) G' U
    4. tic,
      5 Q$ S7 L# V& Z% a( g
    5. d=a*b;
      6 H0 e  M7 K5 a+ t1 @
    6. for i=1:1000000
      ) X/ U4 M\" L9 e' ^: {
    7.     d=d*c*b;+ l  V) ]# F, f* p8 [2 e8 i4 U
    8. end
      5 e2 c, p7 g# L8 O
    9. d,) Y9 W/ ]4 X' z9 ~
    10. toc
    复制代码
    结果:
    1. d =
      4 q& g; h8 Q\" x\" p* o6 h
    2.      4     5
      ) n, y; k* t! g: {- f) `/ k1 u
    3.      5     4
      * J) k7 W- l1 R6 F5 T2 ]3 S5 l
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。3 l) g. C' v5 T7 B! R; c2 S6 l2 m4 a
    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-9-2 03:38 , Processed in 0.429921 second(s), 55 queries .

    回顶部