QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8824|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。4 j* t5 A3 Z9 `1 [" s$ P$ O

    & U; a4 e+ h3 y0 }    基本要点:) D/ Y/ j6 @8 }! k3 a6 z2 G

    ( R. c" e/ G0 D5 @) }) q    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    6 z0 L7 b/ B8 ]/ d4 k# S  j" N" ]7 u" c) O/ p
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    ) E4 W# C) x9 ?0 p$ x! d/ n! u5 ]2 V( U( n, u' O
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    : }. }: c$ j; m" I1 q  ^  w  A
    $ i; Y% L& m* B0 S    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>' B2 G$ g, d: O5 E2 z, J
    2. #include <iostream>
    3. . h* B2 ~4 @( ?* e. W5 C
    4. #include <math.h>
    5. # |# l; R1 Z: v3 f. ?
    6. #include "lu32.h"
    7. 0 q- a# }- |# N& {% Z% j( ]5 Z  D
    8. $ v+ Y; V  i0 G% d2 \3 D
    9. #pragma comment( lib, "lu32.lib" )
    10. 5 ]5 O# Q1 |/ r
    11. \\" u9 v% X: s! A4 G
    12. using namespace std;
    13. . [& Q2 C' V. A2 f, Y5 a5 n4 s
    14. \\" O- Z, d0 o) D1 ^
    15. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定% G! O  H; H$ W6 g
    16. . ~/ M0 C; ?+ t7 c* M# m. {4 j! a
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    18. 8 J9 o- x( }; L3 R' X1 H- {- `
    19. {
    20. . ]: u+ W8 D0 W% f
    21.         wcout<<pch;# o/ ^, e% n) B9 u
    22. }& Q: O0 ?: F2 w- p
    23. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做  a9 E. d3 J\\" @$ R
    24. {; Q  A- |0 R& Y( C; G1 ]& o9 X- ~
    25. }\\" z: c; o* l! T
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数) O% N( L( G5 Q* ?( g
    27. {# H- u; |3 a1 s* v; n6 ?0 }, ^
    28.         LuData a;
    29. 0 ~  O/ M; I- o) K
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    31. 7 }1 B& ~7 m$ s8 ?! [+ h! `
    32.         luVOID i,j,k,m,n,u,v;3 @6 k/ [4 ~8 b( r$ X! Q
    33.         double *pa,*pb,*pc;
    34. * y9 ]( J' o% c5 U
    35.         luMessage pMessage;. t- q7 B) u$ i+ R- n7 T1 B
    36.         wchar_t wchNum[32];
    37. $ x0 {4 ^, U! p' w7 Y! [
    38.         char chNum[32];
    39. ) j3 I# A7 I+ Z% H  B$ P
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    41. 5 l1 j6 R' [# r6 q0 Y( Y% Q
    42.         switch(theOperator)
    43. ' ], l6 B\\" \  A, w; m
    44.         {5 ~2 `; I& @5 H. |7 K! N
    45.         case 2:        //重载运算符** x8 B( `* ~% H1 C
    46.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    47. $ d. |7 ]$ i1 L# X\\" x4 X+ M& @
    48.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);+ J* t' P' y. w. m8 s+ `/ w
    49.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    50. . j8 G3 Z% Y1 Q1 Q. x
    51.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)! ^2 ^9 K8 Y. ^$ v2 t8 f) R1 b
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配. d) l; s0 |- S6 a+ M7 [9 n
    53.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象$ @9 a* Q& v# m& _  e8 x2 A' y3 r
    54.                 if(!pRealArray3) break;9 Q, P, |, d( q! e9 B9 d; w
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小4 v- Q' I( z$ j3 f
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;2 B, k% n- I1 y! P& X
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];7 e5 |- h0 e7 U0 w8 T. x0 Y
    58.                 for(i=0; i<m; i++)        //矩阵乘
    59. \\" }& ~2 `  G7 P, t& t) R
    60.                 {5 h: }' Y7 t# F5 q! F, W- Z
    61.                         for(j=0; j<k; j++)
    62. ' g- u\\" R0 X! y) m
    63.                         {# G6 Y! i( x, V# a
    64.                                 u=i*k+j; pc[u]=0.0;0 V, @6 y& s\\" C, _: e
    65.                                 for (v=0; v<n; v++)
    66. 0 [% o* i\\" a: Z; o) c' R( r, R
    67.                                 {
    68. + v/ h2 Q, @) t
    69.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    70. 4 I+ ]; C) N5 _: Z7 k; T1 i
    71.                                 }
    72. : |, F- S5 |$ E
    73.                         }9 w% c. {, f0 H4 K7 }1 Z
    74.                 }0 Y9 Q# \- t* D4 J8 n# M\\" C; k0 {
    75.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象! u$ S$ n* L' B$ Z3 R! N' G( J
    76.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;) K+ E6 ?: [5 R0 K  B; _
    77.                 break;
    78. 5 w0 J! k  f4 F' n1 H8 @# Q. \
    79.         case 25:        //重载运算符.*3 K* \) E7 `1 E0 O
    80.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);; ?! `$ k: s, w\\" z' E\\" B
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    82. ( E\\" ?! N; o- a7 }
    83.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    84. ) b! W/ U6 t2 H+ l: @& o
    85.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)  e0 Z+ `3 b  V/ H2 u* T+ V
    86.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    87. 7 J3 T! K1 l4 e( s
    88.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    89. $ n  [) X: K4 T' O' q; ~
    90.                 if(!pRealArray3) break;3 F4 G+ n: {' R& B) k6 q
    91.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    92. - C* H) e# w: h
    93.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    94. 9 m) r, G: J- _! v+ x) ~% |
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象# N- ?! d4 f( W( ^! p7 ?& i
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;/ l' }' `, {' T; z$ `
    97.                 break;/ Y- S8 x. \\\" N8 P. x
    98.         case 46:        //重载函数new
    99. # W2 T6 p2 T' y8 Y  S
    100.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    101. 1 Y% ^2 b0 X2 B
    102.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    103. ; W! S* }( n( }, x& W6 }4 b
    104.                 break;$ s! A6 i/ _# W# @+ |\\" R. R2 c
    105.         case 49:        //重载函数o
    106. : @3 b5 N3 p4 E3 m; |5 A
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. \\" T: j( o; E! \' ]$ l2 O
    109.                 if(!pMessage) break;
    110. 0 U4 q8 L8 R. g7 D% x+ C
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);) Z  X3 [) _\\" f: S: H. i' [5 x
    112.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    113. ) P- W, a4 C4 G, K. G; C
    114.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵). {- f1 ]. O) E' e) w) m. p9 y, I\\" ]
    115.                 pa=pRealArray1->Array;
    116. 0 |* F/ p( [8 i: a
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;& j# w* A; x; k7 x  Z
    118.                 for(i=0; i<m; i++)        //输出矩阵; ~  }4 `' ^/ n9 K+ e( a
    119.                 {
    120. 2 n8 q- U7 G, T) y
    121.                         pMessage(L"\r\n"); k+=2;
    122. 6 w( [7 W( w% ~# a
    123.                         for(j=0; j<n; j++)
    124. ( d' h0 S\\" }/ G
    125.                         {0 K+ H5 h8 X6 b- Y; p* k' ~  W
    126.                                 _gcvt_s(chNum,pa[i*n+j],16);
    127. 8 }; Z' {: \6 S4 ^' ?
    128.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}+ D9 v0 V- R& u
    129.                                 wchNum[u]='\0';
    130.   y$ E; a; @8 o1 A$ y
    131.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    132. + K8 ?, x8 l/ d  O# d/ O* h
    133.                         }# O5 u4 K' l; r- A
    134.                 }
    135. & w  h) i1 }2 a\\" t, u% A6 o
    136.                 pMessage(L"\r\n"); k+=2;
    137. 3 `0 u3 ]4 \3 v9 f, U
    138.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数. z1 U$ I; T+ g6 ^) {! _/ ]
    139.                 break;
    140. , c0 H; N3 b+ @  Y$ g6 @
    141.         default:) v) H) t6 g( W+ u
    142.                 break;
    143. / r* k3 ~: d- U% D! p/ f+ U- t
    144.         }( i: d; I# p  t5 }8 x, n
    145.         return a;
    146. 5 |3 W# |! C4 `
    147. }
    148. \\" D2 Z$ }- v- ~# p
    149. void main(void)5 d% w# u- Z% k! g+ E! d! V, y
    150. {, g% ~; L- j' r4 T
    151.         void *hFor;                //表达式句柄( y8 F, O4 U( i  z2 c' I
    152.         luINT nPara;                //存放表达式的自变量个数4 N: C3 b; a2 }% q# W
    153.         LuData *pPara;                //存放输入自变量的数组指针
    154. 9 S& q4 i/ l5 T% Q: j% o
    155.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置, h9 L; W) ?! [. [
    156.         int ErrCode;                //错误代码
    157. . t0 B  A0 x# U# w! z. O
    158.         void *v;8 ~& b6 m. |' }2 I9 q4 l5 M7 U3 Z
    159.         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.]}";//字符串表达式,矩阵乘( }\\" ]\\" i) a% B' m3 Q* g+ I0 h; X7 w
    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.]}";//字符串表达式,矩阵点乘/ J\\" l4 o, O+ a8 K  [3 e4 v/ H: X
    161.         LuData Val;
    162. 7 Z( B! m  O# S7 }
    163.         if(!InitLu()) return;        //初始化Lu
    164. # ]$ T( o- G8 z( E$ \
    165.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    166. 0 y8 I1 \$ z( H9 {

    167. / w! G9 B, b\\" I\\" D
    168.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    169. ! k  g- ?* |4 V3 N* P  J% P
    170.         SetConst(L"matrix",&Val);        //设置整数常量
    171. 8 y/ Y$ R; S% e6 W) Y) ~/ t, Z: e
    172.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    173. # ?7 M2 |+ L  l  [0 a
    174.         wcout.imbue(locale("chs"));        //设置输出的locale为中文! o% g/ Z- H( H& U/ y2 i! j
    175.   ' g4 [+ S: K6 j7 u7 @' s
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式( E3 z  X9 F; E, G4 L+ H7 Y) T
    177.         if(ErrCode)3 I2 w& ^9 t4 \+ C2 M  x8 K; ]# O
    178.         {
    179. . N. x. u4 Y2 g# T. Y) Z+ L
    180.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;* L4 y\\" m$ _6 X, H5 Y# n
    181.         }! \9 [, }4 L& h& K+ }: Q8 l
    182.         else
    183. % ^  U) u, c# M) X1 J& N
    184.         {& u\\" k$ T8 w2 g) R. _2 N
    185.                 LuCal(hFor,pPara);        //计算表达式的值
    186. 6 R* w  ^- X: a7 ~
    187.         }
    188. : ]8 {; }+ j2 ^! g! s
    189.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    190. / X' }: T  x. {9 `
    191.         FreeLu();                        //释放Lu
    192. - R- I- c) n2 q) |
    193. }
    习题:" ^7 [; H' R/ T
    ( B7 D7 \. F3 `$ S' |( Q
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    ( C( q# V) u5 J1 H, s0 M+ z4 o+ G
    ! X  B& S! A+ O    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=# m, e1 [. |5 D0 w2 o$ m& v4 U: r\" _
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
        T! w- @$ ^' K+ B3 ?3 e
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],; \  z' j: M( e: K
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],# @5 ?9 L5 _9 g
    5.     t=clock(),) b' v1 H& u$ `+ q8 b: x0 f
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},% {  F) ~7 G+ u  O
    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.5 h, P' S' O7 l9 t
    2. 5. 4.1 k! Z+ A) @; V
    3. time=0.875 seconds.2 A, Y; v5 Q9 Z1 ~
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      & C7 k* @; C* d& l$ P0 G
    2. b=[2.,1.;1.,2.];
      1 A& v7 }: x\" g+ x8 x: c' {
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      7 X* y4 r\" b5 F% _; ]/ K
    4. tic,3 x% `: E6 U) r5 t! p% ^
    5. d=a*b;! H9 S3 N\" B1 I& w2 i' M# p
    6. for i=1:1000000+ L  R0 y5 H\" L
    7.     d=d*c*b;
      ' A8 @' v% g5 k! Q6 ?0 h\" K
    8. end
      ! J6 y% W+ |  h  m4 D) Z- p. C
    9. d,
      3 Y0 Z6 l, ?% `3 e6 I' K: K, Z
    10. toc
    复制代码
    结果:
    1. d =
      5 U% d- b% |\" V\" s5 J
    2.      4     56 m; M# F! O# n- r# e) H6 ]9 U
    3.      5     45 |3 l: n2 R- c* I7 u$ E
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。" P& m+ P, z2 J
    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, 2026-7-17 21:31 , Processed in 0.443375 second(s), 52 queries .

    回顶部