QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8689|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    ' ~* p8 z/ r0 M. ^
    & A8 r0 R( G* c# m% w" t    基本要点:+ p  l% z! W4 l

    + A8 a7 {) C1 K2 {# u    (1)为扩展类型matrix编写运算符重载函数OpMatrix。$ Y; J" |# h2 F7 T: S

    ' r0 E5 J! _8 u' l    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。0 \  q5 w( k* n# X

    / Q4 S7 P$ y0 y" Z; W+ d: K% S' B    (3)为扩展类型matrix编写其他操作函数(本例未提供)。. g: y& z! j- B( c! E
      }  j2 X( G. D" _$ A* j
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>  ~5 j6 E4 E\\" K+ B+ `5 E
    2. #include <iostream>1 H% m4 \$ M* a5 W
    3. #include <math.h>6 K. v; g4 W+ C: E
    4. #include "lu32.h"1 j$ U5 \- C( ^2 ]5 i- f, c
    5. 0 H5 Z\\" _9 D1 L# ?$ u$ g
    6. #pragma comment( lib, "lu32.lib" )
    7. 5 [0 |& s' P$ U6 j3 t\\" B( j
    8. 6 t3 ?5 g) @2 g, N  L! g4 k# T% ^
    9. using namespace std;
    10. + u2 H0 W' x7 P( l
    11. 4 h# c4 J$ C# y3 n) I( z1 A$ z4 D2 G
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定4 [9 ?: p& T5 e
    13. $ d\\" s+ F8 J2 V0 r
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 * T6 F* I2 }0 m+ g: D7 D% K
    15. {
    16. - p* ?! d% c: v4 o6 G/ A\\" T
    17.         wcout<<pch;
    18. ) w( a2 L2 \  m+ c% K6 M
    19. }  d) v3 ?$ c$ B- E\\" m
    20. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做6 U\\" t* S) R4 T  {3 a
    21. {! A/ `2 t, q- @8 t
    22. }3 H7 q% P4 k2 g9 d) a- {- ?2 b9 l
    23. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数( T6 V; r. z5 O$ Y* [
    24. {4 n& y7 s, E/ x8 S
    25.         LuData a;! t) c& C+ e0 C& H# N
    26.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;7 e+ {' a4 W0 E2 P. ]* S- i( A
    27.         luVOID i,j,k,m,n,u,v;6 l* V% F9 r% {. k  L
    28.         double *pa,*pb,*pc;; s- T- _5 R7 D0 f8 ^0 f
    29.         luMessage pMessage;7 ]4 [# C% y+ P$ u
    30.         wchar_t wchNum[32];& F9 N6 U/ s( }' \
    31.         char chNum[32];* l6 c1 s$ j* M$ i2 w! l0 V6 x\\" _
    32.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    33. 5 y; _  n  |\\" L$ u; v& H! @
    34.         switch(theOperator)
    35. . x! I, e; P' {1 N# K5 ]+ d
    36.         {& z: F2 \+ u( k5 ]! ]
    37.         case 2:        //重载运算符*$ @7 M! D: h- T: b. ]' Z
    38.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);  |- D: _. D' k) o7 g4 d* f* C
    39.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    40. , h5 L  m+ A' V$ i
    41.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组8 v! Z+ U0 u% S
    42.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    43. / [) m' s4 D  a, S' T1 M
    44.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配3 j4 M) {; y4 V: c* C
    45.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    46. 1 B# d1 b# a) @' D1 Z
    47.                 if(!pRealArray3) break;( z- f: L3 U% J, |# K, L
    48.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    49. / R: I/ z8 o* W0 T
    50.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;( n4 P2 X6 Y% j9 L
    51.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    52. 4 i4 |- q+ [  ~2 m# C
    53.                 for(i=0; i<m; i++)        //矩阵乘7 Y4 k/ }/ X2 z* ^3 e
    54.                 {
    55.   c- {( z1 g' @- E/ Q
    56.                         for(j=0; j<k; j++)
    57. / G( o' V9 G6 V
    58.                         {
    59. + ]5 j, d( U# T1 Z% U; V2 `
    60.                                 u=i*k+j; pc[u]=0.0;/ p) q5 y9 t, J! T  d. j
    61.                                 for (v=0; v<n; v++)% @, q; l6 X2 j  r4 g* }' r  L3 Z
    62.                                 {
    63. & h8 |\\" @1 ?' J0 ^5 M# @/ p\\" I
    64.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    65. * g$ z% n8 O! v8 O/ Y' t
    66.                                 }
    67. # p$ m) U1 e9 H: {
    68.                         }
    69. 1 ?3 p1 g+ B6 a. @7 q1 Y; z
    70.                 }' c& S( p: J$ o# E) ~
    71.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象. B/ G4 Z* K7 o
    72.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    73. $ M7 m! M8 _- j\\" U, W7 [\\" J3 I
    74.                 break;
    75. 7 q) e1 z) y5 {$ J9 s7 l  G
    76.         case 25:        //重载运算符.*. s) ?4 G1 Q& {& I' a. \+ O) G
    77.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    78. - V$ |6 d$ ~0 i4 i: E6 G
    79.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);0 Y- ^7 u2 W: A
    80.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组: d, p0 `5 Y9 N3 t8 L
    81.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)' X/ u9 e  T5 I\\" V2 A( Q1 |- C
    82.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    83. ' o' t3 d2 {3 c
    84.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    85. 0 a1 [4 m- {. v& J% I\\" {& L% T
    86.                 if(!pRealArray3) break;
    87. # X. O, J( W* ~
    88.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    89. 0 y- |2 d4 @  \+ ]  A9 H
    90.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘, c  H) \7 o\\" v
    91.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象2 C* @. d/ n8 @* W- q5 y+ i
    92.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;( [4 q3 |+ p; x+ v( Z
    93.                 break;
    94. # M\\" p6 W& g& V3 O& _. J' U! d' @
    95.         case 46:        //重载函数new
    96. : U; y7 k0 k+ l4 {1 x
    97.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数' |! p3 x\\" b4 B
    98.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型) w# `' J% Q3 F! m\\" g
    99.                 break;
    100. % ?4 P3 d6 j2 N3 s! m6 a- g: z
    101.         case 49:        //重载函数o. b) i) F& G* _' _\\" ^2 i
    102.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    103. 6 f9 F& v/ v2 m( Z0 C
    104.                 if(!pMessage) break;
    105. ! o. ~3 Q8 u/ r0 {2 Y/ W
    106.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);/ U$ G# h* _) |) a( w$ h$ j
    107.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    108. 0 s9 m$ h0 ^  c! w- T) [/ [
    109.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)) z0 W  k5 I5 z8 H; V+ a
    110.                 pa=pRealArray1->Array;
    111. ' z$ @! {: j* X- V' _/ v
    112.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    113. 7 v+ ?5 T$ l! S5 X
    114.                 for(i=0; i<m; i++)        //输出矩阵! F( b# y  z+ z# \
    115.                 {  |# n: }3 K9 r& y% i  y3 t
    116.                         pMessage(L"\r\n"); k+=2;
    117. ; v; h7 T& A; \% v: D
    118.                         for(j=0; j<n; j++)
    119. 2 |, A+ Q  ^7 ^5 p3 ^6 X
    120.                         {- A% ?# y6 ^/ v5 z
    121.                                 _gcvt_s(chNum,pa[i*n+j],16);
    122. ( e# S- M& L* I2 ^
    123.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}  d. {, t. W9 R4 w7 C1 w0 a
    124.                                 wchNum[u]='\0';
    125. ' h- n( C2 h$ x! X% @
    126.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    127. 7 o, P. {/ t/ J
    128.                         }( L% X; x) z7 m9 c* R  G
    129.                 }2 D* A' g4 c$ ]5 \: |
    130.                 pMessage(L"\r\n"); k+=2;
    131. * J3 M$ }8 w$ @  @  X7 F
    132.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    133. 1 Z9 v) V: U  f7 ~: c4 y  p
    134.                 break;
    135. ; m, [' ~3 z\\" J\\" ^
    136.         default:
    137. & W  z* w6 v% q6 P* x: d\\" g- @3 F: S
    138.                 break;4 n7 Y/ d6 E. l  e5 _0 l
    139.         }8 ]; r( U+ i\\" c0 t2 H9 _\\" `* N9 H
    140.         return a;; y! k2 |  D  A* B0 ~( M! l
    141. }& b! x* u& f2 |. N$ [
    142. void main(void)- U' Y& M7 C6 M  k
    143. {
    144. 4 k) t9 v4 ]* W9 W$ r) {
    145.         void *hFor;                //表达式句柄
    146. , L& B, \. l+ P) e5 g& i
    147.         luINT nPara;                //存放表达式的自变量个数
    148.   U% ~/ `% |\\" x% p
    149.         LuData *pPara;                //存放输入自变量的数组指针
    150. # A/ U9 p5 h& G6 N5 E% M7 e( r; u
    151.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    152. 8 ?/ ?\\" |; I/ k$ h, P+ Y1 C
    153.         int ErrCode;                //错误代码  O# N9 x5 _% X* L0 D! \! g. J\\" }  w
    154.         void *v;
    155. 2 h8 |$ r1 m1 w, A
    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.]}";//字符串表达式,矩阵乘# R# h4 w7 M\\" D. i\\" I
    157.         //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.]}";//字符串表达式,矩阵点乘
    158. - V6 y. o2 H  V1 H7 l3 z. u
    159.         LuData Val;6 _. s) D2 i* N
    160.         if(!InitLu()) return;        //初始化Lu& p9 S6 c# H/ t! U\\" u
    161.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    162. , a; U9 u$ l1 ]
    163. $ F( H. L. Q4 [5 }# T6 I
    164.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    165. 9 S  O# k2 N' R7 }+ O
    166.         SetConst(L"matrix",&Val);        //设置整数常量
    167. 4 @4 G! H* V! U  n
    168.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    169. 0 ]: g4 n2 G$ I/ z6 R' A! i7 `
    170.         wcout.imbue(locale("chs"));        //设置输出的locale为中文6 S- f- j& ~5 U2 n* R: r& S3 d
    171.   
    172. ; h* G1 r: G2 y1 T1 T
    173.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式$ i3 m. y1 R1 r% n6 j0 O0 g
    174.         if(ErrCode)
    175. . `. g$ p6 m6 D$ ^* C7 }) h
    176.         {& x% s$ k6 R' X. h8 c5 x1 I- @! C
    177.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;& {! i! |& t# b/ `# ?
    178.         }
    179. . u( x4 w- }$ [; Y
    180.         else
    181.   g* K* z* R3 @5 O( g/ Q
    182.         {
    183. 9 d2 Y\\" c3 [5 w' O
    184.                 LuCal(hFor,pPara);        //计算表达式的值
    185. ' L1 U1 Y$ c! G+ \. ?
    186.         }# X9 Q# h  s# H8 I, H& B- \6 G
    187.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用: S0 @5 Q6 M6 r. B
    188.         FreeLu();                        //释放Lu
    189. \\" N5 u1 ^0 y/ \; {8 g9 b, g
    190. }
    习题:
    0 m, ^0 f9 l0 b8 S$ n0 X
    $ i% f1 x( O8 }/ ?    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 ' U# j. L! ?) R1 X- `; p
    5 O9 H3 {( E% j& ~: K
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      : T% J% W5 E3 ]; [
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],# X3 I5 J' p% A) l
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      : t+ L, r* r0 N: t9 y# \
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],6 s  T/ u0 l7 p, t/ u. R! x
    5.     t=clock(),
      . w/ ?/ Y  k- D3 Y1 S6 i
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},& P; [' I% \) k8 |( J
    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 W  }5 H- D' s& E* s4 k
    2. 5. 4.
      9 |5 g\" R\" W9 m+ M  K. ?6 D8 j
    3. time=0.875 seconds.
      ! h5 G% d: J& w- j3 r
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];5 C2 W\" D, I( i6 i. q: Y- z2 Y( N
    2. b=[2.,1.;1.,2.];6 n% X# T5 P' i5 R% M. R
    3. c=[2/3.,-1/3.;-1/3.,2/3.];' q9 D9 M\" v2 b9 \8 G6 P; j4 p
    4. tic,
      + V3 l8 k- C! i) F2 A/ C1 d
    5. d=a*b;
      ! b) |$ n4 n8 q6 g0 Z& I
    6. for i=1:1000000) D3 v8 z! ?, [8 l
    7.     d=d*c*b;
      & }: S# C7 ?2 r- u! B% i4 d1 h
    8. end1 ~% F7 {6 X6 Z$ I' z0 v
    9. d,
      / B1 a: n- Y& M: u  v
    10. toc
    复制代码
    结果:
    1. d =/ ~' s: ]: Z) _
    2.      4     5) H; [9 o$ A* n/ m
    3.      5     4
      $ P. R$ `8 e- s1 Q. l
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
      c' k4 d! ]% U
    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-4-20 15:35 , Processed in 0.472165 second(s), 64 queries .

    回顶部