QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 7572|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    8 l% p0 [* q( C! [: }4 K( i3 ~' d$ z& U! @
        基本要点:
    + f4 C4 A. {! }+ u) K7 F5 `) w! `! e1 k
    + }3 k- s8 }( q9 ^4 p+ `    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    ' v' a% N" G' j7 V2 p% f  W( h
    - u2 S: Q: c, S  O0 [/ D# K    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。5 {4 ?8 c$ g; j2 h5 i0 s, h; V8 G( L
    ( D( n2 n: u( b# W, h' g
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。  y, V3 H/ J( }9 R8 l$ z4 v

    3 `! m) R% ?* P. ^( U; z    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. ! s( W; ^. o0 `/ s
    3. #include <iostream>
    4. # U$ A. ~9 S, P' R\\" t& q, O1 L
    5. #include <math.h>
    6. % s8 @) \0 Y/ b
    7. #include "lu32.h"
    8. , b3 h3 c7 F/ S* y- D

    9. 3 ^& h0 k& [! A\\" P& w* M% C
    10. #pragma comment( lib, "lu32.lib" )! \5 A; D( v$ @

    11. \\" Z7 z% V' s2 V0 u# I  n+ b8 S
    12. using namespace std;
    13. $ v0 k4 M. ~( |# t
    14. ) c1 {\\" R  U# Z
    15. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定3 f& B# W9 a, m  I. v' z

    16. ( W& K4 t; \( L+ ^8 }0 Z. J7 s
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    18. % ~. w# m  M, j# J
    19. {
    20. + `- U% F8 C1 d1 B& I
    21.         wcout<<pch;! }  P& e3 r& i
    22. }
    23.   s. Q; o' x  s. W
    24. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做' ~% C% k0 y( w7 P  p
    25. {- U  ^  ^1 z0 n! A, q
    26. }! l$ N4 |- w  j+ t$ s# H
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数# C- O( x& f2 X) Z, T# F/ c# R$ s
    28. {
    29. : W% `' p* b4 e- n* n\\" O5 J/ [
    30.         LuData a;- E4 x) g6 m+ l- ?1 y
    31.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    32.   T! \9 F3 K! t
    33.         luVOID i,j,k,m,n,u,v;) U; Y7 ]' q0 T4 u1 x8 E
    34.         double *pa,*pb,*pc;# |6 V% D0 k) T. o
    35.         luMessage pMessage;
    36. / _$ _5 E) P6 f# A
    37.         wchar_t wchNum[32];, F3 F3 G' j+ v% b- U& f% c
    38.         char chNum[32];
    39. & ^1 K/ B1 {9 V+ [- ^: Z
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;+ I! T% C' u& v( J1 O& m
    41.         switch(theOperator)6 D. E* y( h, I1 y
    42.         {% ~0 B9 x* v' ]& \$ A: x% n7 [
    43.         case 2:        //重载运算符*
    44. & k# u: g; m/ k# b$ H7 W. G9 X3 @
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);5 W( K, a, {2 T8 g
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    47. 4 p+ ?: P) B& r2 ~* e2 b8 t
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. ! u+ e$ ~) p' L5 E- Q
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. & O4 s* G8 \$ z2 U/ j
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配) R) P& K2 }/ L# [2 D$ _
    53.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    54. 3 A; \& x9 Y1 d% v5 k. }
    55.                 if(!pRealArray3) break;
    56. * k# o; z4 H! w- ?
    57.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小6 L! a2 I6 U* m, U& u
    58.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;8 B7 V* l+ W$ ^# j, k
    59.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];) i( ~2 _- P6 m/ g
    60.                 for(i=0; i<m; i++)        //矩阵乘\\" y3 v% Z  c$ J\\" H# i
    61.                 {
    62. . l# X4 k& J  d. s; l3 y' m& y$ e
    63.                         for(j=0; j<k; j++)6 H4 e' ~\\" K5 I' D2 L! u3 ]% O
    64.                         {
    65. \\" N8 J. F2 Y8 Z; H! ]
    66.                                 u=i*k+j; pc[u]=0.0;
    67. , O. b; ]\\" U$ D3 A1 z5 {6 U
    68.                                 for (v=0; v<n; v++)
    69. ' b; i/ q' q/ W7 V% E- z
    70.                                 {! e* k4 V; h( ?2 \0 X! A4 k
    71.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    72. 7 ?( y' T4 m& U\\" H8 j( n5 [1 J. R
    73.                                 }1 |  r, \! t5 `9 [\\" J0 n& U
    74.                         }
    75. 9 \# W: ?- L1 l' \
    76.                 }, U9 {& T+ V; R) t+ `! o\\" i) h
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象\\" Z8 X  H/ b0 u
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79. 8 L* I$ @5 o& g& J( |
    80.                 break;
    81. $ c$ l& K/ X5 l1 Q! L+ T4 K  ]- E\\" ?
    82.         case 25:        //重载运算符.*7 D7 |7 L) s8 ]) k/ W) |/ T) ]
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);6 e4 B# n6 [# w  B
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);\\" h# {8 x* [% K8 d* Z
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    86. ; a& v  W/ m3 v/ L
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)3 T: U- Q: c( ?\\" y3 W% W
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同* p% l; D# n2 ^
    89.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    90. 1 K  E# b. D0 L: T8 D$ q2 E
    91.                 if(!pRealArray3) break;
    92. - H$ D1 n% H& P\\" m6 u! N. }. _, |* M- J
    93.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小; K! A5 ]* V- {# c1 g8 k
    94.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘\\" J) q; I9 W$ ^& q! z
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象6 y$ K) `& a! v' V
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    97. + y; H( S2 C% _7 Z- F+ M5 o
    98.                 break;
    99. ; L) G' g8 a8 ?! W
    100.         case 46:        //重载函数new
    101. ( J3 ]  Q5 T2 V. ^2 t  a
    102.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    103. 2 Y5 P9 f6 I$ n) U
    104.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    105. , C8 `( Y' ^7 S# E
    106.                 break;; e8 H\\" I% d( u, r3 ~9 Z; ?) q+ ^' ?( {( \! D
    107.         case 49:        //重载函数o
    108. 1 F( O. f9 d\\" D, }2 p9 H\\" W% M8 Z
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    110. ; J0 l9 |9 @9 Y
    111.                 if(!pMessage) break;
    112.   M* G- g: V  C8 k4 b( q3 g0 S5 H
    113.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    114. ) @9 N- D! E( x
    115.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    116.   f9 e1 v: V3 J& J* N& O
    117.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    118. 2 h* n' S\\" k, V! A+ b* ^2 a& v
    119.                 pa=pRealArray1->Array;1 x( _( ~' B- V* J
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    121. 2 U* y+ l% @9 `6 Q# w& O( W  Z2 q, [
    122.                 for(i=0; i<m; i++)        //输出矩阵1 W5 e9 Z& k3 l8 b
    123.                 {
    124. 8 m6 U% l8 I: t, Q; B8 ~: p5 \
    125.                         pMessage(L"\r\n"); k+=2;
    126. 6 b, g# ^2 ?- a+ T\\" ]
    127.                         for(j=0; j<n; j++)
    128.   a3 O% Y( ^7 x& [4 T\\" X+ c\\" R
    129.                         {
    130. 4 {6 \9 f9 \3 |. t( P& c
    131.                                 _gcvt_s(chNum,pa[i*n+j],16);5 E& Y/ B+ q* @5 j
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    133. , N: t6 N9 N/ n\\" Z( J( \
    134.                                 wchNum[u]='\0';
    135. , i; K% I. j7 w6 G
    136.                                 pMessage(wchNum); pMessage(L"  "); k+=2;+ n6 @3 {3 D9 L
    137.                         }
    138.   s1 j9 g! T. Y/ g; k0 G- G
    139.                 }
    140. * u/ @0 H8 U2 N( I' q1 V, A
    141.                 pMessage(L"\r\n"); k+=2;
    142. 1 Z8 Q' f/ e. n# E& ]
    143.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数( z# h; E) l9 F* j
    144.                 break;7 E! ^\\" p2 K6 G) [  W0 E
    145.         default:. ]3 {' q& W: [
    146.                 break;
    147. ' Q+ m  |  n  y; R# U# B
    148.         }
    149. + q- @% e; V* V& |
    150.         return a;
    151. % b; J5 M. Z6 e) Q2 D) \. e
    152. }
    153. - N: K: L& I5 r4 u6 {; N\\" ?
    154. void main(void)- ]3 \\\" _+ z$ v\\" y& \' H7 C
    155. {
    156. ! s8 L/ ?  m3 D9 f
    157.         void *hFor;                //表达式句柄3 L: l* w/ @3 C, r3 o0 W
    158.         luINT nPara;                //存放表达式的自变量个数
    159. : i  ~2 a  w/ a( H8 a
    160.         LuData *pPara;                //存放输入自变量的数组指针\\" n9 q* U1 x0 G7 z3 X8 l( R
    161.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    162. # f2 z6 ~+ p, ^3 [! z2 {7 k
    163.         int ErrCode;                //错误代码
    164. : ]9 J2 T& e- P: q  F9 G* `
    165.         void *v;) F3 _* U5 ~# |0 g' ?& k7 ^& n
    166.         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.]}";//字符串表达式,矩阵乘
    167. / D$ A1 |  N4 I8 ^  q, @
    168.         //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.]}";//字符串表达式,矩阵点乘
    169. $ @, M. y' U. q5 m% A
    170.         LuData Val;) C% v& j5 C, h  w2 t' M: x4 g
    171.         if(!InitLu()) return;        //初始化Lu
    172. , X0 O! ?0 v' u2 n. O; ?
    173.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    174. 9 o3 J: s! G: c+ I, ~9 `9 L( ]\\" v/ \

    175. + f' L7 c# J+ \- z
    176.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    177. 4 i. C2 a% Y5 y2 E( g. t0 g
    178.         SetConst(L"matrix",&Val);        //设置整数常量7 ]$ E% d4 D& Q
    179.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息* m  ?) j9 O& P( h& o
    180.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    181. - k( e8 B0 O! q1 ]0 l
    182.   
    183. ) ^/ |$ r9 N$ M3 N+ h
    184.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    185. # [& a' c5 f6 `3 w+ Y. k5 K
    186.         if(ErrCode)
    187. , g. b( j, L9 o
    188.         {
    189. + u1 O5 {( @. m7 q+ K4 z
    190.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;' y* O7 F; P! a4 _
    191.         }
    192. 4 g9 G' @: w8 X; Z3 y; _) o/ f
    193.         else; b' j( j* L$ P6 D\\" C+ ^
    194.         {
    195. 3 C9 s- c/ M3 c% Y2 e/ r7 t
    196.                 LuCal(hFor,pPara);        //计算表达式的值
    197. 9 }8 }# q& c/ `
    198.         }# U% N/ H# p. T/ V) W
    199.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    200. ! ~& m7 V- N# f\\" N
    201.         FreeLu();                        //释放Lu+ S, q: O1 h9 Q9 q, f- n
    202. }
    习题:8 w0 ~3 c. l- i* K& L
    4 c/ b9 A* V1 P' O. {
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    4 k5 O: X1 f. _5 C4 Z
    + l# P1 u1 f) X/ i( ~    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      3 A, S4 z! Y9 t8 G) d4 [
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      4 w) p0 J& I( F- P0 @* R
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
        x: Q: Y* ]' I: X
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],5 }6 d5 F; G+ T) K
    5.     t=clock(),
      & g2 a( ?+ ]* x! \
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      . u1 d/ C- @5 ?- }/ P/ C/ z3 @
    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.' Q% B3 f( W3 f# x$ n
    2. 5. 4.
      1 H* C1 Z& F+ B! i# w/ ~
    3. time=0.875 seconds.& M8 o2 L: W: _; p) y, U+ X9 W: V
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];* c/ [; `/ U( g
    2. b=[2.,1.;1.,2.];5 Z\" |, N$ k) P' d\" ]- _
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
        ?5 L/ T5 L  ^9 ~! t
    4. tic,
      % I+ I# ?# T# z
    5. d=a*b;
      - b) T7 \- e1 X6 e8 G
    6. for i=1:1000000% F% _0 R& r. e$ `' B5 x
    7.     d=d*c*b;
      8 k' a) v& A9 r* {0 w0 a
    8. end( i! k( M3 h, F$ K9 h* F. \/ |
    9. d,
      * c4 v2 }) I3 }* S1 J
    10. toc
    复制代码
    结果:
    1. d =4 z6 L, \2 J; S' Y' U5 t
    2.      4     5
      # F9 P1 R& C; j4 u7 t
    3.      5     4) r+ k- F* J, Y6 Q2 V
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    ( T3 f3 P$ L- J! z7 i" v" Z
    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, 2024-4-25 08:48 , Processed in 0.345787 second(s), 52 queries .

    回顶部