QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8448|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。6 c* x' g- _* _% d1 b& {" Z

    ' [# u9 A# @+ d1 p! j8 i- H    基本要点:
    3 C/ s& F- ^! |6 ?" L
    % H/ U& U/ ~/ n9 v- ?    (1)为扩展类型matrix编写运算符重载函数OpMatrix。8 h/ ?  J7 Z+ q
    - q& M. ~7 }' V8 T. E- i" h  r! e
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。* X, u4 h& A: q/ g

    / |$ k, E7 u* @    (3)为扩展类型matrix编写其他操作函数(本例未提供)。( r  O8 j/ ?& V+ b; w' A; d
    / X/ g5 ~. G: H0 g' n
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. % @1 |3 D3 U5 r) W6 D7 ~
    3. #include <iostream>
    4. ; x4 P# |4 _8 L  K
    5. #include <math.h>
    6. / `# v, @3 a  @5 L
    7. #include "lu32.h"- l1 A; i$ ]+ o& H5 a
    8. , {$ M3 ^$ o& {$ g) \/ I7 }
    9. #pragma comment( lib, "lu32.lib" )! ^0 X+ ]1 D\\" p- U

    10. 6 p  k6 {4 ^% B2 y
    11. using namespace std;
    12. ( D1 R; o4 m5 H% i- ~2 {; D, _2 H
    13. + J2 [3 L. y/ n9 S, Z8 v
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定1 r+ F# |; i5 U9 j3 r6 D  Y0 D: m
    15. ! M\\" i+ }( F$ M- }, D0 v
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    17. 9 B- d1 o2 Y( C3 V' E9 z$ F* n
    18. {$ b' a; Y4 F7 O0 l/ Z3 c+ @5 }
    19.         wcout<<pch;. _& O6 ?% ~8 l
    20. }
    21. 1 P2 W. Y7 `: y) v5 s& @: N
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做$ |  n/ N9 _% d% o( J
    23. {
    24. / X  U, M! L8 R2 {- L
    25. }
    26. 3 E0 E* _& \* _% l5 E
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数6 J$ o: M  J, O! W9 m) W' B\\" H
    28. {& f( B* @, @; S' J) D& T' H- s
    29.         LuData a;- j* y& ]3 t  V5 {% D3 _% h
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;1 o3 z. ~' H& K3 i. e
    31.         luVOID i,j,k,m,n,u,v;- N' z) X, ]4 A( A+ ^
    32.         double *pa,*pb,*pc;
    33. ; `& V- P\\" N7 T- b& u5 h+ a* D
    34.         luMessage pMessage;
    35. + z; q1 _. a0 k; a
    36.         wchar_t wchNum[32];
    37. 3 }- N) u. U! q+ {& u
    38.         char chNum[32];. k/ y. I8 g  p% c% A
    39.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    40. % X9 O# L6 S3 X4 p9 d% h4 {3 v3 z  n
    41.         switch(theOperator)
    42. % _. Q8 ~! `% F# @
    43.         {
    44. . h+ o+ G- @) T0 u
    45.         case 2:        //重载运算符*
    46. ! b4 u0 v+ B! D, b
    47.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    48. % B# o* n8 G/ |% M8 k& T0 x
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);9 ]9 m7 D7 d+ x5 _$ j2 f
    50.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    51. / j  Q6 j7 _0 H# N, o
    52.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)  Q3 @: Z0 W( C3 O7 ?: M. i
    53.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    54. * o4 P/ E\\" @3 c! R: H* G
    55.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    56. 7 S3 E/ `, n! I- L; q
    57.                 if(!pRealArray3) break;
    58. , O7 ^2 t3 m6 h
    59.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    60. 4 j3 g2 r# e  K7 c8 L
    61.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    62. 9 w; t/ K: t! Q+ p
    63.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];# I) X8 D6 S% |: Y- x- E
    64.                 for(i=0; i<m; i++)        //矩阵乘
    65. 2 I& i5 ]  ?$ E9 {; C, `
    66.                 {9 F+ [$ P7 p' p- l& H
    67.                         for(j=0; j<k; j++)8 g9 b/ C8 W\\" u8 A  X+ {
    68.                         {
    69. 4 t  C- W% }2 t* w8 G3 h
    70.                                 u=i*k+j; pc[u]=0.0;
    71. ' {/ x; E\\" M  a( ^\\" x$ u; S/ M
    72.                                 for (v=0; v<n; v++)  P) m2 ?3 T2 H# \\\" q$ {/ \0 L7 y
    73.                                 {  E4 J% B+ _$ s  u\\" V5 c
    74.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    75. 0 F# n' m$ L; `/ j( Z+ r# \/ J* c
    76.                                 }
    77. / y; ^2 E  P: _\\" f
    78.                         }
    79. 3 g5 U4 P# ^6 M2 X& h: k7 f
    80.                 }
    81. 1 A: d, I7 v. x' o, F0 Z/ g# O
    82.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象) ^  t- _6 \/ D2 q  _: D. O3 c2 U
    83.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    84. % Z6 h$ g& t: M5 V* p$ S9 s
    85.                 break;
    86. 8 P& S* p4 u- S- Z2 }/ [+ B
    87.         case 25:        //重载运算符.*
    88. , X' O! q+ L3 ?0 v
    89.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);% y# o\\" q  e. u6 @# ], J) P0 G
    90.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    91. 1 i; p2 `' \* M6 e
    92.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    93. ' F9 q8 b- u+ I
    94.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)/ Q' O8 Q4 Z8 q* {/ ?6 ~8 G0 ^% R; T
    95.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同' z2 b\\" L( [2 ~6 V+ ^' f
    96.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象3 \! l! G' @% o7 @# L+ t
    97.                 if(!pRealArray3) break;$ B& }% p2 Y. k
    98.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    99. 1 E: o8 i. D4 _0 y
    100.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    101. 6 T) U3 N. S/ Y: B3 q$ \/ r
    102.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    103. * e8 H6 P# d$ `* g! |0 P
    104.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    105. \\" a\\" e, x+ F2 V) T2 ^9 p
    106.                 break;, `, W, a2 @2 b* D( Z
    107.         case 46:        //重载函数new
    108. ) c. u3 _& z5 t5 }3 e9 V7 D
    109.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数* J* r* L2 A6 o* N7 C8 C\\" b
    110.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型4 g. L8 `3 L( n3 s
    111.                 break;
    112. 1 a! y  l\\" i, V' e2 \5 M
    113.         case 49:        //重载函数o
    114. * U2 n' X5 T7 x# U# T
    115.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);  o* ?/ @! Q  L6 j8 T
    116.                 if(!pMessage) break;
    117. 8 i9 v. [: ], j5 E/ p- V+ B
    118.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    119. 6 a' |4 t$ p2 R- C) A8 W& W
    120.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    121. 6 b9 H0 r; H6 o7 }8 H+ {\\" @; u
    122.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)0 g. Y3 Q8 p1 l& X3 {
    123.                 pa=pRealArray1->Array;
    124. ; K/ [, v+ P/ @3 u* V2 Q3 P8 s
    125.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 D7 {0 E8 V+ R4 j9 I6 G
    126.                 for(i=0; i<m; i++)        //输出矩阵
    127.   }) V+ m; M9 b  p5 o
    128.                 {
    129. \\" ~3 U' P# J3 f* H
    130.                         pMessage(L"\r\n"); k+=2;
    131. * @6 P8 ?' W% R, k0 I6 d4 Z
    132.                         for(j=0; j<n; j++)& o, G+ O; a6 g/ ?
    133.                         {
    134. ) K) l# _5 _. L; S! I% R
    135.                                 _gcvt_s(chNum,pa[i*n+j],16);
    136. ) W% O\\" ]' _- K3 D* Z5 b\\" G% R
    137.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    138. * D) M; Z, q: d' p2 ?  O7 l8 B, o
    139.                                 wchNum[u]='\0';$ F# B% Z2 A: h3 U3 s1 R) v- ?
    140.                                 pMessage(wchNum); pMessage(L"  "); k+=2;+ w: h/ I- A' p1 ^5 P& @
    141.                         }
    142. ) F# J2 [; T9 ]) d) s/ r
    143.                 }7 q& d& I' ?) z6 x  Q8 ]; n
    144.                 pMessage(L"\r\n"); k+=2;8 N( c3 V0 L8 Z! v8 T3 }6 s
    145.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    146. + K  ?6 t9 s% ?
    147.                 break;, l0 W( v7 @& c& J% Y# D
    148.         default:
    149. 3 \: Z1 [- Q1 l+ p
    150.                 break;
    151. ) }! u9 ~: Z( D: n0 ^
    152.         }
    153. - T& c% o- C+ C\\" W: `5 U: W9 g
    154.         return a;! I$ j0 ~  `6 N9 q; [* E) V, |
    155. }
    156. # K; i1 T7 Q$ T
    157. void main(void)- b6 z) I2 s( L1 `) o\\" }% F% M
    158. {
    159. 8 x; s( w  y# J% m4 g\\" P
    160.         void *hFor;                //表达式句柄7 s8 X\\" C$ g  a\\" L; k4 B
    161.         luINT nPara;                //存放表达式的自变量个数
    162. + M- `: f, A, g
    163.         LuData *pPara;                //存放输入自变量的数组指针
    164. $ B! n4 |2 K$ b/ q) ^% R5 ?  ]\\" x) p% b
    165.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置. ]0 i, N& u+ b: X# c% k' H# U8 o
    166.         int ErrCode;                //错误代码
    167.   d& l/ a0 r- j# D' w2 X
    168.         void *v;
    169. 8 Q+ ~9 _5 y8 Z/ F/ S
    170.         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.]}";//字符串表达式,矩阵乘
    171. 2 d# R/ ?, O) G* t
    172.         //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.]}";//字符串表达式,矩阵点乘
    173. + n# O% H5 W: @7 I/ B# j$ t
    174.         LuData Val;
    175. . Q. L  P# V3 R, _$ `9 M! |. s
    176.         if(!InitLu()) return;        //初始化Lu* g9 F& ^6 r, H  a' O0 G  v% ?
    177.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型$ n) w. Z# w2 m; R
    178. ' J% @; ]7 |, J7 p/ ~% z
    179.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量0 C& S$ o4 |3 X
    180.         SetConst(L"matrix",&Val);        //设置整数常量/ z+ e( k! m1 K
    181.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    182. ; n; Q- n1 o  ?& P' W: O
    183.         wcout.imbue(locale("chs"));        //设置输出的locale为中文: t\\" X- ?' S4 [; i  Z
    184.   
    185. 7 d8 a' @, Q& k$ r3 u4 @
    186.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式8 K/ l7 T, K: A, e( ^- S) u9 J
    187.         if(ErrCode), u$ n4 M* h% Q; L4 i
    188.         {
    189. 9 i7 z( j: Z- b' Z# O
    190.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;2 I\\" J% J6 E) s  Q5 M8 R# F8 }8 T
    191.         }- x$ c8 ^$ v\\" |$ f
    192.         else
    193. : z$ X- u( g9 l. T9 T% v
    194.         {
    195. # ?9 N8 t+ ^& w$ t' ]* p& w
    196.                 LuCal(hFor,pPara);        //计算表达式的值! C( ?. z* C+ o
    197.         }
    198. + J* a5 o% j2 \6 `, h, v
    199.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用6 _\\" ~+ x3 p6 x! _\\" G/ o: E9 V* T
    200.         FreeLu();                        //释放Lu
    201. 4 p. ?8 D8 k; n
    202. }
    习题:6 o  L$ i: I- K% u
    : l' R. S; M+ {4 V" x5 e
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 5 q- `! A7 \  L) f
    - I+ Q$ U8 k8 y; U9 w: M2 E
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=\" @0 y6 E! g: D- A
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],# I) \- ?  m) q* M8 k# I. l
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      1 f2 M7 t1 f& P/ h
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],- [: O' C* M$ s5 f+ I$ `
    5.     t=clock(),/ ~: h2 C( W. u1 b, |. N
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      \" x! I: ?# O1 F9 w% `2 d
    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.$ ]* S5 P3 Y* g
    2. 5. 4.
      & e& O\" |1 F) w' l. s$ ~
    3. time=0.875 seconds.
      6 \2 `\" X9 i& b: E7 _$ E4 ~& A
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      3 m7 v+ H\" t$ m
    2. b=[2.,1.;1.,2.];
      3 a, U% ~2 f- U
    3. c=[2/3.,-1/3.;-1/3.,2/3.];8 h3 |# h; X  h6 U* H3 G
    4. tic,8 F) G! T* `/ `- w7 p- \
    5. d=a*b;
      ( K  e3 `- f: q) v; [) W+ w
    6. for i=1:1000000  `( l3 g; D  X# d/ }( G
    7.     d=d*c*b;
      * O2 m\" U% j( p7 s
    8. end
      # a0 z. t: J' q' w* j+ D
    9. d,
      ) S9 s0 _6 m+ V
    10. toc
    复制代码
    结果:
    1. d =
        q# n/ k: w. j. J% x7 A5 c* T& @
    2.      4     5, {. p\" ?\" j0 p7 v
    3.      5     4
      & q  q6 u/ m& k3 {+ I
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    2 l9 a( |/ o% _( z6 N
    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, 2025-9-13 15:32 , Processed in 1.787933 second(s), 62 queries .

    回顶部