QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8814|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。/ u$ a7 {3 |1 K/ d
    % a. W" ]6 r" b7 Q/ ?& K0 ~# J; @0 d
        基本要点:
    + g$ S) c. y0 `, P' F; ?, [
    * A) U5 q' u( j0 H    (1)为扩展类型matrix编写运算符重载函数OpMatrix。% C; R7 _+ y) _; W! {/ E+ X8 U

    * a/ A. v/ v3 ?- }" i6 G* M9 f    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。- L, r. I+ w! @! v$ v

    7 E/ P3 P6 R0 Z4 F  l6 }    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    ; Q1 y4 V0 l6 Y- f7 ]/ M) A, ?% y
    7 o8 l) E" M6 c/ D/ X  Z, ?; F    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 2 g$ N& C$ |- ]. Z! ~9 x- D
    3. #include <iostream>8 i+ C3 v/ l0 T: V, E; X( {
    4. #include <math.h>
    5. , d& ?8 W/ R\\" y0 ^/ ~( `
    6. #include "lu32.h"  ~# Z+ a# a8 ~% t3 r) y

    7. / k; N7 k( {4 K\\" L: O
    8. #pragma comment( lib, "lu32.lib" )
    9. ! t& y7 Q- L: J# I7 @- M
    10. - X  t1 P4 g, T' j7 F
    11. using namespace std;/ h6 m# a9 }0 Z; E

    12. & O\\" g& \+ ^$ M
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定\\" Y# D4 t. p0 J2 |# ?
    14. : X! y1 I) B; y
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 3 U, q\\" D+ a/ d7 s! [
    16. {
    17. 7 m4 i( k) o) P: P( Y3 Q: N
    18.         wcout<<pch;
    19. 4 ~; |* Z: O; ~) U
    20. }
    21. 7 ^# p! ~* m% @\\" h  m/ m: z3 D
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    23. + z$ X3 }: _2 M& A8 @4 F
    24. {
    25. % s, K' f- A, c8 v8 N* e1 M& x0 _
    26. }+ c( G; x  t8 f3 E
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数5 f. c& K$ E' ?! S$ u% N
    28. {! P; |, N7 {; w
    29.         LuData a;! }2 G# U# z' s2 h
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    31. ; O1 \/ f8 g7 e9 G\\" _( F3 }
    32.         luVOID i,j,k,m,n,u,v;
    33. 5 i) W, P6 e8 M\\" W; w\\" s
    34.         double *pa,*pb,*pc;- \) M9 l8 H, v, j5 \2 m) Y
    35.         luMessage pMessage;2 A& X! G8 {2 K% s
    36.         wchar_t wchNum[32];. ?( R+ g6 v- X
    37.         char chNum[32];  L1 a% l+ i: a$ I: v
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    39. & p2 D$ P' a( {
    40.         switch(theOperator)
    41. + N( N: s) `# }! K7 E4 L
    42.         {3 G# }% U  e: H# {8 G
    43.         case 2:        //重载运算符*3 |9 }! @* N& R4 y0 S' Q0 J/ o
    44.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    45. : m7 i\\" q9 j5 z0 Y$ D9 Y0 v
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    47. 7 \$ `- f: |+ G, U- M$ G
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组- |  ]1 i) P) w; M+ c
    49.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)' m1 X& h& H  I9 [# C\\" `
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配  Z- P( F+ L' \: t( N8 p+ r
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象9 [% O\\" @# K* B  e5 {; m\\" Y
    52.                 if(!pRealArray3) break;  k; \5 ?$ Z3 z
    53.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    54. & C2 h* e+ g* A2 e( |
    55.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    56. + \! k: d4 y9 I6 W; z1 Q% A3 D
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];% Q8 f+ N\\" g3 }6 r
    58.                 for(i=0; i<m; i++)        //矩阵乘  G/ n$ o- ^. p, {
    59.                 {
    60. ) ~9 p9 }/ g9 T) A4 G0 k
    61.                         for(j=0; j<k; j++)
    62. , f  d8 g, P8 r% L, G
    63.                         {
    64. 2 X; H0 o3 @\\" C' |
    65.                                 u=i*k+j; pc[u]=0.0;
    66. & N, c4 }1 o0 z$ {: N) N8 y
    67.                                 for (v=0; v<n; v++)
    68. ( t9 v2 Q9 q  u$ ^- P3 I* h3 O
    69.                                 {
    70. 4 M% \$ W\\" @9 J, P6 n3 z% Y
    71.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];! W. c1 a! P+ g$ `; ]: U8 }! u
    72.                                 }: L' M/ Y! X7 O0 e. A
    73.                         }
    74. 0 `( I# `/ @2 Z# D8 z5 Q0 t
    75.                 }
    76. / M  Y; k5 O7 k
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象\\" t, Q7 t2 W: @5 j( C
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79.   U! `1 G0 O. a0 d) h$ M0 ^  y
    80.                 break;
    81. % V' U7 n$ i) @( V
    82.         case 25:        //重载运算符.*
    83. ' N- @: g& Y7 Z$ Z' D6 e
    84.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    85. 0 r: `8 h# u1 o, @
    86.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);1 I  I9 f& J% L3 X& u, ^# n
    87.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    88. 2 o0 J4 F- p' \/ M
    89.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵), C) t2 I$ P$ @2 ?5 S3 C
    90.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    91. ' D) z+ b' D  s1 S# ?
    92.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象- K, ~0 ?\\" I9 K' ~! M3 \
    93.                 if(!pRealArray3) break;9 N\\" @$ P! ?7 I# H
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小0 ^- _5 F, k' a
    95.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    96. ; m7 [% k7 I7 |9 q8 y2 e! E. I8 W
    97.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象: L4 @\\" \0 w/ a2 z( u
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;) a& R5 I4 W5 F5 R  P( c: H
    99.                 break;
    100. . T) h  m( z) d+ x7 L
    101.         case 46:        //重载函数new- `7 K! r) }) r* Z$ o( }8 x; \0 q6 L7 w
    102.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数, i% A+ q  D$ G, }/ C% ?: ?% b& i
    103.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    104. 4 d- U! W3 W/ g1 D( L8 H9 E
    105.                 break;  a9 m! X2 q) S
    106.         case 49:        //重载函数o
    107. ) C5 p0 G* [, b; \0 j. E- T
    108.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);2 a) x$ f2 s$ M+ L9 W7 L# a
    109.                 if(!pMessage) break;) \. v, |, |/ b- z2 W
    110.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    111. ( a* K1 e1 h5 w, l- X
    112.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    113. ' |\\" ~* U0 ^8 Q$ c; b) k9 \. @9 J9 C
    114.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    115. : f, f6 i8 u4 E3 N& i7 q2 w: C9 K9 x
    116.                 pa=pRealArray1->Array;7 q2 V( {/ g' {' P  y6 @5 Y; S
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;\\" [1 Z\\" Y+ ?, ~, l! K
    118.                 for(i=0; i<m; i++)        //输出矩阵0 I( w. W; Q: O' ~9 k
    119.                 {
    120. 6 v& L6 f3 j/ ?: c' Z6 d# R  j- [
    121.                         pMessage(L"\r\n"); k+=2;
    122. # U2 }$ ^2 ^7 C8 e! s
    123.                         for(j=0; j<n; j++)
    124. $ Y* `8 [8 O) V! _5 o
    125.                         {\\" W; x- w* u: @$ f\\" {# I
    126.                                 _gcvt_s(chNum,pa[i*n+j],16);/ Z; M; `\\" @& e0 D
    127.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}. ]2 k( Q\\" D% I- E
    128.                                 wchNum[u]='\0';' D  r* O0 d/ R- _( L
    129.                                 pMessage(wchNum); pMessage(L"  "); k+=2;- J) D7 {; T9 e9 O: ?
    130.                         }
    131. \\" d$ @# U' z! m4 q# U) \* g
    132.                 }9 k9 s+ a$ W, `
    133.                 pMessage(L"\r\n"); k+=2;  `- ~* Z/ G\\" g! F8 ?# A7 b/ x4 Y' M
    134.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    135. $ ]: v\\" Y9 ?* n9 l$ }
    136.                 break;0 W2 d( o# Q- t3 k. c
    137.         default:* x8 Y1 W\\" A. ]0 o. _2 b
    138.                 break;\\" o$ n2 ?: {8 R/ K
    139.         }5 v4 O5 H8 s9 l
    140.         return a;& N) A\\" p' |( m. D6 N+ l\\" }
    141. }2 O2 {1 Y3 Z/ s( Y! r9 @
    142. void main(void)
    143. + h' Z1 M9 @' f7 Z( c7 a\\" [9 G  M
    144. {+ Q4 @4 n) k/ m$ X2 u
    145.         void *hFor;                //表达式句柄
    146. . a/ s  y3 a2 |7 W
    147.         luINT nPara;                //存放表达式的自变量个数
    148. / t/ r) {$ a, O, l4 Z0 L0 ?3 v
    149.         LuData *pPara;                //存放输入自变量的数组指针
    150. . R9 @\\" L1 D5 k! V5 N5 W1 d9 z
    151.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    152. $ |0 |! ?7 f- b3 C9 P. U
    153.         int ErrCode;                //错误代码) d4 T. N6 j! O, F5 w! n
    154.         void *v;
    155. + w6 z, J: r6 V\\" P/ e/ H+ ~
    156.         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.]}";//字符串表达式,矩阵乘
    157. % ]9 K* V! G% v1 o4 b# }
    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.]}";//字符串表达式,矩阵点乘& U+ V5 l  y7 ]6 z: x
    159.         LuData Val;
    160. 1 U: H8 \1 R) j8 A, U8 t7 M2 \7 s0 U% ?* z
    161.         if(!InitLu()) return;        //初始化Lu6 Y& N  I8 y7 U* T+ L0 u
    162.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型1 M. Y2 O! H' d\\" E; V' f$ ?

    163. 0 j: P8 ?  {4 K& d5 L, O
    164.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    165. ' c2 q' P% ]3 W, v- a0 s8 d
    166.         SetConst(L"matrix",&Val);        //设置整数常量
    167. 0 Y/ |+ ~: m' E8 @  k( v$ S
    168.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    169. 2 X  w6 M3 u+ L) a+ O
    170.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    171. , h4 }\\" H\\" l% v- d4 A$ k
    172.   6 L; H' \' q& G7 b5 A% F$ K
    173.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式. H) I6 R1 M2 }! H0 k- L1 q* Y. @
    174.         if(ErrCode)- X# E& I9 I1 A# P! ~% G$ g; F/ }
    175.         {, q# B\\" I& e0 V) s) ]
    176.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;2 b  M' c- v7 O3 p
    177.         }& T$ S2 E) T- [6 {( c9 t
    178.         else3 w) e8 O& W  T\\" s' c* O; Y8 o/ v
    179.         {2 t7 d6 z; A) k% m2 L7 _6 S
    180.                 LuCal(hFor,pPara);        //计算表达式的值6 u+ r. {, @3 B! n& Y( P! K
    181.         }
    182. 0 r0 c2 {$ j4 E1 G( L5 b$ s) F, v4 P
    183.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用$ r9 S6 ~\\" m! R\\" f
    184.         FreeLu();                        //释放Lu% b; x\\" ]0 m5 u: u  x
    185. }
    习题:' S5 Q- V3 h2 e$ K
    0 T( E1 |  ?/ x
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 & O3 h. i: m, \5 e, s
    3 m# d2 ]) `- Y- C' M
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=  k: o\" Y0 |# W) `: ^
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      \" {: ~/ `8 G1 i# {8 L& S. N
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      8 F' ~) y+ A# B\" ^, G$ a
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],8 \* \3 @9 L4 ~. \; j6 u8 i8 x1 }6 g
    5.     t=clock(),
      4 C4 A* @# p, ^5 t& \
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      0 U. V; |0 R$ E8 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.9 U; A+ x/ t* X9 k; m) J  ~$ F
    2. 5. 4.0 ^\" ?3 N. G6 J  f6 J- N, i
    3. time=0.875 seconds.5 e; m4 J4 a' Y4 a3 ~, f  }; S# x' E* Q
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];) Z; U3 ]) h# b* c! d7 u1 G: J, ]
    2. b=[2.,1.;1.,2.];* }/ }% i% t( o: @+ n6 C- ], @
    3. c=[2/3.,-1/3.;-1/3.,2/3.];8 ^' m: ]! d2 b, d  x
    4. tic,/ |0 E7 A# s! O. d# R
    5. d=a*b;. ]9 N. H9 N+ W, c! k6 t; H
    6. for i=1:1000000
      % _7 V- U  Y8 s/ d. ^4 {+ P# v! I9 _9 X
    7.     d=d*c*b;
      : R9 ^, `: |! X5 E) {% I1 {; A5 Y5 H: M
    8. end) H! i7 V* ~: D: ?6 A4 r4 H
    9. d,' u1 I\" s5 q& w
    10. toc
    复制代码
    结果:
    1. d =
      2 S, P: P! k( Q) S# d$ B
    2.      4     53 `  v! u/ }7 x9 A0 ~, H1 H
    3.      5     4* X- |9 c2 \8 H. x7 _! R
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    2 M) f8 @; ?$ G0 [# \
    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, 2026-7-17 09:58 , Processed in 0.508916 second(s), 62 queries .

    回顶部