QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8512|回复: 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' N, Y/ |9 h0 |
    6 r3 t5 u( V+ m- i6 _  ]( O    基本要点:
    7 Q* J  b3 Z8 R/ T5 A# n$ H# R: b$ o. \9 a& y6 @3 p% U
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    9 t* s! Q9 B5 N( I5 M/ c$ `1 Y: X; U% O4 p$ K; U: ^. p
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。1 H* ~& k0 L2 X& e4 g) }7 o4 I
    6 j2 U/ `2 s: F* v3 E, H" K& I$ V3 C
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。! |, j& ?1 ~$ e% d2 r, d0 P& L

    1 f; ^3 b5 @1 e/ b; l    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 4 u. [, W, \$ J
    3. #include <iostream>\\" r5 S# ^2 T' D* n
    4. #include <math.h>& q- t\\" T# h+ s' k
    5. #include "lu32.h"2 p5 Y0 |! A; s\\" N& n2 Y; A
    6. 3 B- p# R5 C0 O: ?  k& {* S9 h
    7. #pragma comment( lib, "lu32.lib" )4 F: ^# V$ I- e8 V9 J$ w8 N( F
    8. ! I% _& W( y- ]' L  V
    9. using namespace std;
    10. ( @- K( s8 Q& R; M  f! _5 n
    11. / U\\" A0 o. h* p# ^
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    13. ( B( l9 G  C/ O  T' q8 }% ]

    14. / r! W* q: G* G- ?& a\\" _8 j
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 5 J3 o\\" H# e5 _% J) E
    16. {
    17. . ^  i0 ?+ C7 W8 ?
    18.         wcout<<pch;5 @* e2 J  U\\" R2 g. }
    19. }
    20. ' i% D2 U- N* \6 [# o\\" p8 p
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    22. ! w4 l+ Q\\" Q6 T& G6 X6 W. j
    23. {
    24. 9 j3 y2 q7 }! ?  L1 M7 S
    25. }
    26. $ ^3 v( O0 s/ L% p. L
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    28. 8 V3 A; L7 x4 D. v7 @+ P\\" T
    29. {
    30. ( a& Y6 E6 U& h; ]+ `5 W4 T9 W
    31.         LuData a;
    32. - c7 {) ~; U( `8 T: H) C* B  q
    33.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    34. 9 g. C+ [; k\\" m
    35.         luVOID i,j,k,m,n,u,v;
    36. * L/ t9 J1 X% U5 m7 V6 z$ X
    37.         double *pa,*pb,*pc;
    38. - B3 E8 M* P\\" F& B- {& K
    39.         luMessage pMessage;! G' q\\" ]& j- @8 ]+ T
    40.         wchar_t wchNum[32];
    41. # e8 m1 `' q0 B\\" D1 l5 g( r6 k8 g
    42.         char chNum[32];
    43. 0 u, H1 U\\" [9 I9 B' h: J* ]9 V, Q' i
    44.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;  ~\\" i; X  [; r\\" p' J  t4 V
    45.         switch(theOperator)  K8 y! g6 e2 R/ ]0 j
    46.         {
    47.   D8 e3 [% S+ E% i& ]- k7 W
    48.         case 2:        //重载运算符*
    49. - R7 }' B1 N9 Y+ V\\" x
    50.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    51. 3 r9 I; X- ~  Q+ k! G# b) W
    52.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    53. : n) o' L\\" w# l/ o
    54.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    55. : ~- H6 @% u5 K7 k# f3 f; u9 A
    56.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)( t; B) L$ F( p% G* |+ t; h$ k
    57.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配5 U2 h1 L, x7 w
    58.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象0 ^$ _2 `% X\\" v: f
    59.                 if(!pRealArray3) break;6 _4 W4 Q9 l2 O  I, s7 Z; l
    60.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小  m) M3 _* |5 @; ?0 c5 F. _
    61.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;/ k2 P; }! f# r- d
    62.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];8 m: {4 R8 o) l. V
    63.                 for(i=0; i<m; i++)        //矩阵乘  S& b$ l. f# N2 Z' Q
    64.                 {3 x2 G4 `0 g5 B
    65.                         for(j=0; j<k; j++)
    66. # d/ V) U\\" n# E0 s' A
    67.                         {6 q4 H4 t/ z( p( G
    68.                                 u=i*k+j; pc[u]=0.0;
    69. / C9 o' ]/ T, a: v
    70.                                 for (v=0; v<n; v++)! B- ~+ y- A! A; j' ?' E, f
    71.                                 {( R; \$ U1 W\\" m9 z  _
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    73. , `, Y# a5 ]4 X% k; B
    74.                                 }
    75. ; E% V1 b' o\\" d/ J: }
    76.                         }' m* h; V( Y% u
    77.                 }) p* F2 }% R; h/ m9 L
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    79. ( a+ u9 m6 k% y& Q
    80.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;* S6 n# `: A, ~( E7 f3 i
    81.                 break;3 I0 O+ ]+ h: v9 M
    82.         case 25:        //重载运算符.*( q\\" C: I7 r3 J
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);( G8 E- I8 y' ]3 F! j: D6 P1 W
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);' h& r7 l$ n9 J. U! H; r* r
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    86. ! P: _4 T\\" {# B! T4 x& C
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)( k  `0 J& n\\" @% D2 P$ \& W
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    89. 5 k4 w6 ], I2 t
    90.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    91. # x; W. }, X8 R! v: o; ?
    92.                 if(!pRealArray3) break;
    93.   ~0 W) w1 D- T  w
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小* l' O  M! \0 H9 _: y. P2 k+ W
    95.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    96. 7 {* U6 O\\" G6 j, g! q
    97.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    98. ( e: Y: E& t0 ]5 f
    99.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    100. 3 c5 S3 g& {. F, e' {
    101.                 break;
    102. ( U* r/ B* p6 V5 ^
    103.         case 46:        //重载函数new9 B. e) A  l# a$ E1 _
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数. b4 s9 u, h, o$ B8 `\\" Z
    105.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型' A# n/ \! I# c+ B% \$ d9 h5 y
    106.                 break;  G% H0 k& D2 l- {7 \& s( s
    107.         case 49:        //重载函数o
    108. , z% G5 E: ]$ H& \\\" e; {% [
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    110. . k0 ?- H8 C\\" O: E) e. C3 S% z# Q
    111.                 if(!pMessage) break;
    112. ) i/ F0 t* q. |: C  y2 L8 v
    113.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 P& H+ O9 q* L& i! E/ u
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    115. 6 r! A0 ?8 S2 q# z4 d5 z' k
    116.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    117. 9 v0 w0 u% P2 L0 M: q* C
    118.                 pa=pRealArray1->Array;
    119. 6 R  i$ E$ }; c3 l* ~  D0 N$ l  G) l
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 ?1 v9 V* q- Q: J/ K. R
    121.                 for(i=0; i<m; i++)        //输出矩阵
    122. ' I4 t* h- u+ _5 x
    123.                 {2 c. k6 f' y7 `1 i
    124.                         pMessage(L"\r\n"); k+=2;! ]# ]- V( a7 C7 F
    125.                         for(j=0; j<n; j++)' G/ Q9 i1 l5 E. ?2 c
    126.                         {
    127. 5 i& j# f8 n/ O9 D6 k( x
    128.                                 _gcvt_s(chNum,pa[i*n+j],16);
    129.   i  d: |; S; S) D' }
    130.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}9 x9 g& o* z( S. u/ x/ A& j, o) f+ y5 Y
    131.                                 wchNum[u]='\0';4 A+ |8 j  g0 [/ H\\" E, w
    132.                                 pMessage(wchNum); pMessage(L"  "); k+=2;+ b+ \) z( i+ @  \
    133.                         }2 B  ^$ O# O7 E8 a\\" d: O9 {
    134.                 }: J# _; h* N; E; S1 u
    135.                 pMessage(L"\r\n"); k+=2;  V# q: o# o5 C& I9 n: s  H* H# }8 j
    136.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    137. % l! V' N% _5 R( s9 r
    138.                 break;2 l4 r% ~4 m\\" o- {
    139.         default:  q4 w* U4 a5 M7 L: f# [. l
    140.                 break;% e8 b( y& G# ]! y
    141.         }
    142. % s7 y\\" s: @# u$ m4 w
    143.         return a;
    144. 1 y+ ^8 @/ K4 X* O% E, r
    145. }
    146. 4 X2 d2 z9 W( L+ T
    147. void main(void)
    148. # k; X# f' S# G! s, G, a
    149. {/ v: r2 C# p- Z2 d
    150.         void *hFor;                //表达式句柄9 ~# a  c8 }2 j. R& J: I  c
    151.         luINT nPara;                //存放表达式的自变量个数0 v- R) q. I3 p4 c# O5 k5 O
    152.         LuData *pPara;                //存放输入自变量的数组指针4 g, S5 m' W: i\\" n. o
    153.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    154. - H, |% e; _) e- e! I
    155.         int ErrCode;                //错误代码
    156. 2 E! o( J1 f# E) x/ w, z
    157.         void *v;( V: H5 w9 ]6 Y0 Q
    158.         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.]}";//字符串表达式,矩阵乘
    159. ' Q# N* t% f% m5 b2 N+ r
    160.         //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.]}";//字符串表达式,矩阵点乘
    161. 9 o- N2 F0 _9 R$ b( N  O4 V! }
    162.         LuData Val;2 z) _$ h: V\\" M+ {: ]7 S
    163.         if(!InitLu()) return;        //初始化Lu
    164. . d1 J: g: z7 v- H, l1 h
    165.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    166. + g4 B( J( k1 N

    167. 9 B/ C4 v- m  `
    168.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量\\" f4 s$ \2 a6 H5 d
    169.         SetConst(L"matrix",&Val);        //设置整数常量. c! S% K& F/ d  }2 H& T, _- t& d7 C* u
    170.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息. F& ]: e) `9 |. M$ U: j. ?\\" r\\" E
    171.         wcout.imbue(locale("chs"));        //设置输出的locale为中文2 |6 n3 F3 _: W/ I% @; ]
    172.   5 b0 Y6 i1 o' D
    173.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    174. 0 K( Q  T\\" c6 d
    175.         if(ErrCode)
    176. ' y3 H; }* E2 i& P* N
    177.         {
    178. & W  Z! w( S( e3 {1 g
    179.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;- c7 _9 J& O8 z/ ], ?/ e
    180.         }\\" L0 o  t# }! w  X
    181.         else9 B: w2 G; S- Q: C2 M/ U1 X
    182.         {
    183. ' i  T$ {1 S1 T# }7 X2 }  ^: y+ V
    184.                 LuCal(hFor,pPara);        //计算表达式的值# |2 w# A( m* x) V
    185.         }3 Q: f6 e# u1 i: O' @# A+ C) ^
    186.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    187. 6 u+ B6 Y$ n# t/ R0 Y/ W
    188.         FreeLu();                        //释放Lu! B2 e3 q, c\\" o; P$ A+ H8 D
    189. }
    习题:
    9 r% b9 s0 }$ i, P1 j, z3 B. m7 @: K5 a% @8 w6 Y
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 & E+ \" V# p+ `9 V
    ) t) m9 G1 e3 }3 ?/ X
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=0 Z! P: ]5 ?9 k# v' r
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],0 B3 [, C8 c- p. _2 k
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      & c3 r, i# l- g  a5 ~7 }
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],6 b\" T, M2 p2 a4 N  Y. m
    5.     t=clock(),
      ' v; W4 A3 l; L# ]: k) I
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},- k7 Y. M! y  \0 z0 w6 }5 ~$ 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.  F* D2 s% l0 u: h+ O
    2. 5. 4.
      8 J+ M  J$ B; C* `/ [
    3. time=0.875 seconds.
      3 F$ |! b  j0 W. m* j0 q& Q
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      ; y+ X' W7 `# r$ \
    2. b=[2.,1.;1.,2.];5 Q5 e# r* r1 o4 K5 b' \\" k
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      - C) C6 z( ^1 q, C$ f$ G. _1 g, P
    4. tic,) S- K- L( z6 L
    5. d=a*b;) T- L8 h% X9 W# P0 N  X2 O+ i
    6. for i=1:1000000
      4 j9 x! U7 B' V7 r1 U
    7.     d=d*c*b;
      ; N& U2 U7 f1 W3 p
    8. end
      , f, H- Q6 u7 i3 r% z
    9. d,
        T4 d  ]1 p: Y! S
    10. toc
    复制代码
    结果:
    1. d =+ p9 {% T' V\" k) S
    2.      4     5& h4 n% w4 X9 U$ {
    3.      5     4\" K\" w5 }& Q% z/ e) B
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。: K+ |" T3 x+ |2 Y: t, S
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    3#
    无效楼层,该帖已经被删除
    2#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-11-12 06:24 , Processed in 1.717010 second(s), 65 queries .

    回顶部