QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8877|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
      b2 m* e" m9 {6 r0 Z
    8 f8 j5 v8 j: O! G- t  U6 R    基本要点:
    - }, U5 n3 M. r  `
    . G+ R% x; F4 H: j    (1)为扩展类型matrix编写运算符重载函数OpMatrix。) h) J  z. y9 Z

    & C. \2 H+ L  r; `& w  B* n. D    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    ! J# P7 l  C0 Q0 z0 P  u$ Q
    " @7 [+ d; G$ F* Y9 s7 _    (3)为扩展类型matrix编写其他操作函数(本例未提供)。8 f8 i9 V( G" x0 _5 ~( e: F  J& ], K

    4 q  y" `; E) k9 g; _/ V' o* G# m    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>7 m4 A, g( q# P9 s& y6 H
    2. #include <iostream>\\" j  d/ [' F4 m3 [, D8 I$ }
    3. #include <math.h>
    4. 6 @8 }! t8 \7 y7 U: t+ X% X( o
    5. #include "lu32.h"# C  G* Q+ P5 t( Y2 Y
    6.   O% z/ T+ H4 d\\" f
    7. #pragma comment( lib, "lu32.lib" )- L) d9 o4 p3 i. S6 E0 F
    8. / c% |4 W- k7 v2 `7 o) m7 l
    9. using namespace std;% L# q# ^% D' F7 d7 }9 L

    10. , ?7 J; ^- Q3 E\\" U8 U$ B
    11. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定/ `  }& _% D3 G7 J

    12.   U( r+ t, l, ^9 Y3 e6 u
    13. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 - D  a' R( X9 A9 {: I\\" W# S
    14. {2 L6 k3 x! M! C# F- x  a. x  P+ Y
    15.         wcout<<pch;
    16. % `* Z& C- z4 ~* ^, _2 @
    17. }
    18. / A, ]2 K0 p\\" }$ p/ f0 `. V
    19. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    20. 5 U9 G( w7 O$ F
    21. {4 q- V8 ?8 }5 }\\" h' n2 [3 @# K8 v. r% p
    22. }
    23. , _+ y# o! u) v  m; ?/ p: X1 l
    24. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数: a( f2 l# O' B7 ?. j3 [) O  ?
    25. {. c9 a' A4 w, X& F, c, o3 V/ I$ Y
    26.         LuData a;
    27. % R  o5 Y, q  B4 U
    28.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;( ^9 }& h7 u# q  Z; T
    29.         luVOID i,j,k,m,n,u,v;' |7 _) i0 {+ o. w: g, t6 r& k
    30.         double *pa,*pb,*pc;
    31.   F- D0 M( [, U# f
    32.         luMessage pMessage;
    33. 6 g' E2 v) E# P\\" f, ?
    34.         wchar_t wchNum[32];
    35. 7 Y+ ^3 P8 B8 a( U3 L
    36.         char chNum[32];* a! e, {  Q' r/ M
    37.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    38. 6 x) V; d8 i1 h: q: Z6 g
    39.         switch(theOperator)& |1 ]5 O& y# d
    40.         {. i  ]+ ^3 n* d
    41.         case 2:        //重载运算符*( M9 {: z  O+ q\\" H8 g
    42.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* W$ D: V\\" d\\" J4 T2 [: C
    43.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);* n$ r. |1 I) K
    44.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组2 Q: E  u4 k  a3 M4 x+ o/ T
    45.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵), y: f' D& s6 O( m- x/ M; G
    46.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    47. 2 K5 ?. x: y9 i- D5 F- N' b
    48.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    49. : \! Y\\" ~( g' z$ t. S+ e
    50.                 if(!pRealArray3) break;: S! L# ?5 O0 |, c8 u! Q1 j
    51.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    52. 0 Z3 Z6 @1 C2 k5 x1 b! H
    53.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    54. % ~9 q+ }. @, f3 f3 S% F: k4 g
    55.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];' n7 x: C0 `) a/ H8 V
    56.                 for(i=0; i<m; i++)        //矩阵乘  l' L8 J6 l, ~2 O% U! ^
    57.                 {$ h- x& d4 H4 e# g7 p
    58.                         for(j=0; j<k; j++)
    59. # A# i( m. ^7 T  X4 F: a7 n0 \
    60.                         {
    61. 4 t  \5 Q. S) k6 s. j; a
    62.                                 u=i*k+j; pc[u]=0.0;
    63. 9 a! L+ _  i5 K- G
    64.                                 for (v=0; v<n; v++)
    65. 8 m9 J7 y7 S) s\\" ^% ^\\" }
    66.                                 {
    67. ) O1 F( n\\" J3 n4 J- O
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    69. 1 Z$ h' T1 s3 p
    70.                                 }  A* @) [9 E9 n3 J2 w
    71.                         }, X4 ^5 e7 r  Y/ S6 e& w; G  A8 c) r
    72.                 }- P- j% R0 h1 K$ i' Q
    73.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象$ R6 K; \( e4 j! I$ c/ X\\" p5 M! v
    74.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;: t0 ^0 |% F% l8 t, z( V
    75.                 break;
    76. & k2 N6 [$ v; u. _8 j% T9 m% C) O2 ^
    77.         case 25:        //重载运算符.*
    78. ' s\\" F3 Y: b2 n
    79.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    80. , K6 W/ O$ c5 A
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);: ?1 J- @1 {0 `
    82.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组0 K3 ~- w: P2 m) k7 V3 ^
    83.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)7 `6 o( Z. e3 q. }: _4 h$ R6 b# E* T
    84.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    85. + X; _! Q+ k9 D, J1 ~
    86.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象2 n! p) k\\" b' Q! ^
    87.                 if(!pRealArray3) break;
    88. + ^. d, f4 z$ g$ A7 Z4 G6 q, \5 H\\" Z
    89.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小2 }5 M2 d. o' q
    90.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    91. \\" y, w6 _5 x0 \# g$ I$ C
    92.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象$ V+ b' s1 U  y3 N( @9 f
    93.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;# N, z5 \3 K0 F
    94.                 break;/ L8 i, l; i+ g; g
    95.         case 46:        //重载函数new
    96. 8 P9 |( ~& h( B& q, z8 w
    97.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    98. / W2 N4 F, g4 M9 R6 U. [
    99.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    100. # y9 X+ ~3 X, J' C3 H$ z
    101.                 break;/ ?: P0 F+ n9 D) o\\" n9 H
    102.         case 49:        //重载函数o
    103. # j( M5 B5 J$ r# \
    104.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);! P, g9 w\\" E, ]4 [- }/ N
    105.                 if(!pMessage) break;\\" F\\" T# f\\" m2 s
    106.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);) L- A- u/ `& a$ e. F6 `+ @
    107.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组1 Y% |7 s: y. _- u& B1 p2 r
    108.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    109. 0 h% r1 ~6 T3 n
    110.                 pa=pRealArray1->Array;2 V' ]* B3 w6 ?\\" e7 \
    111.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    112. 0 D2 B, o6 y$ P: y+ H4 d
    113.                 for(i=0; i<m; i++)        //输出矩阵
    114. \\" m* D2 \( X1 I) T
    115.                 {
    116. \\" I' Q& k; Q/ h! e; r: \
    117.                         pMessage(L"\r\n"); k+=2;
    118. ' S1 a8 D6 ?\\" f+ h2 y
    119.                         for(j=0; j<n; j++)
    120.   }+ v$ {2 Y  o) f# T
    121.                         {9 P% n4 C9 q( D\\" U) J1 [4 ]9 d
    122.                                 _gcvt_s(chNum,pa[i*n+j],16);
    123. * U5 ~) b& e6 Z
    124.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    125. ' T6 Q) B: i3 G
    126.                                 wchNum[u]='\0';0 o- p& v1 ?9 t' b
    127.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    128. 8 B' e0 t; x7 Y8 t
    129.                         }2 Y8 _* g- c1 V
    130.                 }) Y9 z' p( ^; b1 @
    131.                 pMessage(L"\r\n"); k+=2;
    132. \\" z, h; H\\" S7 \, o
    133.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数0 D$ r& Z* n; F0 O' J\\" `
    134.                 break;
    135. 4 a4 P( C6 g, M
    136.         default:0 Z1 {: l( `3 x6 f
    137.                 break;
    138. ( L# p8 ^8 d9 F
    139.         }# k( z2 S7 h( e4 a: K\\" o. Y1 }
    140.         return a;\\" A) K: [, Y# L: F7 v
    141. }
    142. ( ?! g& E4 D\\" ]! @7 W7 n& g
    143. void main(void)
    144. 9 j4 Q$ U0 l: h6 a8 f7 E6 F$ l% o; f
    145. {5 n& v7 E. l$ W* P: @
    146.         void *hFor;                //表达式句柄6 L+ ?- `% J) C
    147.         luINT nPara;                //存放表达式的自变量个数$ X# S% b, }1 @9 ]5 t+ W3 Z8 Q: [
    148.         LuData *pPara;                //存放输入自变量的数组指针, P  Q: V( a+ a
    149.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置. O- w\\" k# I7 p) k$ S7 K9 k7 x2 l
    150.         int ErrCode;                //错误代码8 q% N4 _\\" l1 Y
    151.         void *v;
    152. * X( t; w& e8 a
    153.         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.]}";//字符串表达式,矩阵乘
    154. ) ]6 q+ D  h* z1 H( R  E* N
    155.         //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.]}";//字符串表达式,矩阵点乘- L: h/ {: O6 J. v% y% F1 b
    156.         LuData Val;
    157. / e# K; S5 l+ C' }& ?$ M  v2 e5 V\\" [
    158.         if(!InitLu()) return;        //初始化Lu7 B' D! _# J9 |# t6 S. R\\" @: c+ H2 Q
    159.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    160. & k9 O. ?/ W8 n# c( U# ]% j

    161. + D+ f) R7 ^) \$ X0 V) j  D
    162.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量$ T. I0 K+ r/ {1 T5 x
    163.         SetConst(L"matrix",&Val);        //设置整数常量
    164. 6 u, w1 N\\" K# U; S' ?\\" M
    165.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    166. ( V8 a4 z- S( [\\" @+ j; l; k# Z
    167.         wcout.imbue(locale("chs"));        //设置输出的locale为中文) \5 D. R1 R9 g/ n+ J9 P- ~
    168.   
    169. - C% S6 N  j- H, o
    170.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式5 B$ n6 B* K8 O4 X- n
    171.         if(ErrCode)* P' Q% U) J7 B9 L, w2 I
    172.         {2 C6 T0 |! e* t) v! N0 I
    173.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    174. $ y: X$ A) }\\" d$ C1 \. |2 A, A
    175.         }
    176. 3 m, z/ D' C2 M$ l0 x, F) ]
    177.         else
    178. $ R% x; z. a# `( ?) x
    179.         {
    180. 1 W7 C7 ?, E/ c& ]7 D1 Z
    181.                 LuCal(hFor,pPara);        //计算表达式的值. O\\" b, p1 W7 Y
    182.         }/ `% g2 W( q  u. x' F8 y
    183.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用! z% l  N# j2 u
    184.         FreeLu();                        //释放Lu; R* v% x  b' _- P% W, u2 \7 I$ X
    185. }
    习题:$ i0 B7 x4 S( m' T1 L+ r
    + A- t" Y& [! P3 A3 E' ?7 F
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 8 D7 n0 F% y/ [1 A. n/ @1 F

    1 l0 c0 I# H/ D' O    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=9 C3 L# F! p9 q; G1 y, a5 U
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],\" d, t, t) R5 o$ z
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      - U/ W\" i2 W* G0 Y- b- a+ q; }1 |
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],! r3 \\" }8 `4 b# ~
    5.     t=clock(),
      . o5 w% O0 Y$ x
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      , f4 J1 d( X4 t1 z5 ]/ q/ 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.; r$ ]& A; A7 ?\" U& @1 }' ]
    2. 5. 4.: z0 `; D' {# \2 C* w( R
    3. time=0.875 seconds.
      ' \  u. F. S# ?! f8 \. V
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];# A& F7 |/ U( e; B/ T( M
    2. b=[2.,1.;1.,2.];
      6 z1 m# C9 [+ X
    3. c=[2/3.,-1/3.;-1/3.,2/3.];0 r  _  i. m8 I
    4. tic,
      7 x- }% L' O' ?. y$ v
    5. d=a*b;
      1 t3 V& y( ^\" Z; B
    6. for i=1:1000000
      ; e8 n, H. P( v9 ?* |6 ?1 f
    7.     d=d*c*b;
      . {2 b* K3 k) s4 T
    8. end
      ' D; d' h) Z9 a* |; `
    9. d,2 O  ^( ~4 l/ ~* l! o$ X& l5 o
    10. toc
    复制代码
    结果:
    1. d =5 h. K8 K) \+ p7 _* Y* a4 A
    2.      4     58 x( f' a0 P1 g! x+ N
    3.      5     4% s/ G7 w8 i, a/ d
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    % H0 Z. _( y# [* G/ z
    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-8-23 15:25 , Processed in 0.417879 second(s), 52 queries .

    回顶部