QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8691|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    - B! J/ O0 K/ f$ P: U9 u
    - u# c) Q; h$ X/ S/ I: A  j    基本要点:
    $ G1 D- g6 z7 O/ }- m8 {! z5 o
    & y7 G0 J5 [/ K- {; Z! D    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    ) [' r; Q* V% j- q: S/ u8 t; F
    / J2 l+ @. A1 L4 r    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。% T2 k' d5 ]: x) _* J# G: K+ \
    ) Q( l' ~' G9 P- N* }6 @1 Y
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。, K2 ]1 k8 |: @8 t' t7 J7 b
    * G! \6 F. ?7 H  ?. d
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>( B6 C' i1 d0 U1 Z( Z
    2. #include <iostream>( P$ \% u. d6 [1 S\\" ~) U
    3. #include <math.h>( G1 l( i5 k& I\\" d( J
    4. #include "lu32.h"
    5. ( w) g& x  B2 _+ V/ `

    6. ' [2 o! u/ p6 |
    7. #pragma comment( lib, "lu32.lib" )
    8. ; n- m: ^: |$ @' ~
    9. 8 {\\" r0 B0 P1 x& [- k
    10. using namespace std;
    11. ( {+ E$ I1 X$ G0 M( N& g
    12. + _0 d& u( d! Y0 S2 t
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    14. 4 v' u6 F5 D( K/ {2 g* c( s

    15. 8 n4 ^\\" V/ j0 ~2 Z, q( Z# \
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    17. . J  X( l9 b; T' _# h: V- h
    18. {
    19. % ]( N- N. A: x% u
    20.         wcout<<pch;
    21. 6 M  p) V! X6 \$ D7 |# Z2 n  d! j
    22. }6 f\\" A! T# X6 S. g3 R, s7 f+ n
    23. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做- |7 j8 t9 T7 \; t. i% [
    24. {
    25. 9 s( ]0 b# w8 m$ ^0 E
    26. }
    27. 1 M  T; x  s# ^
    28. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数0 n- n' C. E5 |! G  h4 O3 v
    29. {* k4 C; v! L6 M\\" o- S6 O
    30.         LuData a;0 f! X4 Y8 w' j% |
    31.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;5 Z\\" j6 @: a/ E2 P* T6 o
    32.         luVOID i,j,k,m,n,u,v;% f' O. [, F- X- n9 V
    33.         double *pa,*pb,*pc;
    34. 7 P) P7 I$ W7 d
    35.         luMessage pMessage;( {0 X6 M\\" h1 `7 _
    36.         wchar_t wchNum[32];
    37. 5 Y2 F0 ?4 R* a( X
    38.         char chNum[32];
    39. - Z& Z! M4 X- P1 I
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;) Y9 Z, F- v8 @: @/ z7 o
    41.         switch(theOperator)
    42. , R7 z% K\\" e* ]6 X
    43.         {- e8 T8 Q3 o# ?
    44.         case 2:        //重载运算符*; M, H8 u* ^+ k0 n
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);1 h- {\\" I* A  ^\\" E
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    47.   C( M* |, W8 r# F3 M
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. 8 _) R0 ]* t- E/ @0 F  g1 c0 i% ]
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. 3 ^: U! e. T- f  `% ]8 {
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配1 c! O, o! {* {$ a' C- O
    53.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象5 j( X! b5 I: x
    54.                 if(!pRealArray3) break;) y# p2 v3 E% B- O
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小9 \, v% E& ?6 E! [  e( ~* {0 l! ^
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. $ ?! h\\" V: C  i
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];2 H/ y  |* `1 }  w) i, f( p* x
    59.                 for(i=0; i<m; i++)        //矩阵乘
    60. 4 V, ^4 \3 C2 c; @& r0 W
    61.                 {% s6 X: ^- s& }' s- Z7 X/ U
    62.                         for(j=0; j<k; j++)5 O* Y* F% g) y7 d. Q8 [7 L6 F
    63.                         {
    64. ' Z  Z# z! M. X- D8 a
    65.                                 u=i*k+j; pc[u]=0.0;7 y\\" F4 w& l  }$ d+ u/ X
    66.                                 for (v=0; v<n; v++)0 x$ f7 |: z' f6 f& b4 J. P
    67.                                 {2 S* c! G1 m6 D- H
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];& w! T5 m; N5 M; F9 G9 b: v! I5 E
    69.                                 }' z: O% T1 `4 }' }4 t6 |0 e
    70.                         }
    71. 3 s0 I\\" f6 C( B' m( m
    72.                 }
    73. 4 w( I9 v' Y) o/ ^
    74.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    75. & |! Z8 N' k' o+ p2 ]2 s! V
    76.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    77. 7 I- M' q- S6 e; U, x. W
    78.                 break;
    79. / A1 _* L1 _7 W
    80.         case 25:        //重载运算符.*
    81. . w  Y; ?% l% o
    82.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);: g, i- f* w2 ~/ |/ y
    83.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    84. 9 d6 b. E. a& ~% p  z
    85.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组! k' l3 [; l  S! ]
    86.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)7 {) V. p7 \4 W1 h4 M- k. }
    87.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    88. - J& T# h: T$ O. Z$ x2 D
    89.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象% W1 `$ L) A' o' R7 }
    90.                 if(!pRealArray3) break;
    91. : K1 A, u/ L3 K6 K
    92.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小8 Q: o& K- T+ s7 H: Z\\" [% d
    93.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    94. ! G8 Z  c. N6 H& X
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    96. 1 J1 l: F* ?0 P5 i% \
    97.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;& {9 V  P$ y- S
    98.                 break;
    99. ! z% z0 ~, g/ n$ K( K0 @
    100.         case 46:        //重载函数new* b* {! @1 [& J6 A5 X
    101.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数7 q/ f- f1 u; W2 r2 u
    102.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型( r3 o/ d0 |6 L$ S
    103.                 break;
    104. * ]# y/ K$ h+ R# w
    105.         case 49:        //重载函数o
    106. # N9 R, d4 L3 U9 L, `5 I
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. ) ^& o# Z\\" D5 ^- s9 v
    109.                 if(!pMessage) break;
    110. 6 U4 b  K; T9 f! j- @
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);  p- E) j3 h\\" v) l( E
    112.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组2 C( \\\" O2 N5 @% L. f; x& c
    113.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)9 A6 _8 ?\\" ?8 Q% t; [# V& x5 V. R4 Z
    114.                 pa=pRealArray1->Array;8 c/ H5 J\\" R4 S- E$ L
    115.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;6 k6 m' U# `2 y4 L9 B
    116.                 for(i=0; i<m; i++)        //输出矩阵+ L. X1 Y! `- N- b( y! ^\\" j
    117.                 {5 M( J  T8 X\\" ~1 K2 M
    118.                         pMessage(L"\r\n"); k+=2;3 n: \( B+ v) z4 u# v+ y& L, F8 i
    119.                         for(j=0; j<n; j++)  N: t: \7 \9 m1 d4 O) X; ~- r
    120.                         {
    121. : z' q/ \0 d/ V2 |& B: ]
    122.                                 _gcvt_s(chNum,pa[i*n+j],16);
    123. / ^- T4 }- C9 w9 {% V3 b. G
    124.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}* l% _1 C% W) R. M  J\\" x
    125.                                 wchNum[u]='\0';) \' H8 [6 L6 e$ R+ j# v1 R8 a
    126.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    127. ( I) i% k; [3 ~0 O% ?
    128.                         }
    129. 9 @6 F) |) N' ]2 x
    130.                 }9 z! E9 T3 B- k7 `+ }: l) _2 ?
    131.                 pMessage(L"\r\n"); k+=2;8 ?1 }9 ?0 ~6 V' J
    132.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    133. , ~# q* ]# j4 `
    134.                 break;
    135. ( u1 I3 @1 u4 l' |4 D8 i
    136.         default:
    137. % O4 {9 a& p9 D9 V; C7 |4 \
    138.                 break;
    139. # q1 _( r0 N% A6 @- H, d
    140.         }
    141. 2 a* M% u1 B& v% i' B3 L2 ?' M% C
    142.         return a;
    143. # D' e  u* z7 v3 \8 u
    144. }% Q7 i' {4 n$ d# k
    145. void main(void)7 V- u9 ?: }  F  E* [8 H6 d) _
    146. {- Z) B/ v: y\\" @; H. m* F
    147.         void *hFor;                //表达式句柄4 q\\" @$ z8 f\\" X
    148.         luINT nPara;                //存放表达式的自变量个数( b\\" s- o( E& ?2 q1 k# V5 B% j
    149.         LuData *pPara;                //存放输入自变量的数组指针
    150. * x0 Z; u3 f1 `. U9 U) V\\" c+ l
    151.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置5 K; ]: w& v8 l: C# F7 ?+ s' j
    152.         int ErrCode;                //错误代码
    153. 2 ~9 K* i) t( ]+ ~0 g
    154.         void *v;! a/ h- l. H6 ]: K\\" u\\" p* m
    155.         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.]}";//字符串表达式,矩阵乘
    156. : n\\" s' x3 Y* e/ U$ S\\" _
    157.         //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.]}";//字符串表达式,矩阵点乘/ t5 O\\" X' _, O0 [- E
    158.         LuData Val;3 f& A1 R; W) o/ @3 L0 p$ j7 d1 s
    159.         if(!InitLu()) return;        //初始化Lu2 b\\" E' k* L( [  }& }3 n5 K4 `
    160.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    161. # F' K8 i# L, j& R' l5 i% g

    162. 9 D6 \+ k, Y& M+ m- T
    163.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量* L+ Q% w0 @* T2 f- a% @6 ]
    164.         SetConst(L"matrix",&Val);        //设置整数常量% z  T1 w: O3 m
    165.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息; n6 I4 n9 G3 B+ @% ]* q
    166.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    167. $ O  X3 y2 `' j- }/ N
    168.   
    169. * Q# L7 c  j/ D( |6 D0 w3 s# M
    170.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式; ?# g8 W1 @9 A
    171.         if(ErrCode)
    172. 4 d: v$ [* C1 p, K
    173.         {
    174. 4 h7 i/ H0 [( s; _
    175.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;9 ~' W+ X% g( j4 G5 M. q) y
    176.         }
    177. ! m2 U0 l5 H$ m8 k; y
    178.         else1 H, p: O- m* {6 t* M! _( i7 e
    179.         {
    180. 6 x/ [2 A  A- ?
    181.                 LuCal(hFor,pPara);        //计算表达式的值
    182. & n! m+ P  t\\" b6 F! h/ O# B$ b* Q
    183.         }* h3 C5 k& U% f% ]& p
    184.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    185. 9 p5 m2 }4 Z\\" P  F- @- ^
    186.         FreeLu();                        //释放Lu
    187. 0 \9 m% p\\" P$ n& G! t
    188. }
    习题:: j3 F0 d9 x: x* \5 c
    4 S- ?+ A4 Z9 e
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 % B9 R- C! _+ m+ y3 ~5 I& b
    6 r7 t6 u; W- H/ l# u2 w1 u
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=9 v; Y( b\" u0 j/ W! Q6 A
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],  a4 N% }7 ^5 o\" c5 T9 o
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      6 @' n9 I6 ~7 r, k' A. K& ^& Y\" R
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      \" e. x5 g3 N+ ]  t0 H
    5.     t=clock(),. ~& }$ h& `  a1 X
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      2 b- Z/ X/ T; s# w& ~: J
    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.9 g0 K# G; |( N
    2. 5. 4.
      / u6 W\" L# P' s( r$ v) U+ W) S
    3. time=0.875 seconds.
      ; u6 j- ^# h3 \; R! G4 K  q8 f
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      ! S  Q0 a- ~4 h& R( U4 O
    2. b=[2.,1.;1.,2.];
      , o* V% _: o1 v) Q9 f
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
        F8 B( e( [3 ^5 Y. @8 E# b; x2 `
    4. tic,1 b. d\" h: F. r2 j
    5. d=a*b;
      . I1 l9 D) o9 B; H8 c/ a9 p
    6. for i=1:10000005 K/ u4 G( ^) ?/ T8 u
    7.     d=d*c*b;( c/ p* f, N9 Z2 P
    8. end
      $ T- @* l0 \' g# X, M
    9. d,
      * ]; X5 x! b4 C! }8 B) w
    10. toc
    复制代码
    结果:
    1. d =
      : E. b% ~/ {  j' x; r
    2.      4     5
      , r. `5 h; U# b\" o7 f- `
    3.      5     4
      1 ?- l) l) D' v$ O) d  n5 D8 z. [
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    : t5 H$ {1 y# N% E7 t8 Z
    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-4-21 06:59 , Processed in 0.504336 second(s), 63 queries .

    回顶部