QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 9007|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。1 q: Y  M) T# W; ^& }  j
    ) k  ~6 O) p, D
        基本要点:
    - k! P2 p0 z( ^9 a% @" ~+ t0 H
      D( m' v% t' ?0 o1 _* m% x    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    % u' U8 S% r0 a) s" |6 x! m; u
    1 ?% j  N, t. A    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。4 A6 O( s  t) R# A. p
    / z9 b# T/ y, m* e" Y# }# Q9 l
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    5 J* e! R  a8 v  G6 A; j1 p' D0 ~+ Q; M7 G! l7 w" t
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. \\" C: I# z, ?4 ^6 K9 Z5 T6 w
    3. #include <iostream>/ [7 f! ~  U# V
    4. #include <math.h>; v& x9 c. |- t3 p
    5. #include "lu32.h"6 ]% v  F+ c! D6 o/ j9 G8 l+ B
    6. 7 N, E# i# ]. i, T# N% X8 |
    7. #pragma comment( lib, "lu32.lib" )
    8. 5 L! i1 {8 F/ j* ]\\" p/ a7 o

    9. / z- H, R+ z& y+ H2 z7 s' L0 q
    10. using namespace std;  e0 U. @5 U9 R$ D) w

    11. 6 z4 w3 }5 V( x+ \* o
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    13. # [\\" F2 y: O! Q

    14. , v7 c; i+ N; j$ A7 ?# Q2 d
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. \\" ~( Y. U5 A( y! F: C; k. k6 u
    17. {
    18. 5 n9 N  E4 M' G\\" g+ b0 L3 ^
    19.         wcout<<pch;! j9 G9 q( a, q; }3 D8 ?& W
    20. }* }' t  @/ i% U/ @1 |0 ~3 h
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    22. 6 {) F$ X5 q6 f  i1 V6 b' ?% Z
    23. {
    24. \\" ]' z+ e0 `# I
    25. }! l\\" j$ O5 i0 p
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    27. ) G1 L1 m\\" P& _) f3 p8 {
    28. {
    29. * ]' E$ S% V4 b9 |- B( R  V
    30.         LuData a;
    31. - D. m+ {, n+ e& w
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    33. 6 i# A  U- c% ^# U4 G5 l
    34.         luVOID i,j,k,m,n,u,v;
    35. / ^) {7 `* i% T\\" V1 h5 d
    36.         double *pa,*pb,*pc;
    37. 7 P% B; d; J. k' h
    38.         luMessage pMessage;
    39. & y' N2 K1 @4 q( n
    40.         wchar_t wchNum[32];
    41. : @: }3 b7 S9 G0 I
    42.         char chNum[32];
    43. $ J, b! |; a& x+ |! o% F! u7 g
    44.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;- J2 m+ z+ f! k; d% V9 A- c
    45.         switch(theOperator)
    46. , n% q* d\\" H' K* q  \5 l' d2 S
    47.         {
    48. / ]5 B1 n( ~2 e% ^7 T
    49.         case 2:        //重载运算符*. @( z1 r$ Q. U
    50.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    51. 5 O7 s0 ?8 Z- V
    52.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    53. 8 ?/ N1 [/ @3 }6 [) j
    54.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组\\" J1 ]8 w  E* X: \0 \3 f5 O
    55.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    56. 5 F  O- v  s  r! J
    57.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    58. $ A- H8 Z: _8 f' I+ r: y\\" P
    59.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象/ Y+ ^8 I  o$ P$ N3 M* q
    60.                 if(!pRealArray3) break;, R- A7 {+ H9 |
    61.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    62. 3 w. _9 M$ T: Z# g
    63.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;% U; L0 m' v' `9 t7 I, N3 Y, I
    64.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];8 Q: M* l  @5 Q4 \
    65.                 for(i=0; i<m; i++)        //矩阵乘
    66. % Q9 p5 F6 T/ A$ D- ^9 `9 @6 F4 F
    67.                 {
    68. 9 d/ Y! N- y% W
    69.                         for(j=0; j<k; j++)
    70. & e6 ], a3 O; U\\" ?$ b. J5 H0 V# z
    71.                         {
    72. 2 C* D: E! u2 B, T
    73.                                 u=i*k+j; pc[u]=0.0;
    74. , E- I# B0 R- `% z5 ^1 H
    75.                                 for (v=0; v<n; v++)
    76. 1 r# y) O: h) ?4 g- a
    77.                                 {
    78. ! Z, U* z5 [6 X- F# I2 H% r. Y- d
    79.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];3 L/ g, \. k, `. Q* y+ `
    80.                                 }! G' ]# p1 S8 d\\" Q\\" I1 }0 C' h
    81.                         }9 ~5 W$ c; F' r( M( V7 h( m4 ~1 U+ S# A
    82.                 }
    83. , h1 g& ]1 P8 C# [8 l# R! u
    84.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    85. 7 U* ]% k4 x* h0 B1 \
    86.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;6 ^  U) a9 W6 z3 v
    87.                 break;
    88. + P, K8 \; V; W0 i; `0 ?7 z, \) y4 w0 v9 v
    89.         case 25:        //重载运算符.*
    90. # K! W7 z' k% e% c7 Q- Q$ w
    91.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);7 z8 C8 e) w) |
    92.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);6 M2 h/ j/ O5 _: ^& l& ~\\" ^+ j
    93.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    94. ! Q' O3 ?8 x/ W; F; M% ?7 f
    95.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)1 \( m  f, C5 p1 e& T2 [\\" J
    96.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    97. ! r0 m3 L3 Q/ D& \/ w( f- \) g
    98.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    99. ' v' e8 s+ r  N2 p& ^- C& p4 }, E
    100.                 if(!pRealArray3) break;' E. U1 ^8 `3 e, E, l* ^
    101.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小# g2 b4 d. J7 z# Q* u! d6 A\\" }
    102.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘6 _, v  {) Q* T% Q) V5 ]
    103.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    104. 5 X8 t9 H# _  c+ I2 V
    105.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;* {0 ]( p2 v7 P1 j
    106.                 break;, h* k: w! s! P) e; C- F: j
    107.         case 46:        //重载函数new
    108. ; O! y3 `2 Q: J
    109.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数5 d1 _% u& X5 V/ x
    110.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    111. & D) Y1 ^6 Y, u3 ~! h
    112.                 break;) d& m; y/ s\\" T9 c# w1 ^4 |& L5 |* F
    113.         case 49:        //重载函数o6 A! u0 U+ j% U0 R7 r  M
    114.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);2 ]/ S3 W0 I) F: f1 g9 g
    115.                 if(!pMessage) break;
    116. # ~1 E& g3 Y  \6 B1 l( R
    117.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);, q, ]- X) n: k3 j  q  x( r
    118.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组7 `\\" u' }0 h' g, ?- h8 e\\" P% m
    119.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)) [4 g, X) j* l
    120.                 pa=pRealArray1->Array;8 r+ R- I) m- j( _
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;# `\\" J2 y2 U9 z9 `/ |  L4 c
    122.                 for(i=0; i<m; i++)        //输出矩阵4 m7 s5 k% \! o4 r, p( R
    123.                 {
    124. ) `% d& P- l1 S& |0 l
    125.                         pMessage(L"\r\n"); k+=2;
    126. / Q9 s) m$ B( [& k' }
    127.                         for(j=0; j<n; j++)+ `5 E! m$ d1 k; ^5 ?
    128.                         {/ v. T/ v. H+ |/ E7 o0 W. }
    129.                                 _gcvt_s(chNum,pa[i*n+j],16);, J* `5 B' d  R0 z9 ]\\" }$ x
    130.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}2 V6 j! i8 D% X8 H  P, ?0 b
    131.                                 wchNum[u]='\0';- @* c6 I) p6 H
    132.                                 pMessage(wchNum); pMessage(L"  "); k+=2;3 w' C4 q7 }3 S! {% t- c  H
    133.                         }
    134. - {! p2 C; ?; I. x  x: o$ g! c
    135.                 }
    136.   M\\" ~2 h2 X$ i2 i/ n% H- g
    137.                 pMessage(L"\r\n"); k+=2;( u5 _& L1 _& I- B. d6 [+ E. N5 V
    138.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数. ~, B# I, x. f+ r8 q\\" k* j8 ^& m2 r
    139.                 break;
    140. + X/ M% X, D. C( A7 D- r
    141.         default:5 [9 e. m0 o* y- s4 N! w6 e
    142.                 break;
    143. 8 x8 v3 `6 J& |+ ]  \# e
    144.         }. r' ?  l/ X\\" O# ]! z* L
    145.         return a;! k1 l$ \4 j* E+ Y+ _+ X; ?/ B& W
    146. }: X* r2 o  U6 H) r, U3 V  `
    147. void main(void); m2 P7 w* q\\" X1 M7 Y: l
    148. {/ G* g) ?: o\\" v+ Y$ l' [3 j
    149.         void *hFor;                //表达式句柄2 L% V& [3 a$ K' H' u
    150.         luINT nPara;                //存放表达式的自变量个数
    151. * g, X2 U\\" \, ^* J9 x\\" J
    152.         LuData *pPara;                //存放输入自变量的数组指针
    153. \\" V# G( K1 k; U3 p5 A
    154.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    155. ! u9 h4 y& B: q1 s1 G
    156.         int ErrCode;                //错误代码6 ]4 @! \/ q1 [, V8 L4 f
    157.         void *v;
    158. 0 r, @' `8 }2 W
    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.]}";//字符串表达式,矩阵乘
    160. ( z: e& ~6 \3 ]' ~  {( V
    161.         //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.]}";//字符串表达式,矩阵点乘
    162. ) T- t$ D, s2 G4 v: h
    163.         LuData Val;
    164. 0 ?9 P, |) t% O! e/ g
    165.         if(!InitLu()) return;        //初始化Lu3 h; Y6 F/ J, p8 ~
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    167. $ K2 S; p. @) P+ R# V' J: c
    168. 2 {- T0 Z( w. z\\" ?8 H
    169.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    170. 9 Q\\" A0 a# x  }: G2 V& e, X
    171.         SetConst(L"matrix",&Val);        //设置整数常量
    172. $ r- Y\\" p/ R2 `7 A7 N
    173.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    174. 2 b0 e# z8 V: g8 m. ]
    175.         wcout.imbue(locale("chs"));        //设置输出的locale为中文\\" ~/ U$ Y0 i- A/ R
    176.   
    177.   j6 Y3 ~+ p- o6 E- [
    178.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    179. 2 ^5 f( p7 B7 h% e\\" w  g1 |0 x
    180.         if(ErrCode)
    181. 5 l2 {8 }% i; y. s' V9 E2 i
    182.         {
    183. ) j; p# Z  o5 W3 F! A
    184.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;! H' Q/ S\\" P6 d- ?, T
    185.         }
    186. , m( q$ h; p( f, g8 u& }
    187.         else
    188. % Z+ ?0 n& o7 v( l
    189.         {5 ~& V& r7 e, M) h) O8 W3 s4 s
    190.                 LuCal(hFor,pPara);        //计算表达式的值5 F: G0 g% ^$ G( [2 ?
    191.         }
    192. * R$ |9 h5 P+ [# [! Z
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用& `+ C5 a4 [- s% t% E7 N* v2 ~
    194.         FreeLu();                        //释放Lu
    195. - Q2 n0 h4 ^3 E0 d
    196. }
    习题:
    # i' W. f5 |1 s5 r/ A$ \: L3 n4 U
    $ A- T3 `: q2 ]- t) O    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 4 {# b# R; b- W6 c3 s+ S% L) [

    8 u) u$ W/ s) N, d    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=4 q* n1 Q% g$ x1 A& E
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      2 P6 ]6 I/ D* O  I$ ?$ e
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      \" g& O) G0 X9 a9 o1 q% }+ }/ a, v: E+ L. }
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],( h! y! N: k1 `8 e5 R* K! Z9 e- i
    5.     t=clock(),* L8 U# k! N) X
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},4 ]0 c. t2 M1 I1 Y
    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.
      . v+ P7 ?5 c8 U& C
    2. 5. 4.
      3 L6 M8 p/ B7 B7 V; f) K
    3. time=0.875 seconds.\" J6 U$ Y; e\" y* J
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      3 {3 L2 Y: |+ d+ a* a4 P
    2. b=[2.,1.;1.,2.];9 z( B% p2 K: j& Q; y7 U4 N% `
    3. c=[2/3.,-1/3.;-1/3.,2/3.];; |8 ?; v3 V% r
    4. tic,$ j4 O4 b+ h1 |5 ^6 @4 X0 z( V
    5. d=a*b;: d0 r4 @2 D4 Q% \( s$ f
    6. for i=1:1000000
      \" h% E9 @* s\" Z* S0 F& f8 C
    7.     d=d*c*b;
      ! e, C- L: }( `2 d\" E& `, V% @  ]9 c
    8. end
      8 l' F' f8 G) O& z3 }0 d
    9. d,
        A* J/ {( J0 D
    10. toc
    复制代码
    结果:
    1. d =6 H* l& \! h+ H0 a* e( R
    2.      4     5, V2 _+ _8 m, P* ?$ }+ f7 S
    3.      5     4, W* y+ P* U% h1 s& w
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    2 i: {# t8 t" C4 n- a2 @: U0 h, F2 ]
    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-10-9 02:28 , Processed in 0.416599 second(s), 53 queries .

    回顶部