QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8671|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    : H( g0 Y1 F+ |7 `; K  V+ Q6 V3 q* H' @
        基本要点:3 f  F% Z- ^3 s8 Z0 [4 f

    1 q) K' l6 M; m; F    (1)为扩展类型matrix编写运算符重载函数OpMatrix。$ K3 ~  m8 x5 j+ W
    2 |& }3 {. a! ?6 N
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。/ V  h% z# m8 q2 f5 E

    , R2 z. u! x+ ?  b    (3)为扩展类型matrix编写其他操作函数(本例未提供)。' N& @3 y; b. S) ?9 w) J' S5 ~4 z

    ' }- \$ A1 a9 x3 M  E% o    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 4 j9 D\\" C- {2 o' O
    3. #include <iostream>8 f/ b( P8 N# v. e, R  {% l
    4. #include <math.h>  N' J6 q( L- o( F
    5. #include "lu32.h"
    6. 8 G1 z4 |( u3 A

    7. ' K; `1 [0 b2 v) n' u1 {4 W
    8. #pragma comment( lib, "lu32.lib" )
    9. 6 E) J8 e$ y  S\\" C1 Y
    10. \\" \# g# |' G. ?6 p! ?
    11. using namespace std;) g' R% o5 A; m5 c/ \

    12. ; s4 D) W3 L4 D  e
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定0 @0 r; L' d3 x! @
    14. 8 K& v! F% k; s
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 7 d1 @; k1 }4 X\\" ?# J: U3 u
    16. {
    17. ! K6 t' Z  X: i. S/ p4 h4 D0 B  |
    18.         wcout<<pch;/ \8 e\\" J4 d- E9 v$ I* C8 n3 J
    19. }) J8 n6 ^: \' y: P# ^
    20. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    21. # m9 p$ ~. F* w- X: B
    22. {
    23. : b1 Z( z7 S. |1 x. a+ e
    24. }$ m* _8 S' L# Z) h
    25. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    26. & F- O) w* X! _) `
    27. {8 y% l; N+ Y6 F. J* R7 a\\" L! E
    28.         LuData a;
    29. & i; o4 m- `2 S: a! |
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;+ O. i) G+ n6 v  i' f
    31.         luVOID i,j,k,m,n,u,v;% ~% u* q3 H+ x- J2 Y4 L
    32.         double *pa,*pb,*pc;
    33. 7 n) F0 [7 N4 D7 k1 E# ]
    34.         luMessage pMessage;
    35. , G& Q8 H6 {; c/ D% j. R
    36.         wchar_t wchNum[32];
    37. ( q% o2 t1 b7 D/ j6 k
    38.         char chNum[32];2 e\\" Y( R9 l: M) a
    39.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;! x5 ^! o% ]: M- ~: `! h+ _) D
    40.         switch(theOperator)# m& Y% w$ F' V. E8 `4 l* ?
    41.         {
    42. ) l' N$ k) \: S
    43.         case 2:        //重载运算符*5 @. Z! Q6 u, x3 M% ^( K
    44.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);/ k# w6 l+ `$ \+ f: W+ l
    45.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);) H! j  s7 p, x8 w( a
    46.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    47. 7 T9 {* ~7 S+ g2 g2 S( O
    48.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)\\" D: a4 h, w+ }\\" ]0 a$ {
    49.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    50.   t' O+ v4 g: m0 W
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    52. ! U+ i\\" X& m* X# V
    53.                 if(!pRealArray3) break;
    54. $ \2 h# ^0 m! ~# }0 ~$ X0 b* I9 g
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小4 p+ E2 R1 U. ^9 a  C
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. ) b6 S& `$ c) F
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    59. ' n2 J1 G\\" M3 \$ o2 S
    60.                 for(i=0; i<m; i++)        //矩阵乘
    61. 0 v+ h1 ^: }. W1 T( y\\" t
    62.                 {% l. N4 q+ G3 p\\" W, z
    63.                         for(j=0; j<k; j++)
    64. ) y$ a$ A' J% A* f+ }
    65.                         {! _' Z6 {& C% y0 Y+ C
    66.                                 u=i*k+j; pc[u]=0.0;
    67. . a, b: T% V/ m* ~1 a
    68.                                 for (v=0; v<n; v++)8 h\\" {/ P3 v  y* j+ p2 ~! w# \
    69.                                 {\\" l' [( t* @  t0 V9 t
    70.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    71. 9 [* @0 E# n: k- M4 f2 N
    72.                                 }
    73. 3 N, o- D9 }/ {4 U
    74.                         }. b1 u% t2 b0 P* b
    75.                 }
    76. 2 j2 X, l) C! f+ \
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    78. : u- q\\" E3 s$ e( b4 j0 ?
    79.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    80. * Z' m/ `% ]. c) T# `% o
    81.                 break;
    82. 6 L6 b) E! i* {5 i( g
    83.         case 25:        //重载运算符.*9 c8 c) I) t. y; Q
    84.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);) M( d9 N4 s0 j5 R7 @2 c  j9 s
    85.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);) p' [- W  V+ u7 ?  {9 O, f/ Q& U
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组; X+ Z( E) J& v% d5 {. y
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)\\" _  V8 H, [4 |5 @* e
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同\\" g- T. E) a- m( x1 o
    89.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象) u. t! V% x/ ?8 q/ W0 d
    90.                 if(!pRealArray3) break;
    91. 4 O5 I5 O  d1 v+ Q' e
    92.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小* ~( l4 Q1 F$ R1 M
    93.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    94. ; {/ x8 M! P1 {% h6 }. e- O
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象; v3 r: d- F' Y
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    97. # Q$ F* g$ T& t% J7 Z; ~  {9 \
    98.                 break;5 i4 c9 W+ @, g$ F/ l$ Q
    99.         case 46:        //重载函数new
    100. 5 x* k3 n. s( e' j* ]6 p\\" @
    101.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    102. ) i9 @  g0 w) O, T$ d( L
    103.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型3 b2 U5 ]( f, ~0 I; O0 V+ C
    104.                 break;; z/ t3 p% b$ h+ {
    105.         case 49:        //重载函数o- s1 w. E) a& d' \\\" ]
    106.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);2 v  c  S6 S5 _
    107.                 if(!pMessage) break;
    108. % }: j2 M8 S4 k. b$ A
    109.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* {. \6 N: [  p6 \+ P# d
    110.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    111. $ _0 e5 j+ y9 t! `3 w- d4 Y& f, X- F
    112.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)3 a- b; G8 Q4 [1 j
    113.                 pa=pRealArray1->Array;: ?4 s% y4 p8 t6 Z
    114.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;1 M4 v$ T8 {% |1 H3 V
    115.                 for(i=0; i<m; i++)        //输出矩阵8 \! j3 G* ]' M: p) S4 D! N
    116.                 {! {. \8 J  H+ k, p4 r
    117.                         pMessage(L"\r\n"); k+=2;5 j( t. b6 p2 S! G6 y
    118.                         for(j=0; j<n; j++)
    119. . @0 E( M& j% [\\" d% {% i: D; }
    120.                         {3 A. I+ f9 r) G/ y
    121.                                 _gcvt_s(chNum,pa[i*n+j],16);* \  D# D( y+ K/ W\\" [+ E
    122.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}7 y' h' _* M; n! d; C5 O
    123.                                 wchNum[u]='\0';
    124. 0 h4 h, {1 f' w, G9 e
    125.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    126. 2 k& j2 Y7 h\\" [9 d8 ]3 b9 a# ]+ p; r
    127.                         }+ x& E1 Y. X) n4 c2 H9 d7 u  k( s
    128.                 }
    129. 7 N5 g7 Q: Q( m$ Y2 I7 u
    130.                 pMessage(L"\r\n"); k+=2;1 F) l# f5 q* J! O9 G1 F
    131.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    132. 3 ~0 o\\" b+ w' d9 \* a% }
    133.                 break;* m9 u- l$ K2 @$ c
    134.         default:$ r7 z9 n7 H+ q% c2 M. s2 W- V
    135.                 break;: e* v  F! _  u( z' J
    136.         }
    137. \\" T  ]2 X& X* B+ `
    138.         return a;
    139. . s) S* \- J. X7 {
    140. }
    141. 3 d# A& V; Z\\" R! p* C1 M! ?
    142. void main(void). c, Y6 U( ^8 t\\" n% y% O( Z
    143. {
    144. ; S% i6 [+ f4 A  K7 W; ~' v8 ^2 X* u
    145.         void *hFor;                //表达式句柄: z1 Q/ d, U! ?* U\\" I0 u
    146.         luINT nPara;                //存放表达式的自变量个数
    147. * p8 q+ M7 n+ k  w0 w$ |
    148.         LuData *pPara;                //存放输入自变量的数组指针
    149. * N3 Z8 j6 t% _; Z' b' U
    150.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    151. 9 L) w\\" a1 x% U# m, m, d9 q# ]
    152.         int ErrCode;                //错误代码
    153. # @\\" |$ N\\" D  I7 b# P0 H8 Y
    154.         void *v;: R& x\\" x& \. Q- y; Z7 C$ ~& r, q
    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.]}";//字符串表达式,矩阵乘% V6 _* ^) X3 L
    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.]}";//字符串表达式,矩阵点乘
    157. $ f; A1 m1 U8 q, u0 t
    158.         LuData Val;, K5 |( H+ j1 }- g' G% t, ^1 t\\" o
    159.         if(!InitLu()) return;        //初始化Lu
    160. ! W+ i  ?/ @# F
    161.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    162. ) ?4 P6 Z1 w4 b
    163. , [% f* I. g! R4 A
    164.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量  }- \, V7 z. A* p; x
    165.         SetConst(L"matrix",&Val);        //设置整数常量. ]- ^- B' o! }1 A5 B2 p
    166.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    167. 4 y* Z5 D0 p6 i$ z
    168.         wcout.imbue(locale("chs"));        //设置输出的locale为中文0 m5 K7 f7 m+ z, K2 r- R; O
    169.   9 |6 T1 H, z/ N/ ^' @# Y5 h5 F
    170.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    171. % N  F) J% p7 s5 ~
    172.         if(ErrCode)4 c) v5 K8 J* @
    173.         {
    174. 1 `/ [3 R2 X& h0 c1 y
    175.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    176. 9 }* K6 }: O3 w& B
    177.         }5 O+ Z* |: b1 ~: X' D% t, V
    178.         else7 @1 O* K! k\\" ]$ G4 t
    179.         {
    180. - v' t. Q0 x- x( o8 K+ t
    181.                 LuCal(hFor,pPara);        //计算表达式的值
    182. 5 N7 B& Q* x, H& c% f8 a
    183.         }8 s: ?9 b% L, n! m
    184.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用9 y$ w- A  u4 }* m
    185.         FreeLu();                        //释放Lu; s( O4 g3 w- A$ h0 O
    186. }
    习题:
    8 J+ N: G  D' r
    3 p& j1 C# b9 b$ D, n, f+ Z: l    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 9 }" B, [, ~2 M% R1 G2 `. a

    1 |: S( b: ^  T) i' D    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=, q  c; y2 T) n% K
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],1 H& P7 M6 D. D4 Z* Y# K0 q2 W& F
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      7 Y& G9 m9 e1 n( T; s3 b2 S* L
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      $ D( m( b0 d  q; z$ ^& @7 U
    5.     t=clock(),
      + ?2 g& v\" b' I5 ?& j
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},/ a+ |6 v\" O, _6 t
    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.9 s8 n0 `* H6 J7 m9 C% L
    2. 5. 4.& ]0 i; a3 o5 x% J$ C4 @
    3. time=0.875 seconds.
      - \, A$ Q\" x* d8 N! ^$ w9 q/ ^0 Q
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      1 b1 f# H) E* B9 D
    2. b=[2.,1.;1.,2.];! ]) T1 G5 r4 Q5 _% p( }
    3. c=[2/3.,-1/3.;-1/3.,2/3.];# @- a  X/ L\" e
    4. tic,
      0 `! T+ Z0 p  o4 _1 P
    5. d=a*b;
      * M9 G& v) u. Z! V
    6. for i=1:1000000
      + U5 b, b\" P( h4 y+ s' w# j, e$ E( t
    7.     d=d*c*b;- y+ x; N& }# v& d% q
    8. end% M' e; h/ @+ ^- a) R. b0 B
    9. d,, j; E' X+ W7 U
    10. toc
    复制代码
    结果:
    1. d =
      * \& B3 [4 S1 U* S$ K3 C
    2.      4     5
      + @6 i8 ]* G! ?! Z; Y. h5 r
    3.      5     4
      - x5 B- R/ ?( p; `6 s; Z4 j
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    . z! G& |9 c' M; I8 q- u
    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-4-10 04:07 , Processed in 0.328911 second(s), 53 queries .

    回顶部