QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8734|回复: 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 p2 ]1 k3 J" \
    . n8 L0 ^+ I& f6 G; K    基本要点:
    1 `& y* L' Y5 `' m2 _6 z" t0 C
    ( T. |2 B7 R- s0 H9 l6 _9 D4 Z- _    (1)为扩展类型matrix编写运算符重载函数OpMatrix。: S8 ]. ^  ]' a( s. u. Z. t5 v1 v
    * E! _' @$ ^7 ?/ u+ n
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。9 q4 }) |5 ^! C$ f  P

    " y6 G4 V* L1 s$ G! t/ }; I5 v    (3)为扩展类型matrix编写其他操作函数(本例未提供)。) }9 P9 F  C- ]5 |; ?! e9 c# s

    ( q+ \$ i" K( H    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>4 P$ P, ?5 d2 D( b1 J$ u: o' |
    2. #include <iostream>
    3. 6 Z9 b2 U/ ~7 G' ]) I5 g
    4. #include <math.h>$ y% ]\\" q. d$ R+ Z8 A. ^0 L# B
    5. #include "lu32.h"
    6. 7 x  ~5 n) D9 T8 `% J
    7. 7 R4 w$ x  G# e( S0 e
    8. #pragma comment( lib, "lu32.lib" )$ b$ T3 P5 ]$ h2 c

    9. . T3 i3 J. b/ @& e$ R
    10. using namespace std;
    11. - c/ |8 q5 m9 p\\" [6 I- }, g
    12.   m/ h  |1 Z/ ~7 r\\" M\\" V0 f
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定. t' {1 y8 K& v/ \  _

    14.   e8 T- A1 V4 T4 f/ B* q) Z# @\\" l
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. ' w$ `2 g\\" D% v+ g/ L# g
    17. {
    18. / l4 G' ^9 i8 Z8 r  y6 R/ ]
    19.         wcout<<pch;
    20. & w* J! {; n* j
    21. }. y+ u* V$ k, p7 j( P
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    23. 6 l& i% S: u. F& d7 R
    24. {
    25. \\" V8 B\\" l! {, f; |. e& ^) y
    26. }; u2 y7 v$ M; j, @# Z+ K
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    28. 5 N6 t. G- D. q. f; A
    29. {
    30. 9 g1 f; O) @5 A, E6 w
    31.         LuData a;$ p- A9 b+ w0 T9 N( t) ~9 x
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;9 b$ Q* k* s* K7 n: l\\" J
    33.         luVOID i,j,k,m,n,u,v;* w* v' T2 F6 U$ r
    34.         double *pa,*pb,*pc;
    35. ( t! l- E, p4 y9 a' H6 e3 U
    36.         luMessage pMessage;& ^7 n' {\\" c. [* y
    37.         wchar_t wchNum[32];
    38. 1 d& N! [\\" S! n$ v6 x
    39.         char chNum[32];2 u6 _2 U! y1 B: g! }  L& R, h. R
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;2 r) d5 [4 O! c) @1 o) M# q
    41.         switch(theOperator)
    42. ' p$ ~. |5 R) R2 d3 b# v\\" Y% g
    43.         {; Y- p% U# l, e+ S: i9 o  P  O7 U* T
    44.         case 2:        //重载运算符*
    45. ; \9 d( S7 t+ B, I! Z% v! C
    46.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    47. - u3 e+ t\\" H\\" W2 j7 t8 z
    48.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    49. 3 ~. \( N9 o0 h2 `6 n- p
    50.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    51. # m) K# B0 w# s6 L/ r
    52.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    53. $ k) I4 k  r! K: V5 K
    54.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    55. * Y8 {$ T5 u1 T
    56.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象; R* o1 ^/ l4 ^* o* A) ^9 q
    57.                 if(!pRealArray3) break;8 n& ?$ }2 f5 \& i3 E! u2 [' S
    58.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小4 F6 a5 ~3 E\\" I\\" a
    59.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    60. - i7 v' P0 A0 _9 g. J. f7 \5 d
    61.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];  a# T! e( ^) c. Q; `3 F
    62.                 for(i=0; i<m; i++)        //矩阵乘
    63. + p* S- C) Y( p! i/ |
    64.                 {
    65. 6 Z' l! @1 B2 j4 S: p
    66.                         for(j=0; j<k; j++)
    67. . g; M6 |: J3 @6 q! a: m5 O% T
    68.                         {1 t3 [\\" M, I( d; {  F! {\\" q8 L2 U4 o: P; G
    69.                                 u=i*k+j; pc[u]=0.0;
    70. ( ~- }: Q3 {$ u! y# Q( q: ?
    71.                                 for (v=0; v<n; v++)
    72. % P; w5 j* F) ?# F. e- V
    73.                                 {3 M1 R: z; g0 x3 f9 t. {; ]( |
    74.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];1 U% w( {  s1 L\\" [* f( m  R- g
    75.                                 }4 b' ^4 e; h0 z\\" m# }4 C3 p( o
    76.                         }
    77. 3 r: z1 r1 z8 s. `7 l: Z
    78.                 }
    79. 8 u/ h* x( y6 G, m, \* W- ?2 ^& O
    80.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    81.   d. z) r# {( b+ ?% k
    82.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;; l  C2 D2 V9 U8 ]0 D2 ?
    83.                 break;2 s- T5 f) s* X) V' T$ Y& ?
    84.         case 25:        //重载运算符.*
    85. ' ^6 F. h) I5 c1 D4 v' t) R\\" {
    86.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);# s2 i8 X4 i! v% V! Z8 ]! }
    87.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);* `\\" L, b. F9 L4 o  m; v- ^7 I
    88.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组! G7 `1 r! D+ R/ U
    89.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    90. - y( s: J' c8 R  l\\" N
    91.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同( s) W7 V! T! O8 n( d; F% x
    92.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象9 d- _% ^4 d7 m. t
    93.                 if(!pRealArray3) break;
    94. \\" i2 n  m8 K4 Z3 w) J
    95.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小1 [6 d  h\\" I( Z
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    97. , w. v6 i6 U$ J1 A- H
    98.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    99. 9 l7 I1 i& j6 `; L0 i% l# ]
    100.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;5 J7 B. z. J1 j: h3 z4 R
    101.                 break;
    102. ) o( s$ E9 \0 E) {( Q: z
    103.         case 46:        //重载函数new\\" b6 U1 [( H2 K3 ~9 F* X
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    105. % y) D) C- i! O\\" {& S; m8 {# S. F
    106.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型: r) I6 P. T1 A' K) \
    107.                 break;
    108. * m$ ]1 Z/ m' j2 j/ F8 ]: j3 }
    109.         case 49:        //重载函数o
    110. * g; S: q. M# h' ]% s2 Y& i: m8 G
    111.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    112. 3 S% w8 D/ J7 O# T
    113.                 if(!pMessage) break;+ L/ @! j; @0 m: v7 \( |1 u
    114.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    115. % j( e. L4 e( R& q4 V4 A
    116.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    117. \\" y) j! C. H\\" J) e# q+ C3 @
    118.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    119. ; d: v7 e6 T1 m$ X6 ]  q
    120.                 pa=pRealArray1->Array;$ t) F5 Z. x+ ~% Z
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;% n3 i+ N/ U7 H$ l\\" ?
    122.                 for(i=0; i<m; i++)        //输出矩阵  a0 ?( Q8 u  W\\" d$ E5 B7 \% }5 t
    123.                 {
    124. # f5 Y8 j: @- S. X. |! g* o* E# |
    125.                         pMessage(L"\r\n"); k+=2;# e. b# E& |* }% n! t: b
    126.                         for(j=0; j<n; j++)/ Y7 _6 \/ e) x0 Q! _
    127.                         {
    128. , N/ P* Y! p4 x' H9 a% \: |0 j
    129.                                 _gcvt_s(chNum,pa[i*n+j],16);1 A: W* ]! ^5 a% W8 S! D
    130.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}8 c  I* }! z5 [4 k6 O
    131.                                 wchNum[u]='\0';2 M6 e4 U! f) W' p
    132.                                 pMessage(wchNum); pMessage(L"  "); k+=2;  Z\\" W6 B0 [8 ^6 \% `1 p% g) x
    133.                         }
    134. 2 ]# ]) {# S1 M% D1 [1 _
    135.                 }
    136. - N, K/ q6 b9 j) o, c5 N
    137.                 pMessage(L"\r\n"); k+=2;
    138. 5 N) h4 u& T4 |& }/ d) V/ X: r
    139.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    140. 3 q6 l% H* W& f- E
    141.                 break;
    142.   b8 h; ^. ]  U) C
    143.         default:+ m6 J& S, ?: s3 |' {8 W) M/ G2 n
    144.                 break;
    145. - X0 O0 `\\" z1 \
    146.         }6 l/ \9 |2 D7 L7 @0 r8 I, ?6 x
    147.         return a;( `3 l0 a7 P7 j6 p$ O( q* _8 \1 l
    148. }
    149.   u# b* x, y. y5 }2 q& h+ X
    150. void main(void)* E7 z0 C, e$ }& a, o- C4 E3 e
    151. {7 M. Z: y1 U9 u' ]
    152.         void *hFor;                //表达式句柄
    153. / S/ ^; U8 Q8 L/ q
    154.         luINT nPara;                //存放表达式的自变量个数
    155. / x0 b# ^/ [\\" }# `
    156.         LuData *pPara;                //存放输入自变量的数组指针
    157. 2 N2 y- w\\" t; K- Q( e. @! o9 i
    158.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置1 x& J2 A: g' J
    159.         int ErrCode;                //错误代码. P' t' o/ L0 |7 p\\" ]
    160.         void *v;
    161. - M! q' I) T% a: x, |2 h& p9 M
    162.         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.]}";//字符串表达式,矩阵乘
    163. 5 U8 t& X& U  K8 P5 k1 ~
    164.         //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.]}";//字符串表达式,矩阵点乘/ Y$ ~* ?% B' F. C4 x
    165.         LuData Val;
    166. 2 d  C* Z/ T2 @1 [9 C2 X8 Z2 e3 B
    167.         if(!InitLu()) return;        //初始化Lu$ y0 p  M5 v* l8 |1 F/ y; C( t4 p; O
    168.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    169. ) J+ ~+ f) b, p

    170. & B$ a, e0 X8 N8 ^
    171.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    172. - Q\\" B2 o. p\\" ~/ x
    173.         SetConst(L"matrix",&Val);        //设置整数常量
    174. , E3 f0 C8 S  i& I  c
    175.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息# e5 h0 X& f+ U/ c+ m  w2 P+ {5 D
    176.         wcout.imbue(locale("chs"));        //设置输出的locale为中文( |# h3 M4 E$ C) T' E
    177.   
    178. 9 P9 k7 e  u* f' P: b5 i6 F
    179.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式  E5 N4 A& S) g4 q# c
    180.         if(ErrCode)# D# G1 [8 ^; z! I
    181.         {  H; p) a5 @( R0 ~6 ?# ]9 ^
    182.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    183. + k& u4 E' d) k9 f# l
    184.         }3 W5 Q8 u8 q) R3 k
    185.         else0 E, V6 v: d& f* S2 h: r' ]% w
    186.         {
    187. ' }9 w6 N5 E+ B- ~' R
    188.                 LuCal(hFor,pPara);        //计算表达式的值
    189. & ?* t( Z$ d6 R. v
    190.         }( Y& A+ z! n1 v6 N3 x\\" X: c\\" f6 j' S) }
    191.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    192. 5 s+ ?. l+ g. M, a- U
    193.         FreeLu();                        //释放Lu
    194. - v+ U6 A0 n' J- @/ w$ ?( o( L
    195. }
    习题:) E9 J- z( p1 l4 s

    & x1 e2 F! y5 l    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    - p$ t7 i# P9 F" k8 F" X% @0 q' O* k% M" K& G2 {; Q2 d- v5 Y
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=0 x5 e& b0 }  \/ K$ ]
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      $ l( c. H: t) }. f9 ?( f
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      8 A$ o# `/ W1 X) \5 Q- d
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      9 K+ I) ~* M$ g+ K
    5.     t=clock(),
      ; n% W* d& M. |' @# [
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      4 L3 q7 q5 N  N5 u0 o# z8 {
    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.. W8 K0 o\" I# m, v8 R3 h
    2. 5. 4.+ i8 E8 w- y. ~* X; U- k
    3. time=0.875 seconds.5 z) v+ V2 g4 h& i8 U8 ]
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      2 ?& M8 r! o2 p+ J
    2. b=[2.,1.;1.,2.];
      . s. E; {) v; k$ b& U' e: ^
    3. c=[2/3.,-1/3.;-1/3.,2/3.];+ w- x( D# ^! r; }1 d8 r9 o
    4. tic,
      7 c( c5 n\" N' W
    5. d=a*b;* Q  J* e; [/ m9 {7 J! }
    6. for i=1:1000000; q4 x* k. E( t% R% k4 l  i# i
    7.     d=d*c*b;( Z, J; W7 ?/ {+ Y4 I
    8. end* r6 M5 c9 j0 k3 t# [4 c! l
    9. d,
      ; |8 E. |5 o0 b4 w9 \$ n
    10. toc
    复制代码
    结果:
    1. d =+ w3 ?; _' l3 T, J
    2.      4     5
      $ f: Y, }  d  p: y
    3.      5     41 j: ]5 |3 ~; m' ~8 }1 Y
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。: f( |8 X0 Q5 u6 k6 T2 V
    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, 2026-5-25 04:19 , Processed in 0.308407 second(s), 63 queries .

    回顶部