QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8475|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。* N( G! q& d- Q8 X

    1 A6 O9 i) l! f) W* v, V    基本要点:
    2 k4 x% ]+ A1 \  _6 D8 S) o5 D+ C+ `$ Z, e2 ^' I9 S" X
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    5 R5 D) l# i) t$ G3 Y# w" R% I+ Y* m* ^1 q+ B7 P. H# j
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    1 ~; ?4 V5 S" J  x7 O  r8 ]. }
    " }/ ~( G4 b- Q) A, \; R/ I" w    (3)为扩展类型matrix编写其他操作函数(本例未提供)。, V  P( s# p& D' C. @. O

    9 a" F: @' J( t    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h># l4 F/ c/ ?+ b1 g4 P# g
    2. #include <iostream>& z, O7 j7 D+ Z2 l0 Y6 m: e& B! C
    3. #include <math.h>: z- V8 A& \8 r/ h0 A, _
    4. #include "lu32.h"
    5. * b0 X( z# D; h% Z

    6. ( ^+ t$ i) O$ F% e
    7. #pragma comment( lib, "lu32.lib" )
    8. ( h  c! Q4 E! V

    9. , S% u! d7 n\\" U
    10. using namespace std;
    11. / L7 p% X  D' f* K- |
    12. 5 t9 ^- Y6 \\\" _2 v; y
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定* [0 k4 i5 r6 d2 l) P

    14. 0 g6 O9 K% b! n8 g4 ?3 O$ X
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 8 ?- l! T5 }& b# Q; j6 F' b
    16. {! J% ^! b; r3 j; M; h* Y
    17.         wcout<<pch;
    18. . K( H9 [  T' M; P7 M, p% F4 F
    19. }
    20. + r+ E' F$ i4 _, U8 u& P3 w
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做\\" P1 F% A2 Q( j% g
    22. {
    23. 8 j7 L2 V2 ^5 X& ^\\" ?# t4 \
    24. }
    25. ) r& b5 T/ X; n% g# A3 }
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数1 Y- a6 `! _: d+ C/ H
    27. {0 I6 b% R* L5 V/ d. i4 j/ Q
    28.         LuData a;
    29. 9 s; Z8 Y* Y( }# P6 v% p- l
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;. Z7 x% Y( I, A! O. ?/ ^5 v
    31.         luVOID i,j,k,m,n,u,v;
    32. $ }6 h; \9 I) s* X
    33.         double *pa,*pb,*pc;6 U  P1 v, O, ~/ y
    34.         luMessage pMessage;
    35. + |6 B; O% Y8 t5 \
    36.         wchar_t wchNum[32];: x: E( w: b! _6 [0 M\\" c/ W; |
    37.         char chNum[32];; T- U3 |$ r) h2 t+ H
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    39. \\" t/ }$ W! a5 s9 J! [7 g% J
    40.         switch(theOperator)( |; |. n  s' q# b2 k5 W1 J
    41.         {
    42. 5 q/ H4 u* z: v6 C
    43.         case 2:        //重载运算符*
    44. \\" e5 k- v$ B: @' U; f
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    46.   G6 r# ~\\" Y\\" H9 K
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);$ l! ?0 t+ d5 h* ?+ U
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. ) f; s% G  Y. j: Y4 W+ R0 A
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)4 E$ ^% U4 ?7 h
    51.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配7 v8 o) a% S, W
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象. G; N/ B! H- F4 t% `
    53.                 if(!pRealArray3) break;0 h9 C0 ?; b/ n4 W/ d: [: I6 U8 {
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    55. ' g2 R/ m* g, a3 J3 f
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. + v: k$ G7 q# i% Y/ b4 e( \
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    59. 7 d8 q# Q& e\\" Z% V; U
    60.                 for(i=0; i<m; i++)        //矩阵乘6 ?# n7 i6 P3 p
    61.                 {# W! @6 X3 Y% z
    62.                         for(j=0; j<k; j++)
    63. # n0 o2 |0 {! L) {  I
    64.                         {; t: C# V1 I- O1 j2 I\\" j9 }
    65.                                 u=i*k+j; pc[u]=0.0;
    66. ( A6 y3 P2 |5 s  Y
    67.                                 for (v=0; v<n; v++)
    68. ! q* k: ^2 [; H+ p' `( o
    69.                                 {
    70. 5 C. N/ z. f) s. R/ l# L
    71.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];4 Q' V4 `: X\\" h; b\\" A$ e* |
    72.                                 }
    73. 1 k3 c% w# V0 t* }7 ?/ ^
    74.                         }4 S. F$ L( W4 U8 u$ B) S- n% b
    75.                 }
    76. , Y+ b% e6 `. h! R% V
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象- t\\" D  x- M' M5 I0 j. M* M
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79. + k  a4 P: U) ]
    80.                 break;% B; ~: ^- U5 Z4 [1 g: }. E+ B
    81.         case 25:        //重载运算符.*5 M3 Q) |0 Q/ W  G5 q
    82.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);: z/ `% F\\" e. G  l  L7 n\\" V
    83.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);- \! P- d% K1 n) @% s0 u/ h
    84.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    85. ' X5 U\\" {- \- M! `0 E  @- @& [2 |
    86.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    87. * r$ `( K: g' v( w
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    89. # c/ e2 w' i3 k\\" a( b
    90.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    91. % J+ H8 E+ }4 x2 B
    92.                 if(!pRealArray3) break;' Q) m0 ^$ ^' a7 ~\\" N, C3 h9 Q) z: k
    93.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小$ s* l\\" b+ ^6 {4 \; f  i
    94.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    95. 6 Q0 f1 r7 v! j0 A+ |# x\\" |% _
    96.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    97. - i  w5 G$ M4 E$ a+ a
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;; W: |+ f0 `: Q( u5 }9 [: t
    99.                 break;+ P0 @* s7 ^6 F8 J( S9 V* s
    100.         case 46:        //重载函数new
    101. ) ?& Y. [0 |1 |
    102.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数( Z; a- ?  p' [7 R  f, C
    103.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    104. 0 f* b$ z( E# d2 P) J
    105.                 break;
    106. \\" S\\" N) u\\" h+ u, f0 ]+ G4 q+ D
    107.         case 49:        //重载函数o
    108. 3 U0 R! U* x% Q
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);) A7 @& S' @+ a# l( G
    110.                 if(!pMessage) break;
    111. 4 d5 h1 ~3 ?# q\\" ?$ l
    112.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    113. ; G1 J\\" _- F6 z) C
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组3 W3 G0 I' h\\" o. V# E1 u; f\\" g
    115.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    116. 3 t0 K) V2 ^7 y: q
    117.                 pa=pRealArray1->Array;! P3 w6 ?/ K) _\\" F7 g. P9 d8 \: m# v
    118.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    119. 8 ^- k8 \8 i3 N6 Y/ ^
    120.                 for(i=0; i<m; i++)        //输出矩阵
    121. , ?. o  X6 \6 ^# P: K- e8 h8 w
    122.                 {
    123. . p0 t+ v3 O) B# u+ f\\" [
    124.                         pMessage(L"\r\n"); k+=2;1 r8 T* _2 P. @' p0 N  }' d7 Y
    125.                         for(j=0; j<n; j++)! N5 O& x$ V; H  l  s7 ?/ m
    126.                         {/ ^+ Y4 q% y7 x( q; S9 u
    127.                                 _gcvt_s(chNum,pa[i*n+j],16);8 ^+ I4 {6 p. {1 M
    128.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    129. / y% U+ p  B0 i1 [: |! b
    130.                                 wchNum[u]='\0';7 R0 N! e1 a. z7 U2 _' k
    131.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    132. 8 _- A# O. b) J2 _, C\\" L
    133.                         }8 j, ^! F) w9 }
    134.                 }
    135. 8 S6 l  x9 w, j4 J2 n6 H
    136.                 pMessage(L"\r\n"); k+=2;: c1 g& s0 R, S8 t5 M7 ^6 z
    137.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数' \% l- ?& {- I9 ~8 a+ F
    138.                 break;( y: _) N' |5 h% ?3 Q
    139.         default:  @. M# D\\" H  Q  N4 l
    140.                 break;5 R  u9 Q' e. W/ h% l2 b5 ?% v$ r
    141.         }
    142. + n  n8 {' d' [0 F- H
    143.         return a;
    144. , Q1 ?  H3 I! s4 \7 S, _/ G& X1 A
    145. }
    146. 9 v  U- {6 A2 {2 i1 F
    147. void main(void)$ K, `9 M7 L9 l0 {# b
    148. {
    149. 8 I\\" b2 U- r\\" B3 x! t3 i) o
    150.         void *hFor;                //表达式句柄
    151. , G7 a- }+ I& U$ l9 n0 w6 K
    152.         luINT nPara;                //存放表达式的自变量个数+ N  F( }5 n) O( w% |# B\\" L/ v
    153.         LuData *pPara;                //存放输入自变量的数组指针
    154. - n4 P9 c' m\\" ~* k
    155.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置' m5 v2 P3 B, ?
    156.         int ErrCode;                //错误代码
    157. $ G; Q7 M- O! w( V) G\\" R
    158.         void *v;
    159.   Z. {; b; |0 w3 |! ?$ L$ I
    160.         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.]}";//字符串表达式,矩阵乘, ]1 T# }0 g6 @3 }+ w  K
    161.         //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.]}";//字符串表达式,矩阵点乘
    162. 1 l' ?# z' C1 r# x5 Y3 H* P+ u
    163.         LuData Val;2 V2 H& s. t$ v: D  y/ d% `( |; H; k
    164.         if(!InitLu()) return;        //初始化Lu' E& n8 M# L9 I0 ~( R! m
    165.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    166. ) ]2 O+ q$ t0 A/ D% r% v( z$ r
    167. ) V2 g% z' ?6 e7 X! s, y
    168.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    169. 7 L0 W7 s$ x% q- z\\" t3 _- g4 \8 J
    170.         SetConst(L"matrix",&Val);        //设置整数常量
    171. * r3 H* \- t  H. ?. ]5 `
    172.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息2 S* Z\\" P) l7 ^3 X3 [\\" T& y' b
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    174. 2 T# B4 g6 a7 b
    175.   ; f6 h. \# h1 J6 |5 j
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    177. ' x8 B$ t/ m; v- P
    178.         if(ErrCode)  g\\" B4 J, `( C( }9 l! O
    179.         {4 B! ?$ E' h! C+ ^2 g( T
    180.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;& ^0 h0 D# D4 A8 B1 k/ C; }
    181.         }' s  S# W5 z5 G: e
    182.         else, L0 A; n. r, L, |6 P
    183.         {) V4 f- k' [* m) v6 j+ Y
    184.                 LuCal(hFor,pPara);        //计算表达式的值
    185.   J. u& j9 @. k4 \
    186.         }
    187. 3 ^  H6 B( F; r6 t0 L8 k: ^
    188.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    189. - a2 u% K& s; o# e  s, \; G
    190.         FreeLu();                        //释放Lu* I+ c1 c1 k* P+ \\\" R
    191. }
    习题:
    * Y- Y5 ]1 A  K2 N, i3 Q
    " S9 r0 T' {" g  I    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    * ]2 W' s8 I; Z* }( k) w! Z4 m9 c5 C
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      # L( R9 d# b# K/ Y: v& a0 r
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],( R$ Q% b1 e5 k' X: b8 Q$ c7 M9 X
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],; y* v; z$ j7 x8 d$ Z1 U* e
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      3 x0 r) ^\" N% }
    5.     t=clock(),
      * w, Z+ c; d\" O( C; o
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},\" L1 r, ]  a7 L8 W2 \. p\" k* R* w
    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./ N2 ]* e9 Y$ `/ a1 m$ M
    2. 5. 4.
      0 `. n& k# H6 z8 d9 n
    3. time=0.875 seconds.+ u0 t0 u4 Y3 W1 N' y\" Y
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];, s; v' w\" _) k, Y: H$ j  K  [; n! W
    2. b=[2.,1.;1.,2.];* }7 Q4 N3 n7 f. p4 F6 n
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      + Y: J  I7 W  J\" e% ]$ b; t' k
    4. tic,/ l& J1 F3 b, R( D! T3 o\" ^
    5. d=a*b;6 N8 L5 e$ \0 `0 L, u1 g7 b( e
    6. for i=1:1000000\" _, X5 S/ i4 P4 `: F\" O3 e0 y4 `- Z
    7.     d=d*c*b;! T' c, X  _3 Y. b+ T3 V
    8. end& N9 C9 k, w/ {( P\" `& w
    9. d,8 U0 r' v# |$ y& ]\" f( D8 |
    10. toc
    复制代码
    结果:
    1. d =- R% ]( K5 n: g/ K
    2.      4     5
      \" m6 P. {+ w# c) G1 c
    3.      5     4
      / S6 b* v4 N6 \5 @& y
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。- p% L5 W& C3 h0 |8 A: @
    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, 2025-10-7 17:48 , Processed in 0.548040 second(s), 62 queries .

    回顶部