QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 7581|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    - n6 @& u7 n: y9 o! c8 ?7 }9 f- }* m' N+ P7 H! N6 ^$ H! E& P9 ]6 r
        基本要点:
    3 k/ e$ l) Z# r# j1 n  k4 T# ?9 L* Q# Z" z
    & b/ `0 K) R- M- W  D: O$ Z    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    ! \: D7 B8 }' E6 N5 v! `$ e! D+ z' P/ Q& X4 G: m
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。7 s, L* Y, s* j& W
    2 X: }/ w/ G, c" `. j' \4 E, J, V2 I
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    - C: c# Y$ e; W$ U# I
      m3 M5 G- r! ]5 @3 u    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. * z! V% g3 T$ J
    3. #include <iostream>
    4. 4 y# @; F% y( r. D\\" T( ~; Z
    5. #include <math.h>) V( B3 M7 Z8 v& ^6 a! N; T- Y& y
    6. #include "lu32.h"/ U  p4 {3 H# s) F1 l1 s

    7. . A2 u  M6 E1 G  d
    8. #pragma comment( lib, "lu32.lib" )' z. G4 w. y% Y) A+ U- C

    9. 6 X+ c1 h4 C/ u) t& B6 ^
    10. using namespace std;$ _* K9 |; }8 |# B* ]7 B  g

    11. % c; [+ |& j% [4 Q1 h( p
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定  S  `3 F% Z- i# Y' F1 x8 I0 M
    13. / D: _. ^) M& T1 ~8 A
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    15. \\" A( v, j' F4 d2 \\\" O  ]
    16. {1 y2 O+ b# M% K8 K0 u
    17.         wcout<<pch;
    18. , Z2 J' y3 N, n; K0 E
    19. }
    20. * A; F' \6 m9 ^5 D$ F% q/ ~; p
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    22. 0 a# U# ]( T( g* O4 U
    23. {\\" E2 R, ^$ L, B- j
    24. }
    25. & x) j0 [4 c5 U; `) ]
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    27. + q' S, S' I/ ?! C
    28. {8 K, w* g  ], d/ Z0 e' V& |3 C
    29.         LuData a;\\" C$ e/ P; X0 s3 N
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    31. \\" D\\" H& h3 x9 p1 s3 ]; G\\" [+ R# P8 \
    32.         luVOID i,j,k,m,n,u,v;& u) N( W! e' s6 a
    33.         double *pa,*pb,*pc;
    34. 5 p7 C' f5 }) ~: T0 d& T3 w
    35.         luMessage pMessage;
    36. : q1 H! M2 {$ Z9 u1 U
    37.         wchar_t wchNum[32];
    38. / m' b$ u* m& j% Q& s3 u0 {- \: \
    39.         char chNum[32];& r8 b' z3 K% l' \9 b
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;( ?. x1 D( C\\" n% B# l. V: ~
    41.         switch(theOperator)) C9 P; m6 p  E* c
    42.         {
    43. ; N. J2 J$ v& [( e, x
    44.         case 2:        //重载运算符*$ A2 P: v+ l8 a5 M9 |. x/ U( {: `5 H
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);2 [: z8 n5 V% ], m& X! M$ j6 H
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    47. % z. f; y, Y8 [, n8 N# ]
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49.   Q\\" |( I* D+ @
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. ; R\\" n7 w1 C# Z3 u3 O  U2 V
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    53. 8 J: N7 L- F+ J8 R
    54.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象  `9 ~+ D; u* G2 }& f; ~$ u4 n9 P$ _: p
    55.                 if(!pRealArray3) break;3 [5 S! s, |: G8 {0 h2 ^! Z' {
    56.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    57. 1 p+ w( k# G9 a4 U  o
    58.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;( w. o8 `; H4 {( v' N
    59.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    60. 6 |\\" _9 ~5 s) K. X5 j
    61.                 for(i=0; i<m; i++)        //矩阵乘
    62. 0 B% M: Y2 O8 a
    63.                 {
    64. 3 Q0 q5 u+ s: d7 z
    65.                         for(j=0; j<k; j++); a8 \: R1 v; }
    66.                         {& p8 `- t' ^1 X) @0 w
    67.                                 u=i*k+j; pc[u]=0.0;% `+ k# |& n/ d6 f, v- v7 m
    68.                                 for (v=0; v<n; v++)
    69. ( \0 _) f1 ~+ A# }  P
    70.                                 {) |1 G+ S0 ^3 V  z/ x
    71.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    72.   o. q8 t) H7 l% _
    73.                                 }; b# W& b5 t+ L# j+ n% S9 `9 t. ?
    74.                         }5 E3 j+ A1 S\\" Z1 Y- w$ L$ A* L6 @
    75.                 }
    76. % U* c  x3 @; h7 l
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    78. & z5 x  P: p. |9 r
    79.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    80. $ J; f; \* N1 f  l, D  k
    81.                 break;0 u* J- W) p3 T* D/ q; E
    82.         case 25:        //重载运算符.*, ?$ g' P  t4 V8 I# x, w
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    84. / Z7 z; F; C9 G% @0 y
    85.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);  h! ~# e7 L, Q9 h0 P$ |
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    87.   I. L/ l' A; ~0 r3 ?8 p
    88.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)! ~: m5 J2 O$ p
    89.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    90. 4 M% P/ `; m- P4 \
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象; N: t( c% V3 f' @( K4 c7 Y
    92.                 if(!pRealArray3) break;% x& b8 W\\" V2 U8 D2 U! W
    93.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小1 O) r* Z& {  U9 ]. A\\" m. t
    94.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘7 U0 O4 K9 x& |7 e
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    96. ' N/ n* o4 K+ @# Q7 W% f' E
    97.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;) a  U$ @% |0 R$ E\\" E
    98.                 break;  \, i; c  {; U\\" u' E7 N
    99.         case 46:        //重载函数new
    100. ' O& L/ |9 L7 H$ r- }
    101.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    102. , Z! g' L2 W  Y  c7 I
    103.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    104. 9 J9 \: |  c- u# A( T* a  x
    105.                 break;
    106. $ C7 n  z6 {# ~: S( T' n
    107.         case 49:        //重载函数o
    108. . p/ ^\\" g- [+ @9 P$ b
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    110.   z0 J9 y; v- ]0 L! L# y$ f* c  e
    111.                 if(!pMessage) break;
    112. , A7 X( _6 Q6 w4 V
    113.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    114. $ c: j/ N, f4 h$ q\\" s# t9 m
    115.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    116. ! U# M\\" Z1 t: m9 e8 u
    117.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    118. \\" I+ t% y7 s- [7 J3 ^# O
    119.                 pa=pRealArray1->Array;
    120. 8 ?+ _3 U8 ~6 V* j0 [: h3 ?
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;+ Z: h) W  ~, }
    122.                 for(i=0; i<m; i++)        //输出矩阵\\" v8 n' n7 N& u# x. H6 b
    123.                 {
    124. 7 ~8 o! g# t& B6 B
    125.                         pMessage(L"\r\n"); k+=2;
    126. 5 i- b# f9 {: U9 H
    127.                         for(j=0; j<n; j++)8 e+ J# H' U5 o8 I
    128.                         {4 p& Z5 v. l( l5 p0 k* P  n% R6 G
    129.                                 _gcvt_s(chNum,pa[i*n+j],16);& H: \6 |/ n3 v& W/ E2 d) P
    130.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    131. 6 L5 L0 q- u3 b  v3 T; b5 ?& t5 [
    132.                                 wchNum[u]='\0';/ f# B9 V, a; m/ i, O. E
    133.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    134. 6 I\\" K2 Z$ `! g4 \
    135.                         }
    136. ; K4 ~1 B  {& S- j- r* N6 [: [# ^
    137.                 }2 Y- L: b: ^5 e( M$ f' C9 Q
    138.                 pMessage(L"\r\n"); k+=2;
    139. . p5 Z* U\\" t4 I$ a\\" _+ A
    140.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    141. - W1 m/ ^* e\\" R& u) D8 {/ D
    142.                 break;
    143. ( P3 O+ n% T0 W+ j
    144.         default:6 J1 v  Q) x4 X6 E1 V
    145.                 break;$ }9 J/ p3 y( H& u3 A, K! f! b
    146.         }1 L: Y! ]; B+ Z( H1 m
    147.         return a;+ N7 s$ D* D) d\\" d9 P
    148. }) w- g2 N' C0 ]7 z
    149. void main(void)
    150. $ `\\" s0 G! K. v1 c6 j, s. ]
    151. {& ~# E/ R- W- F8 t6 ]
    152.         void *hFor;                //表达式句柄/ j5 u. y: v; N5 I
    153.         luINT nPara;                //存放表达式的自变量个数
    154. ( b3 f5 q/ k  b% ^. u- F$ \& m
    155.         LuData *pPara;                //存放输入自变量的数组指针
    156. 9 r' B4 a( U% S: P' {$ d: n
    157.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置% z' c7 ~) Q- v/ }7 }& l
    158.         int ErrCode;                //错误代码
    159. & Y& f2 D$ E: D3 l, l' @* D
    160.         void *v;; T& V: l; P( A1 \
    161.         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.]}";//字符串表达式,矩阵乘
    162. 1 G1 Y, X! @' t
    163.         //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.]}";//字符串表达式,矩阵点乘: l: {; B) b' n4 B8 }4 \
    164.         LuData Val;; n! K( K8 e1 l3 E
    165.         if(!InitLu()) return;        //初始化Lu5 X0 u\\" W1 e  d4 ~2 H  {& F) ]5 q- o1 r
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型+ Q% @5 I  q& y- x2 C

    167. 5 z% P- n# e3 D6 B
    168.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量# `& r; J. |# H& x! [- V
    169.         SetConst(L"matrix",&Val);        //设置整数常量
    170. 9 w/ f  G: ~$ L1 `( z& I% Z
    171.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息% i* ]5 O) [! T/ u\\" m5 z
    172.         wcout.imbue(locale("chs"));        //设置输出的locale为中文( R\\" [+ u6 g) y5 C
    173.   6 g% j0 k2 L: W5 p! V, I; Z; [
    174.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式& D& z- s! \3 v! n# X6 u, x+ ?
    175.         if(ErrCode)
    176. , B$ D* a3 @0 b! |
    177.         {6 R6 k, C9 d3 p/ A9 b
    178.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    179. \\" K. d7 p. f- b* x\\" t5 o9 ~
    180.         }% N  i7 k4 s, ]; U+ g0 ]
    181.         else3 \9 e, H( u3 Z$ S
    182.         {' q/ a! }- g\\" L1 B' ?
    183.                 LuCal(hFor,pPara);        //计算表达式的值6 d$ D) P0 e. B3 ^- ?
    184.         }
    185. 1 @/ j\\" B8 b0 s3 ~( ^
    186.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用3 E$ V- C/ F* E/ t# ?1 y
    187.         FreeLu();                        //释放Lu
    188. 5 G1 ~. d3 f. @& N
    189. }
    习题:% V; q8 F( ^& P% A

    9 S: [2 D5 {2 e2 L. E& J3 z    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    2 J" ]2 d% j3 M' ?, s4 I% z( V  P4 n$ T. d
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=; |* H% t) e4 Y) ^7 n3 d0 t& Q
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],% B) g. |& c\" I2 T' Y% O9 \\" l
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      8 C( S' f% Q9 ]8 [
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],\" D+ {' I; D5 P1 I
    5.     t=clock(),
      8 |; X' @! N4 K/ A' ^1 q
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},% L! }, l  P  }
    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.! M) ^! ~8 k% U, ]8 k6 G
    2. 5. 4.
      . `9 n' }) _5 Q
    3. time=0.875 seconds.
      % _3 v- y8 u- p. H$ w* h! \
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];3 X3 v) I2 G, p8 r. {. W
    2. b=[2.,1.;1.,2.];' C1 L8 l! z! a0 R! m
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      ! n; c' L2 N1 e1 S* i* x: l3 q1 U
    4. tic,
      : A+ Z! |9 h! d( _9 q
    5. d=a*b;
      ! V; `1 N1 u; J
    6. for i=1:1000000
      % k5 u) D2 x1 F. \: g: B3 B$ h
    7.     d=d*c*b;
      \" Z: o+ T1 Y% Q+ U, ~: C# [/ i9 j
    8. end
      \" u4 W5 f3 c; W$ j( O\" p
    9. d,
      & v2 V6 d# D. Z* _3 ^
    10. toc
    复制代码
    结果:
    1. d =
      - X, n7 |/ i& h+ Z+ A8 n
    2.      4     5) W6 }; |& H# U$ e* ]. E
    3.      5     43 Q0 i. l- N. p2 u
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。; q) D. T* a) {3 n& b. T
    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-5-2 04:21 , Processed in 0.431631 second(s), 52 queries .

    回顶部