QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8453|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    5 `' F" l- ?! w2 c8 N5 R6 k( I; g( P  }0 M4 n5 m3 C( J
        基本要点:
    * o. R. |/ e1 I, E2 D6 a+ S+ |5 {1 S9 _, S( f6 J8 r: g
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。. O' Q* c4 J* C% W1 s/ _: {

    ( J+ Z! |! `2 ^( n- v6 g5 C8 N    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    ; q6 U% C% T. V7 n3 j: {9 `9 Q. J8 _* j4 n, I; D
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    ; D0 b5 c1 Y) q( L# x- ^
      P0 A. w4 E! t) O: S    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. - b/ v1 S6 ^+ V7 J4 ^1 t6 n
    3. #include <iostream>9 z9 D1 `! k\\" v9 G8 v7 z- g
    4. #include <math.h>- W+ V\\" D0 ?5 ?9 d1 b1 p% m/ e
    5. #include "lu32.h"5 C; N/ W- U! n3 \2 u4 P
    6. 9 P  Z4 M- @+ f! R
    7. #pragma comment( lib, "lu32.lib" )! l4 h7 `% }: p5 ^- Y7 b
    8. * m7 T* S\\" F3 N  a
    9. using namespace std;
    10. 1 A- q, Y. C4 `1 G9 p: l- T

    11. 0 j8 i0 e% k5 Q+ B) I
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定; }\\" Z6 V: n: i  Q3 x
    13. + Z! r* o' a. y) ]
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 : b\\" T, G% w  |, Z
    15. {% h# J6 E, T# D% N# f
    16.         wcout<<pch;: h; Z8 ?2 l. j+ g
    17. }& T6 @# [; p# O! A2 m
    18. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做2 p( L3 e) n7 H; `# K
    19. {/ z% }# C4 I  N- G
    20. }# @. C1 }& D: k\\" Y% t\\" B( v
    21. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数. ?0 d6 z2 n8 t& o& [- C- [0 [0 s; {
    22. {
    23. 1 `. x+ W+ P$ }  j1 x
    24.         LuData a;8 a5 e2 G4 O) ^- z+ v
    25.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    26. * }  j2 g  o  H4 T9 S* S
    27.         luVOID i,j,k,m,n,u,v;
    28. , c) B; O1 v) i3 f
    29.         double *pa,*pb,*pc;8 W8 C9 w  _5 Z5 g8 x
    30.         luMessage pMessage;7 S5 b0 y) Z\\" }0 c
    31.         wchar_t wchNum[32];
    32. & n+ j+ P, W# x# T4 C
    33.         char chNum[32];
    34. 2 w; u5 X* A2 y5 X, |* F
    35.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;, _% @3 N% |2 `: Q
    36.         switch(theOperator)2 q0 T. V& _7 N\\" `+ m
    37.         {- E# }0 z4 N/ i* d1 b2 V5 @* S
    38.         case 2:        //重载运算符*
    39. * a. s. b! f9 O' O\\" M
    40.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);# i2 X/ K9 k) t$ {. }! @\\" r
    41.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    42. 8 _3 {6 Y& o; k+ s; A' ^) F
    43.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    44. & N# h  M2 s- J
    45.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    46. 4 l( m7 a) G/ Z$ ^. H! M; y% [$ O, i
    47.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配4 J7 M* }+ h2 [/ ^6 t* x
    48.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象1 V' p1 z6 V* |5 i& }$ x+ ]  l
    49.                 if(!pRealArray3) break;( Y\\" R4 e1 E1 j; P
    50.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    51. 9 k* z* [6 X. u  w& o1 s8 f
    52.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;4 N) ~( I$ \0 K0 D
    53.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];9 ?3 s3 p2 x( a. A8 z8 \& P/ ^+ u
    54.                 for(i=0; i<m; i++)        //矩阵乘
    55. - P, |3 c2 J: K, x7 r
    56.                 {) Z' c( _; A\\" x  B
    57.                         for(j=0; j<k; j++)% y7 ^3 a, ?2 t8 X' `
    58.                         {
    59. ' }3 e4 C' E* B) A5 U& x( _# x
    60.                                 u=i*k+j; pc[u]=0.0;
    61.   w1 s4 X$ p; \  b- w0 ~
    62.                                 for (v=0; v<n; v++)
    63. : j7 u( l' b$ z' R! _: {
    64.                                 {
    65.   C/ T: f4 r3 n5 O; }! z+ r
    66.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];. B. T! S. K& e+ h9 M: P9 i
    67.                                 }: f! w1 ?5 y2 ?$ s* A4 r& H
    68.                         }5 h- k1 l# e. Z
    69.                 }# i6 s5 V+ L7 k6 O# m! i  G
    70.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象; I\\" a\\" u$ ~3 @/ m2 W
    71.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    72. 9 Z* g8 E4 H; W2 \5 \9 h
    73.                 break;8 a\\" a1 g/ k- U& G5 Z! R* j
    74.         case 25:        //重载运算符.*! E+ s\\" K# p6 x/ T
    75.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    76. 3 D4 f% ]9 Q8 u2 A( i
    77.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    78. ! w% i) F' h7 s7 G5 T/ `# k
    79.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组( e# W: T  a  B+ `2 ^3 v$ G
    80.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    81. ; u: o1 d9 I2 ~3 {
    82.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    83. \\" }' l2 P0 d. O; M
    84.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象* h. k\\" Q1 M3 [5 [6 i\\" o
    85.                 if(!pRealArray3) break;
    86. - m% H2 N5 w0 z* U
    87.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小. [3 U& p% ?# c: b
    88.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    89. 6 n) O: P9 H, K
    90.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    91. . x& j4 }! X: J5 I2 b: E
    92.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;6 T. w2 R; H( N9 _$ D8 @
    93.                 break;
    94. ' ^3 _9 a2 |% h4 E# L; C2 v! Z
    95.         case 46:        //重载函数new& ]* _( V9 H8 f\\" f/ i
    96.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    97. $ q9 m/ n* N  b$ B/ S
    98.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    99. ; q/ Y1 B8 U  X% e$ P' w
    100.                 break;' \5 Z& Y\\" ^( B% o3 i/ q
    101.         case 49:        //重载函数o# K/ F% C6 e2 w4 A4 ]
    102.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);7 F# V\\" g3 w3 o5 x4 r6 f6 N
    103.                 if(!pMessage) break;
    104. 3 v( w$ N+ _, q; Q
    105.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 w  ?) S\\" n3 {* O- a/ C
    106.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    107. \\" Q\\" P' d  K) l* J% Y
    108.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    109. : o: J5 M4 n. V7 r
    110.                 pa=pRealArray1->Array;
    111. % ?* Z+ Z( d; x9 @
    112.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;3 Y! c& Z# D7 R& A$ w
    113.                 for(i=0; i<m; i++)        //输出矩阵
    114. 2 b$ {6 [9 I- n
    115.                 {
    116. . ^) h, f5 R$ ?5 V9 @
    117.                         pMessage(L"\r\n"); k+=2;
    118. & W$ A% L: A' ~1 s\\" f
    119.                         for(j=0; j<n; j++)
    120. - W/ y/ `) o; C4 ]! y2 I7 U
    121.                         {- l% z( P# x2 a
    122.                                 _gcvt_s(chNum,pa[i*n+j],16);9 F  D5 k$ M; j2 J
    123.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}/ V4 n- [& I2 X
    124.                                 wchNum[u]='\0';& v5 I4 q* |9 s
    125.                                 pMessage(wchNum); pMessage(L"  "); k+=2;8 e, C/ @6 u9 r1 ~
    126.                         }$ ]! U+ V4 [: k
    127.                 }9 H1 A- t' M( R
    128.                 pMessage(L"\r\n"); k+=2;7 H3 z3 O4 R: }& l\\" q7 z3 B/ j* k& e
    129.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数# D4 d; ~/ T# \/ t: M9 g
    130.                 break;
    131. * V; ~- O5 n  v0 [4 E
    132.         default:
    133. * L\\" _! m1 {: a8 a
    134.                 break;
    135. ! P! @2 s4 u( L/ W; b5 E/ c
    136.         }, K. b$ \: i( T+ M+ s
    137.         return a;* p% }\\" v; U5 I& ~+ j$ x: Z
    138. }
    139. 0 `% C+ M7 {2 S! Z% G3 @' r
    140. void main(void)
    141. 0 E5 U4 \! O5 D6 K! I0 v
    142. {/ c$ L0 i; _& z* i4 j3 s\\" _5 V
    143.         void *hFor;                //表达式句柄
    144. ' ~6 I5 T$ G) S) \3 p
    145.         luINT nPara;                //存放表达式的自变量个数
    146. , k4 K( w0 U6 q\\" x3 e4 i( _1 y: t
    147.         LuData *pPara;                //存放输入自变量的数组指针
    148. / I* Q) I+ g2 [7 d- F
    149.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    150. - t$ ]  g7 }- g* k8 E7 N
    151.         int ErrCode;                //错误代码0 X4 a6 s$ |/ \9 J+ Y1 D
    152.         void *v;
    153. % ^- s' l5 `# ]# [8 X
    154.         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.]}";//字符串表达式,矩阵乘4 \\\" a4 t; [* r) {6 m
    155.         //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.]}";//字符串表达式,矩阵点乘( O6 U6 a; z3 q* r
    156.         LuData Val;
    157. : L  `: b- ]$ g* ^$ @* j) I# A
    158.         if(!InitLu()) return;        //初始化Lu9 m, j: y% N9 Y$ c
    159.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型& C4 d! I; |8 w

    160. , u! `7 u  g) a6 D
    161.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量3 [- S, R9 b& p9 K4 U
    162.         SetConst(L"matrix",&Val);        //设置整数常量
    163. 7 I) c& _# N! D
    164.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息/ c3 A2 R5 N* s! p# ~/ Q: y4 h# Q
    165.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    166. & b: v) U! ?' z& S
    167.   
    168. % s' V) }. N+ @
    169.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式# e1 s! W( f) p+ O: m% ^/ W\\" s8 o
    170.         if(ErrCode)* R( U% W7 d: i1 U8 {
    171.         {* }9 j6 |# _1 ?4 c5 [) _
    172.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;# _5 `7 `  A6 F' l$ z  ~$ O( P
    173.         }8 R' F# o, _/ u1 ~0 Q
    174.         else
    175. - g5 B7 V/ x! W
    176.         {
    177. 8 A4 x9 X2 [1 V
    178.                 LuCal(hFor,pPara);        //计算表达式的值
    179. ' f1 v5 w\\" U. s% e' ~2 a* M
    180.         }
    181. . j8 h: g9 V\\" u/ i% a
    182.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用+ X/ F# ~$ A/ x( t% i
    183.         FreeLu();                        //释放Lu
    184. 5 F. ~5 y5 \  y( m/ ]' c3 r+ V$ `
    185. }
    习题:
    6 G9 _5 I9 A) D. ~2 e+ q% J9 x- W: q7 Z
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 8 F& b8 k" S; F& z; @8 V

    3 X4 T8 z6 W9 S2 n  a' m    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=4 G$ @: q% r% z- u5 T
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],6 L# b  }2 D6 ?% F, z& P
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      \" t2 j& A$ D7 w- }3 L
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],, G2 D2 M$ |! ~, n% Q# T
    5.     t=clock(),. z% {! r/ X# u: o7 o; }
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      ! J3 S& L4 _0 A  u7 ^' f/ R
    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.
      : B3 H8 ]0 d0 y& z. S4 Y
    2. 5. 4.& l5 y$ b4 _9 Z4 f3 x: v; u* p
    3. time=0.875 seconds.
      7 r# k5 }' [; P1 ]
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      ' p8 G4 c3 _6 }) I
    2. b=[2.,1.;1.,2.];
      ! X- L+ z) X! G* G' Z7 n
    3. c=[2/3.,-1/3.;-1/3.,2/3.];7 [* ~7 k. m- g9 j& ~\" D
    4. tic,
      & {& @; T* t/ _/ j, l
    5. d=a*b;1 k+ b. ~$ S' H+ u
    6. for i=1:1000000+ r4 `4 Z0 ]5 Z8 S% ^2 I% h$ ^
    7.     d=d*c*b;
      1 T3 _2 ^; F4 U4 e
    8. end
      0 U  E6 |$ e7 t% g4 B! I( U2 ^
    9. d,/ T' |\" O7 D( n7 E/ }
    10. toc
    复制代码
    结果:
    1. d =\" ?! b, C* O- q. F
    2.      4     5
      , A$ I0 U) U/ Q& [( S& D
    3.      5     4
      . |* x% F6 x* V1 C
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    $ Q; i( k  i3 `. N% m( ]
    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, 2025-9-15 13:48 , Processed in 0.629470 second(s), 55 queries .

    回顶部