QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8522|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。, q' S/ R! V  L) U. j! ~9 R' {
    8 l" Q$ T5 H$ n) O' s2 q; |
        基本要点:: v& B# t, Q! h" W; V2 e5 F

    % ^/ s- H# w; x& B( B5 S5 w' T/ V  B    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    - W- E% `! k8 U) X7 S- ~
    ' s$ G  j- t% p* m7 ?* @    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。# `4 J" {! S4 y

    8 G0 ^! {1 E- c5 C& H    (3)为扩展类型matrix编写其他操作函数(本例未提供)。4 N) R; d, U, g  N8 t( {1 H
      `  e2 W* F. \" r1 x2 T
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. ; [; h; \2 C6 x* K; v
    3. #include <iostream>: ~6 x\\" }# B  d7 a; F
    4. #include <math.h>
    5. 5 c: X4 o- r+ i5 z: o' S  ?9 t& K
    6. #include "lu32.h"
    7. + N4 V9 J0 ?- L- P
    8. 8 z& j' O9 L  [1 \  ^
    9. #pragma comment( lib, "lu32.lib" )
    10. ; k4 |9 n- s' m2 r( D; t1 _
    11. 5 N) w/ O2 ~/ U: s
    12. using namespace std;
    13. 4 p& a, `* U$ l2 j5 S/ e7 w' r5 z6 |

    14. - ~\\" S) t' x\\" I! d% A  ]
    15. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    16. 5 |+ B1 X: f8 G1 F$ n

    17. # w, d: n& T# Q% ]1 M0 O# H9 L: F
    18. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    19. 4 H6 ~# o. u) _4 l3 o
    20. {
    21. 3 ]2 Z' R7 S6 I0 A0 ~
    22.         wcout<<pch;
    23. 4 q' e+ Z\\" A9 M9 Y0 r1 V. F
    24. }0 }5 m4 c/ O( N8 ^5 Z5 \. A# a
    25. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    26. $ A! C8 F: c% a; p9 y
    27. {
    28. 0 [0 |3 |: O: W. W4 L/ i4 R
    29. }  n. ]2 F' U$ ~! N5 q0 ~# Z
    30. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    31. \\" C0 ^! M6 f' o/ N, K9 k
    32. {. T* }6 B8 A3 h+ c; P+ b
    33.         LuData a;6 `) t0 m( W& U1 s+ b# A
    34.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    35. . g3 C; A% K\\" k) m
    36.         luVOID i,j,k,m,n,u,v;& u9 Y! Q% \6 q! y\\" g0 u; V: ?
    37.         double *pa,*pb,*pc;9 }6 c1 ]: ~- @$ \1 _
    38.         luMessage pMessage;
    39. ! O2 [4 s8 ~2 O
    40.         wchar_t wchNum[32];' ~- x7 y% Y- O+ e
    41.         char chNum[32];
    42. ) y! t3 o- L: k' W$ m8 }) D
    43.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    44. ; b+ w  F# b% X\\" _( g0 [% x5 B
    45.         switch(theOperator)
    46. $ E# A% e, t2 B3 j5 t
    47.         {: v  X# [5 H) ]9 ^4 U4 @\\" `% o: F
    48.         case 2:        //重载运算符*
    49. $ G1 H0 t6 v8 W+ E. `- v
    50.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);: F1 U0 z: n- J+ \* `; \6 A/ ?
    51.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);; _+ `* x: p5 r4 y+ B9 V7 m
    52.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组\\" p* |- X& Q. R) g
    53.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)\\" i\\" F( W! o0 v% L& c. q( b
    54.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    55. ' A# q9 M5 p- J! A! \
    56.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象  Q6 h) ]1 V( e8 F
    57.                 if(!pRealArray3) break;  P* g6 o8 M7 N* V
    58.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小* z( [\\" p: S& ]( B; h/ v\\" I
    59.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;% W, W8 N4 Y; W2 f% W9 R/ @4 O$ H
    60.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];( O% m  R  L& x5 L0 j& P
    61.                 for(i=0; i<m; i++)        //矩阵乘
    62. ; x\\" F) {/ u4 C( K! y, b8 o+ ~
    63.                 {
    64. - ~; T2 j$ n/ j
    65.                         for(j=0; j<k; j++)5 x  J/ I3 ?. O( u& }8 m9 r/ ?! P
    66.                         {
    67. ' m- T& Q9 [: R2 ~
    68.                                 u=i*k+j; pc[u]=0.0;\\" ~6 D& y; u! }) x( w3 j
    69.                                 for (v=0; v<n; v++)8 b3 E0 \( X7 O4 A
    70.                                 {
    71. 8 E$ ]) m/ c9 I; e$ a# W! T) G
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];1 Y7 f9 k; t+ K6 a! ~
    73.                                 }
    74. / F& {  a* Q& r7 O) T0 N
    75.                         }+ I* O3 ^) Z9 _( e& [' k. x, O
    76.                 }  A: {1 D1 T5 }2 P7 f8 C8 m& _; S
    77.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象0 X! [6 D: k+ b9 {5 w# r, A2 t
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;! ~9 U9 `7 A1 }. g' C! Q
    79.                 break;
    80. . ?. }6 j# l( b
    81.         case 25:        //重载运算符.*6 X3 I+ |3 F9 d. }1 _8 \
    82.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    83. ( k- Q5 c# r7 _
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    85. 6 y) P2 N0 `' `1 b* C1 t/ w
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    87. \\" b2 W( B. @9 J; `
    88.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    89. 1 N; A' t; U* u+ p
    90.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同9 p% [9 X7 ^. K! A1 j- s+ O
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象0 l8 c; F* r& F' e3 ~! G' g
    92.                 if(!pRealArray3) break;
    93. 0 B- i\\" |' b- ^0 X
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    95. * j\\" Z8 v' _# J7 S3 C
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    97. 3 o\\" k1 _- a8 |  `
    98.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象% [1 v8 t2 F7 M- [' v  f' ]- M
    99.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;4 D6 _* j( ?+ b
    100.                 break;
    101. / |% `% q3 ]8 f3 ]\\" F
    102.         case 46:        //重载函数new
    103. 0 o2 |( ^% B$ C# P# h; x/ y
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数( m- i* u& E4 C; G: s8 Z
    105.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型2 y7 X. W- @& l/ A
    106.                 break;+ D2 m6 y  ]6 V% Q8 j: D
    107.         case 49:        //重载函数o
    108. . @4 w2 F: f. @
    109.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);$ a2 k# z0 _6 o; R7 P5 Y8 @# _
    110.                 if(!pMessage) break;
    111. 1 m; A% n( t6 f1 k* r- T2 |3 e
    112.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    113. . u* |% M* s# c7 b7 w
    114.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    115. ' C! I5 c& Y3 q1 ~% X/ q7 |, v
    116.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    117. / U4 }% a: X) K! a% T  I+ t
    118.                 pa=pRealArray1->Array;
    119. 0 [+ Y' C+ w# m& _* O8 i, l
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    121. % J/ ^7 |5 ]3 j. ~7 X; @, T& I( p
    122.                 for(i=0; i<m; i++)        //输出矩阵6 |+ n) B3 Z/ ]! y0 Z
    123.                 {
    124. ; i2 j\\" m2 i/ |* Z8 e* l6 V
    125.                         pMessage(L"\r\n"); k+=2;
    126. 1 I2 _6 y9 {5 E5 E, z1 }* S9 S; A
    127.                         for(j=0; j<n; j++)
    128. $ s( S3 e. P! Y- Z3 i. ~
    129.                         {% o( b# [; @; ^3 z0 s+ p, `3 m
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);9 w2 \% R, m- b/ D4 q& x4 r
    131.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}; u) r7 r- _9 D  p  |
    132.                                 wchNum[u]='\0';
    133.   I& N* L0 a, D* Z3 Q7 _% v# Q
    134.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    135. 0 u7 h9 h& a, M/ }
    136.                         }$ u: e2 L0 M- z' v) D& L& @9 a+ j4 {
    137.                 }
    138. . ?2 p& \2 S- B3 D1 t/ ~2 [4 c( d
    139.                 pMessage(L"\r\n"); k+=2;
    140. ; v: H) X- C; d- n. ?
    141.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数! j4 U4 N8 Q3 X. g8 P\\" J
    142.                 break;
    143. 0 z/ Q1 e8 I0 q+ C9 V) q
    144.         default:
    145. : b4 a( Q6 P9 F1 S: v
    146.                 break;2 Y  K* m$ M7 t' p! }\\" @
    147.         }
    148. 3 k) A. G9 R$ D4 k, }) h$ Y- A4 j
    149.         return a;  i- W& x& \( M) D
    150. }
    151. ) b5 n; `4 E+ I( [8 J: h
    152. void main(void)) G( `, b( h* f  y7 y, A4 A! u
    153. {1 l; J: }0 V8 N! j& P' _
    154.         void *hFor;                //表达式句柄) }  _% l+ m+ F0 m
    155.         luINT nPara;                //存放表达式的自变量个数
    156. 2 C7 ~4 e8 v% K1 F
    157.         LuData *pPara;                //存放输入自变量的数组指针\\" c3 o( X: d. ^( u1 j
    158.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置, [' z\\" U/ ^- ]4 |7 p1 E
    159.         int ErrCode;                //错误代码
    160. ; p) w, }4 k4 C/ R: }
    161.         void *v;1 R% W0 E, Y+ {# F1 {
    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. 2 g: {. k/ B' O! u+ W+ [7 \
    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.]}";//字符串表达式,矩阵点乘
    165. # D8 {- j# l* T  K' ]1 [
    166.         LuData Val;
    167. ) x. B\\" K- E0 L3 k
    168.         if(!InitLu()) return;        //初始化Lu
    169. 1 l2 {+ p0 r! N* N% W
    170.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型0 J% {! L4 D& C. S6 `

    171. ' ]/ z( j5 Y+ ^% v
    172.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量9 S0 T- ?% b! k: E* ?: e! i
    173.         SetConst(L"matrix",&Val);        //设置整数常量+ n0 U$ \4 @% T5 H8 b7 G
    174.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    175. % W! _- W4 l  ~' d# p\\" A
    176.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    177. 1 Z- P% f3 K8 J
    178.   , E1 y/ Z2 _/ O2 f- {. [
    179.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式) I) r; c  o( K# M\\" A- Q: a. x5 i3 b) R$ j
    180.         if(ErrCode)
    181. ! J$ D5 s3 ?\\" ]1 g0 X/ |% S
    182.         {
    183. ) W9 h* h6 o1 o5 p5 A+ A( {& y
    184.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    185. ) |/ B$ l+ Z5 E+ p; M' ~0 H+ ^
    186.         }' u* z) B& ~; H) w
    187.         else' k/ e( k3 P' e\\" x% [1 C
    188.         {9 v8 F) |, _$ C* h  m
    189.                 LuCal(hFor,pPara);        //计算表达式的值, e& ], ?& j/ y5 e3 x
    190.         }3 l+ V; a2 F0 ^+ D# l* T* H
    191.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用3 h$ @; Z7 l$ h+ a  J3 J% y
    192.         FreeLu();                        //释放Lu6 ^6 p5 k  b3 ~- j  E) l: b
    193. }
    习题:- L. K: `1 O  ]4 I3 f
    ' D* \* o" [% _3 B. t
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 * B. |* v+ @1 Y5 Y. M" i/ y

    / m. R7 f! a: P+ N5 P) ?/ ~/ n5 Q    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=! N$ a) f$ x7 z; X6 l
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      \" S  y* y4 B/ Y5 c
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      ! P! S9 h$ z0 N
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],9 R! ~8 Z+ y( Y% X: H
    5.     t=clock(),
      , x% r+ J( G! K! b2 w
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},; w$ I3 \1 l7 ~' F) w
    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.
      ' z; K6 f* a6 u
    2. 5. 4.
      & b+ Z) e! _' o# l# e
    3. time=0.875 seconds.5 x8 u. Q& ~) i& ?\" H/ p& O6 T
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];- P+ B* i$ b( B; d0 H
    2. b=[2.,1.;1.,2.];1 P/ P: d8 a3 e/ X1 v0 [
    3. c=[2/3.,-1/3.;-1/3.,2/3.];+ [) E. J! }  h! m! K6 s8 l
    4. tic,, t( a( q7 z, }0 ^# J) n) G
    5. d=a*b;3 b) l; A/ B  w9 Z2 _
    6. for i=1:10000006 n4 H; q' |3 Y$ y& r: R
    7.     d=d*c*b;# \. U: C2 e( j) p
    8. end
      ) ^3 |. T8 X! Z4 v$ G  U
    9. d,- i7 G5 h, A. R& M: B
    10. toc
    复制代码
    结果:
    1. d =
      , q8 {5 E/ H; _3 q
    2.      4     5$ B3 G, h3 O+ Y) b  |* Z
    3.      5     4' I; E, Q- a6 O1 J( ~0 x
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。7 o( u2 N4 q) B( s) ?3 X( 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, 2025-11-15 20:01 , Processed in 0.456418 second(s), 62 queries .

    回顶部