QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8511|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。7 Y( y, x# d3 D$ f& e: w6 z

    5 k# h3 v5 [) ?    基本要点:
    " V7 d( v, i) S
    & l' ]: d+ o% x4 s4 `8 W    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    : ?& r% A$ T5 R% h& w4 G7 H# n, o6 m, e1 g3 ~5 c
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。. x8 m2 V; ]1 h

    ) W; m, J  d  w* [: s    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    , W( n- J, K6 |. ~2 \! i( s8 l6 I, f  G. b* z, K
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>/ Y# u* F1 b1 B3 Z9 {
    2. #include <iostream>
    3. 4 E  ^- f, I! X' B  A, D3 ~
    4. #include <math.h>' m- I1 G2 j9 r
    5. #include "lu32.h"
    6.   K- @2 o. A/ J

    7. ' C& J9 A9 p& C' {- G: S
    8. #pragma comment( lib, "lu32.lib" )9 z# L3 s- F$ Z. T\\" [( u; G  [\\" [9 F

    9. - `% n7 y; }; i/ E
    10. using namespace std;- n; |( T- D/ _8 `3 W  ?4 s# S

    11. * ]( x/ ~) [+ E+ M9 K0 O$ Y
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定: x7 J) d0 C, y2 Q: h4 X& i
    13. : L# g6 b! j  F4 z  u
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 : p  x7 m4 Z# B# S1 C
    15. {5 J) Z' B1 t: b
    16.         wcout<<pch;& Z  B' M3 b# [! Y7 T; N$ C! `: Q
    17. }
    18. ' p- L; ?4 \6 j8 H* _2 s* k4 j
    19. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    20. * e# u1 ?\\" O6 n& N
    21. {
    22. ) a6 g# N- O  [. q5 R& f% q1 S; h
    23. }. b0 ~4 B: ^# A5 J- e7 Q
    24. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数+ p& o! K( C/ d( U4 q& e
    25. {
    26. ) D; d2 }: Z9 w( z3 Z5 D
    27.         LuData a;
    28. ' T  y* j# v- h& n# s\\" y* _5 `' t) R
    29.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    30. , _& n, p) W8 p: o
    31.         luVOID i,j,k,m,n,u,v;\\" X$ F9 u8 H8 e5 ]
    32.         double *pa,*pb,*pc;
    33. 7 k; C\\" Q8 o7 ~3 a
    34.         luMessage pMessage;  [) ?1 W0 O+ E' `. F  H5 q
    35.         wchar_t wchNum[32];
    36. ) t; G9 m; W4 j
    37.         char chNum[32];. ?+ C9 _7 I+ E/ A$ d4 R
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    39. 6 K* _) R3 `: F2 _/ Y
    40.         switch(theOperator)
    41. $ q8 m: ?8 I9 ?. a2 N7 ^$ X' M7 w
    42.         {$ V0 t6 _, o/ ?: ^
    43.         case 2:        //重载运算符*
    44. 9 Q, d, a\\" n8 m* v! I
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    46. \\" p/ U( W( E) U. L) V2 D% J1 K
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    48. $ X+ G; f) a- v3 |: q
    49.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    50. ) n8 L9 S/ _1 J* Y0 P
    51.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    52. ! Q, b2 S% L, }# y: z
    53.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    54. $ a7 {, h: r# b) [* u
    55.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    56. # }1 K  G0 t: {' p, ~. E
    57.                 if(!pRealArray3) break;
    58. 3 h# P# X\\" [- R, R
    59.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小4 Y5 b, ?) G  ]) J
    60.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;2 G) c: H; H$ K* v3 y
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];$ Y. r  N; D4 c; k
    62.                 for(i=0; i<m; i++)        //矩阵乘8 s* u4 u0 d$ ?$ U# C) y( b
    63.                 {% X# |* }# c4 l
    64.                         for(j=0; j<k; j++). Y+ Z+ C& ?, s& V1 `
    65.                         {) D. g2 i8 o, N/ y9 U
    66.                                 u=i*k+j; pc[u]=0.0;3 |' M* ?5 i1 w  n7 O, q% r( |
    67.                                 for (v=0; v<n; v++)
    68. ! U# F1 _  b8 q' [! [$ h, u' }
    69.                                 {
    70. 1 a0 r+ K5 d; c
    71.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];, B/ L# l7 {2 i4 Y* G) m
    72.                                 }9 b9 B\\" l% n* F& I6 F9 y
    73.                         }
    74. ) P, D/ J' ~+ Z/ D- E
    75.                 }
    76. - n% \: h- [; d) O
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象9 a& C* D. R  l
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79. $ _  k4 K% A8 h/ \! g/ v
    80.                 break;, Q\\" L! r: c, i1 E# h$ l+ }
    81.         case 25:        //重载运算符.*! v1 e! a6 T9 H( s; A0 a
    82.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    83. : D( h8 M: y# z+ g* N
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);* ~2 T9 z& \/ r: S8 [* b9 H) M2 U
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    86. & D3 Q: n8 c: X, _) i1 N$ d
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)- s9 u: y4 ]+ d6 r9 _* D3 c( C
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同5 W5 y\\" c) k1 g6 g. w
    89.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象  g8 w/ }' W* a1 r# i/ X: I
    90.                 if(!pRealArray3) break;
    91. 3 M2 h1 f( O- I
    92.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    93. : T2 {7 L' F! R4 k) l6 U
    94.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘1 p; d1 V) P! f: n. [
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象' Q+ z3 G% }# ?1 `
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    97.   [6 f/ T6 I  L7 [1 o
    98.                 break;
    99. \\" n1 L  \! C' F' ^- u  T
    100.         case 46:        //重载函数new
    101. 6 Y( b$ j, p- d
    102.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    103. % c# U7 x8 }& b& H- K
    104.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型5 N  U\\" O! }! ^, f. P' A6 R
    105.                 break;
    106. / ^% a. f. F+ y
    107.         case 49:        //重载函数o( g! B$ Y8 f0 K# b3 {7 C) a
    108.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);% H! u& q\\" E4 h/ s% ~9 |: W+ @
    109.                 if(!pMessage) break;
    110. ) S' m; I: t& h. K; Q\\" n. E0 a' _
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    112. 7 [/ I& `5 ]5 i\\" J5 z
    113.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    114. & D7 @\\" S0 x6 l; {2 Y
    115.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)( E+ C7 a0 E% X9 N$ P2 f7 K2 Z* Y
    116.                 pa=pRealArray1->Array;8 l7 g) ]$ W! @& o
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;  C+ Y  s; s5 _4 C1 F3 f
    118.                 for(i=0; i<m; i++)        //输出矩阵
    119. 9 M3 l' ?: ]& g4 H  X\\" f
    120.                 {
    121. 9 E6 n* x' Y* I# N4 v
    122.                         pMessage(L"\r\n"); k+=2;
    123. ) u7 J. G3 ]* N\\" y+ C
    124.                         for(j=0; j<n; j++)$ P- |\\" Z$ b+ [: J9 V\\" @) T
    125.                         {
    126. 0 @+ n8 n2 p- t3 C1 ~\\" Q. m
    127.                                 _gcvt_s(chNum,pa[i*n+j],16);
    128. * x0 G/ O& h$ A+ ]* g, \# I; @) _
    129.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}* ]2 b1 i  @5 F2 Z
    130.                                 wchNum[u]='\0';0 ~( p% r( ~, |+ k2 J5 o
    131.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    132. ( h  S7 p* z\\" B+ K
    133.                         }' Y! N8 w5 [1 K
    134.                 }) p7 M4 r6 X( `/ U0 y
    135.                 pMessage(L"\r\n"); k+=2;$ H4 |\\" y, U  l; c' D' H5 t
    136.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数8 r. x8 f3 v# ?\\" W$ [! V+ u8 V5 i
    137.                 break;
    138. 6 M% \+ j- D8 y
    139.         default:
    140. 1 m3 `( R' ^0 j2 L& T
    141.                 break;
    142. \\" W8 y\\" f4 ~- \
    143.         }3 R  H) p' l4 t+ R/ @) N
    144.         return a;, t) l) H# r  K; ?
    145. }
    146. % r' J& {4 L# @. H
    147. void main(void)3 o, H+ `5 b3 e$ ?/ s$ ~
    148. {. e1 r+ x2 P5 j
    149.         void *hFor;                //表达式句柄
    150. ' V. k) |2 ]- h0 H/ _
    151.         luINT nPara;                //存放表达式的自变量个数( w' \; C& \0 ^) e( M
    152.         LuData *pPara;                //存放输入自变量的数组指针
    153. % K# e- s) R+ o\\" _* }# a( @
    154.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置  y$ i! i: r2 C
    155.         int ErrCode;                //错误代码
    156. $ J1 N8 @7 m  z1 U5 x+ D\\" H7 K
    157.         void *v;
    158. 3 r, d% d2 I( u! r/ M7 c4 t
    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. & i$ ~% w/ `5 K( c+ u1 Q
    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. 5 b3 ~, h8 \5 d2 z1 f
    163.         LuData Val;* ~\\" `, o9 y: r! C- ~
    164.         if(!InitLu()) return;        //初始化Lu
    165. % x9 |# V) H8 ]  @
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    167.   z2 E% T: N9 E7 V% A0 s
    168. * U2 ]% H. h: h  b. A
    169.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量& x6 W2 e8 U7 {% F, q
    170.         SetConst(L"matrix",&Val);        //设置整数常量
    171. . f( ~( d0 Z& \% q5 H
    172.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息9 _\\" Z% m2 S. E3 d, X4 Y0 K
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文( o6 C\\" I# l9 K5 R! d6 J
    174.   5 ]* i4 t% u( k2 e' z  x/ N\\" N
    175.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    176. $ a1 T$ d\\" t5 G+ a/ F2 V\\" {+ s
    177.         if(ErrCode)) B) u! R; C% a! M+ m% m
    178.         {! p2 t, Z7 s% }& v; Q' @+ q9 q
    179.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    180. ! g3 A' T8 W& k+ b  M+ o, J
    181.         }
    182. & Q$ u- n* I9 _4 @; c  Z  @
    183.         else
    184. 2 B7 T2 N1 k, w% y
    185.         {5 L8 Y% |; H8 `) f\\" J+ N' f
    186.                 LuCal(hFor,pPara);        //计算表达式的值
    187. - ]2 |  U) F5 f: d+ z
    188.         }+ v- O7 s5 X6 [2 i
    189.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    190. 7 {* X  Z$ Y% {! x+ D
    191.         FreeLu();                        //释放Lu
    192. . f\\" C: Y! O/ J/ _$ r7 Z
    193. }
    习题:
    , H# }, ?( ^1 x2 m- d8 m% i& e2 l* U2 s' R
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    ! ]7 O6 D1 ~/ q& s2 F! r0 G" s/ y+ s$ Q& o9 R# t  D# L
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      3 ?5 l1 g, x) j# y) H$ b& i& v
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      $ Y: a0 Q4 f3 p- H6 E& A\" p8 q# K
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      6 P; M( c$ ?/ y' {
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      ! p\" G% a, ?$ {& j) J
    5.     t=clock(),
      2 v  t% q- s0 C
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      \" x' H  Z. u7 _3 E+ B& u6 O4 ~
    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.
      2 X; b# O; I5 v+ }
    2. 5. 4.3 |8 b* D3 K, f+ w$ U
    3. time=0.875 seconds.' G, G0 d2 N& s8 j
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];' o# G# D- M8 S\" o; R# p
    2. b=[2.,1.;1.,2.];
      ; P( S  N7 |. V3 X8 e
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      . y! x0 k- y) {. |5 V
    4. tic,
      ( \- l7 H8 W. r7 Z
    5. d=a*b;. O% [4 p4 R. i* ^  q
    6. for i=1:1000000
      # K- P# e/ [2 C4 M% y1 ?$ t
    7.     d=d*c*b;# o6 N- ]8 i2 L7 }
    8. end\" d( ?\" R3 _; H: V9 i
    9. d,, x! ]3 N! B. S/ v0 d  |\" d8 K3 x0 A. {
    10. toc
    复制代码
    结果:
    1. d =$ \& `5 l0 T8 I5 e
    2.      4     5
      6 K9 i! [0 |0 w\" {6 F
    3.      5     4. H2 u; C) w( y. K# s6 U+ R9 D
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    * V) O) f4 z7 W* H" m
    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, 2025-11-12 03:33 , Processed in 1.334086 second(s), 53 queries .

    回顶部