QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8823|回复: 0
打印 上一主题 下一主题

Lu基于系统内置对象创建扩展数据类型,小矩阵乘效率测试

[复制链接]
字体大小: 正常 放大
forcal 实名认证       

45

主题

3

听众

282

积分

升级  91%

  • TA的每日心情
    难过
    2012-8-27 18:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    #
    发表于 2011-10-23 09:37 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
        本例中,我们将基于系统内置实数数组创建矩阵(matrix)类型,即:基本类型为luDynData_realarray(标识实数数组),扩展类型为matrix(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。+ [$ T& l) j9 ~  y, L
    / v0 m9 G& q: A. b+ o
        基本要点:
    8 t, x: A; e& ^: r* O
    6 e" R) Z0 @6 W8 i! B9 \) N    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    , o1 R6 L8 E# V$ e# V) u
    8 J3 e- k& `  N" O    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。4 u6 H$ D8 \1 i/ e# r( }; f$ O9 _

    " `2 H" M- M" ]- M% E) u    (3)为扩展类型matrix编写其他操作函数(本例未提供)。- a8 S% a7 l  d7 x- T8 _
    4 [; L2 f1 y& M: U3 y% [7 v
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 0 m& h& V3 U! u4 S, t
    3. #include <iostream>* j. O  }/ }% \
    4. #include <math.h>
    5. \\" Q: v8 {0 [# g5 V
    6. #include "lu32.h"
    7. + t( p2 \+ S4 Q4 W& g) `8 |\\" `

    8. ( O. @  T& i: i) T8 N+ k
    9. #pragma comment( lib, "lu32.lib" )
    10. , ]) N, X7 a) h, c9 f

    11. 6 a4 J4 V1 \! `* W8 F: ^
    12. using namespace std;0 `+ g- q0 l; k3 z! u* @% I% ?
    13. \\" j; O% {3 r! P# U4 G3 _
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定3 q' J2 t0 v4 ~) J

    15. 0 N% {5 Z/ u+ a& L
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 ' m* ]+ Q9 `3 E2 U  O
    17. {! G/ o$ y8 a  Q7 U2 I
    18.         wcout<<pch;, |5 a0 ]6 Q: b* I2 x, y
    19. }8 s' S' o5 M8 t0 {' t, S- P
    20. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做4 l1 q1 W- g$ ]- P. e& i7 r2 M( j) J& Z
    21. {
    22. 4 N. ]7 j. @\\" t! I! E: N; [$ t5 E% W
    23. }
    24.   G' `* p# y$ c3 ]
    25. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数  V- B  q8 J7 f\\" v\\" U/ R
    26. {' H2 X# r+ b5 |' h! ^
    27.         LuData a;2 V) {2 h3 K3 l. X
    28.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;( q' j: H5 l( w; `/ J
    29.         luVOID i,j,k,m,n,u,v;
    30. . p4 _* w/ t  Q# t& X+ N
    31.         double *pa,*pb,*pc;
    32. , B$ k/ o3 L0 N, M3 b  b, `
    33.         luMessage pMessage;2 U+ P1 X8 {- [
    34.         wchar_t wchNum[32];# \1 x' @+ U5 q$ \
    35.         char chNum[32];2 N- @& T+ z; F2 l
    36.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    37. : l$ v. v! j$ F- N% F1 M* e. y  N
    38.         switch(theOperator)0 p/ m' `% F+ k( G# b5 Z
    39.         {
    40. ( s# |' n; r! x7 t
    41.         case 2:        //重载运算符*
    42. \\" W) t* ^! \: x/ b+ b% w6 [0 J; `
    43.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    44. / O) G4 R% b6 G
    45.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    46. 8 U5 R  \( `5 Q2 j) a8 z\\" t, [
    47.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    48. . E4 f) s: S' O6 k
    49.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)! a. K\\" w$ ~( z4 p% ?9 E& w9 C
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    51. $ b  r* F8 y( o\\" ?- k
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    53. % V1 f& l  o4 _4 g& E- ^0 Y
    54.                 if(!pRealArray3) break;! Q( P7 c. c& k7 w+ f1 I- e3 X, H' u
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    56. 0 t9 z8 l2 Y\\" _8 }+ S! w
    57.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    58. 9 g9 }5 P( K. m2 P
    59.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    60. ! I; D+ L7 D; u5 ?0 ^\\" c
    61.                 for(i=0; i<m; i++)        //矩阵乘\\" f* d8 d  Z' F; L. [* a
    62.                 {
    63. 9 p- x. J7 g/ [+ ]/ R) E( P# s
    64.                         for(j=0; j<k; j++)
    65. # J  U/ P. k: P; r8 r! l
    66.                         {, S# p5 h' @; {+ `0 b
    67.                                 u=i*k+j; pc[u]=0.0;
    68. ( V% S4 A; M  E4 R$ H- ~
    69.                                 for (v=0; v<n; v++)2 C% r$ }4 u8 m3 o
    70.                                 {
    71. : V# t/ v' D$ |\\" z* D  {) o3 m
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];  M, i+ j0 h0 K: z- H7 p0 G9 V1 j2 t
    73.                                 }
    74. 8 ]0 s/ d5 H5 W
    75.                         }
    76. : ]- t! G! m5 l5 n
    77.                 }. [2 i/ a  X, q6 w( k
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象3 w7 c4 `$ q\\" o7 K  E
    79.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    80. $ L. ^& `# P$ X& ^$ Q
    81.                 break;% H\\" I\\" X5 k! i3 j2 v- E: B, s
    82.         case 25:        //重载运算符.*1 Z: O9 n/ {; j\\" Y* Y% F  J
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);% n6 T4 o. `' C/ l4 a; |
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    85. : p8 m3 K' \* m4 W
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组- e% i# T- H: ?( W
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    88. 6 j9 F$ T& r0 Y' p1 Z( ^/ [. E6 E\\" r
    89.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    90.   K; Z- }7 a+ [  g. O
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象* [5 J7 s, ~& }; }- q
    92.                 if(!pRealArray3) break;
    93. ; l; z8 U) A. {& T
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    95. 5 {+ O9 \' L5 {4 [& Z
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘2 O( O$ F9 ^, Z  n
    97.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象! ~* D! r& e$ k+ F, h$ w
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    99. * }1 s2 |0 Z, X/ m- Y
    100.                 break;
    101. 0 t, Q# [' u) h
    102.         case 46:        //重载函数new
    103. 9 p4 t: X2 j% w0 x2 v0 j3 o* b
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    105. ; M6 h& b, ~# O  F# r; H! T/ r
    106.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    107. % O; X; R$ f8 Z9 n
    108.                 break;3 d- A; Q6 F' S, H
    109.         case 49:        //重载函数o
    110. ( j3 a4 c! q' y- v
    111.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);/ Z+ r8 ^% i& I, s! @' z
    112.                 if(!pMessage) break;% Q, ?6 S6 ~! X
    113.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 t! V  G( w( b8 {5 s# X. g
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组$ Y+ d, R( Q9 e6 n/ f
    115.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)% j# J$ e; m& D
    116.                 pa=pRealArray1->Array;
    117. ! T  m2 u5 S\\" |
    118.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    119. $ d4 h* j$ {9 _2 m0 h$ w
    120.                 for(i=0; i<m; i++)        //输出矩阵
    121. ( F$ \5 f! O3 M) e
    122.                 {
    123. & n6 i\\" T7 f! u( J- ?
    124.                         pMessage(L"\r\n"); k+=2;
    125. 3 J1 z8 s* ?\\" h! b
    126.                         for(j=0; j<n; j++)
    127. $ r: Q2 o\\" l. s. f9 I  x2 L
    128.                         {2 c1 t$ a, c+ H7 u0 k) a: J4 H
    129.                                 _gcvt_s(chNum,pa[i*n+j],16);
    130. & d7 x; U# G7 d- S5 t7 k4 e
    131.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    132. ( v) O; A8 v& e$ n' }4 ]2 Q
    133.                                 wchNum[u]='\0';: U+ p  \' M# _+ z# z& \
    134.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    135. 2 }, {; X9 i+ M% F! v
    136.                         }
    137. ; Q) d- d4 v4 ^! u, i/ |' s
    138.                 }. ^% l$ f* S* e: W: d1 S4 X* T4 y
    139.                 pMessage(L"\r\n"); k+=2;( W6 Y; d& ~/ }
    140.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    141. & ^, j& H, B) Y+ z) d1 E
    142.                 break;, I8 b6 U& o! m/ v
    143.         default:
    144. 9 w  {& }+ Q\\" [
    145.                 break;
    146. ( }. `9 d8 V/ y; A8 y
    147.         }$ R7 |* b; k% z( {& `
    148.         return a;
    149. . _$ i7 t/ r# w
    150. }: J8 u, g6 |% w$ w* _$ b# s7 D
    151. void main(void), K7 y- t) R5 l6 m
    152. {
    153. \\" v' x9 x8 u* h! x3 F8 ?. G. f
    154.         void *hFor;                //表达式句柄* H' O! G  Q* U9 A+ |
    155.         luINT nPara;                //存放表达式的自变量个数
    156. 2 i% L$ k+ u/ X. N
    157.         LuData *pPara;                //存放输入自变量的数组指针
    158. / W7 [2 [1 P\\" J( |$ ~4 Q4 T
    159.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    160. $ D, D. F+ J: l$ b) i
    161.         int ErrCode;                //错误代码. s- B7 C1 q+ X7 O* F3 T+ W6 F\\" V' l
    162.         void *v;
    163. \\" F, o; n8 ?; T1 Y
    164.         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.]}";//字符串表达式,矩阵乘
    165. $ S* t) J9 H- f& K0 d' y, _7 c# y
    166.         //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.]}";//字符串表达式,矩阵点乘5 R# Z+ h4 d6 x0 ?( V8 Q, U
    167.         LuData Val;
    168. 6 o& W& c! a0 ^! ~$ C
    169.         if(!InitLu()) return;        //初始化Lu
    170. 6 R5 n1 o) `/ I0 y: U4 w/ e  m
    171.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型4 C8 Q# ]( H4 J) o1 e2 e: ?
    172. ' o+ u( M6 `8 F0 a1 H
    173.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    174. # g3 ]# n' }8 \2 Y% g
    175.         SetConst(L"matrix",&Val);        //设置整数常量' E8 B' h* P& Z: _6 l: y9 T  y
    176.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息8 V: |\\" x6 B$ w% z\\" Z6 x9 A2 E
    177.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    178. - d\\" p8 J( B* t  ]
    179.   
    180. + z9 k( w- I# N5 y$ W
    181.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    182. 7 B; w; p/ E2 s! b# y2 ]6 a4 e& n
    183.         if(ErrCode)6 e* z. k1 E1 U3 l: o: Z
    184.         {\\" s. G- |; A9 A% c5 t
    185.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;8 c- x6 O: ]+ Q+ M; C* d* I3 d
    186.         }
    187. 9 v\\" |. A+ r+ ]! x
    188.         else4 A6 P/ C0 u; T7 W
    189.         {1 K0 I; P! ?9 k8 q6 q2 E4 i  D0 F
    190.                 LuCal(hFor,pPara);        //计算表达式的值$ s, [- o1 z1 W% W2 N& ^9 ~! H
    191.         }
    192. & t: ~( I. u  I7 p5 m
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    194. 0 H+ d- E+ L9 h8 P$ J& N9 A
    195.         FreeLu();                        //释放Lu3 R* X7 P$ `/ o
    196. }
    习题:
    2 _3 i7 _, u" V6 x( o4 [# k9 c  t/ y1 N' ~/ h9 k* G- g
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    ) R1 Q/ ~* c8 L! j9 w" {
    , ^. v: L/ P+ K. R    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=# ~, H- F+ k2 R% L) O
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      # B2 u. d$ A6 W. u
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      % ]4 f! `+ I0 v9 \
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      3 ^- ~& o  A, g* Z
    5.     t=clock(),. R  C! G/ C. c5 n; E8 a1 w
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},8 u% T/ j5 F6 k/ C
    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.- r8 z6 `, g& |# A9 ]: Y! C1 d4 \1 _
    2. 5. 4.
      2 D$ ?+ v1 g/ k+ ~/ `
    3. time=0.875 seconds.
      \" I  A. G$ ?! d\" j! |4 p/ J
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      # z4 ]; v5 N) u
    2. b=[2.,1.;1.,2.];
      * ^\" Z* |( O. |1 V
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      # D8 k& i+ L8 s1 b
    4. tic,
      0 P8 r0 K6 h5 U* a
    5. d=a*b;
      7 I# w) B& P: ^8 E7 M7 c
    6. for i=1:1000000
        g/ j( V; n1 H! G9 c
    7.     d=d*c*b;: Q' V1 c7 k  f! o
    8. end
      5 F+ n; c( }# e. c: y% M
    9. d,# E) W6 W) y% z8 o+ l1 _
    10. toc
    复制代码
    结果:
    1. d =
      1 j, N, v+ h3 e1 l- p) {
    2.      4     5
      / h! ]8 l2 F9 \9 s! T  z! E
    3.      5     4' o3 `9 I/ q0 O. ~
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。8 B; ]1 p9 m! w0 [& X
    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 18:59 , Processed in 0.298874 second(s), 55 queries .

    回顶部