QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8901|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。0 j- g0 l/ U/ `0 F

      @6 M! r! @" W" C* I, D% i8 e8 K    基本要点:: Z- b; I" A& U' k  t: `
    : L8 O  I# u6 X7 ^  K6 W
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    - [1 Z$ K4 G2 M2 A8 y: ^' L8 {0 J8 w+ M* x
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    & x+ Y1 h6 C, n0 p2 r/ Z0 ^& r- d  t  p; l' n) V
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。) n- V6 v$ B0 |: v* M6 Y

    5 T, D& J4 k4 y( k7 O! v9 E    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>4 g  O( S0 ?1 c& m8 g1 K
    2. #include <iostream>
    3. 7 C0 ~\\" k8 s! R6 b+ T
    4. #include <math.h>
    5. ) j# \+ Q2 a2 C/ s\\" Q5 u  g
    6. #include "lu32.h"0 z' T, Q) @# G
    7. 1 |; z+ r7 F* y* c% K: t0 g
    8. #pragma comment( lib, "lu32.lib" )
    9. & {; C7 t  e; X6 w
    10. ' f  s7 f2 f# d; h# Q
    11. using namespace std;5 ]3 \. H( t3 P- u/ F0 N
    12. 8 `  h( f6 g' q/ D: {  Q
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定* H/ |9 t3 |9 p8 n, b$ R
    14. 2 m\\" h. k  b) {5 j) M% t! b9 R2 L
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 7 V2 I9 b7 O8 L. t* b; q3 W. T
    16. {) V2 n8 Q0 S6 d9 |# c\\" X: s
    17.         wcout<<pch;
    18. $ b: K  {, I6 N$ I4 I( n
    19. }% n9 h  p0 I4 ?: H, Z' v4 Z0 P
    20. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做6 U' b) l; C9 o. F
    21. {
    22. ! @6 }  S. z. H7 n
    23. }8 \5 s- [; Z  V$ _\\" k9 H
    24. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数; h- Q1 \- j' A
    25. {
    26. 3 ^, d1 |8 |! {- z( w% `  ~
    27.         LuData a;
    28. . o/ ]5 S% M6 W5 L$ f
    29.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    30. / {. d+ q# m$ {- }
    31.         luVOID i,j,k,m,n,u,v;2 w+ |2 [4 y' }  s4 t
    32.         double *pa,*pb,*pc;
    33. ( H6 V5 r5 h  y2 I2 L1 k3 I
    34.         luMessage pMessage;
    35. : s! Q' V  ]7 o' _# o' |
    36.         wchar_t wchNum[32];, u1 \\\" A; q! U3 D0 f0 {& u
    37.         char chNum[32];
    38. , N& s, _* k+ S/ ]6 W0 j
    39.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    40. - F! r\\" L\\" U! u2 Z\\" ^
    41.         switch(theOperator)& ?5 `) ]' x2 B: _9 M% T
    42.         {
    43. $ G% x; F# z; @/ U9 M9 S: F, s
    44.         case 2:        //重载运算符*9 E9 D3 q- y  I
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);4 R% U\\" S! e* y3 P
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);+ a: Y) k* |% y& W
    47.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组0 e' f$ k4 p/ ~7 U0 N) t7 J6 |
    48.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)& L' M! n9 L6 \7 E6 [7 S0 B
    49.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    50. 6 A* m$ q2 H6 K, M; o  ]# t* T
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象& L( Q0 C2 i5 k$ t
    52.                 if(!pRealArray3) break;2 w- {( a4 }8 O6 F$ G+ m\\" a
    53.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    54. 3 z$ t) J3 d\\" B\\" R- u* l5 g
    55.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    56. ) f! p% Y! G5 V
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    58. ! z4 O\\" L: ~* W\\" h
    59.                 for(i=0; i<m; i++)        //矩阵乘! J7 K' K' h: Z5 K- E5 U
    60.                 {4 {\\" G; B* x7 y$ d& ?) E# D4 C5 m/ ?
    61.                         for(j=0; j<k; j++)
    62. 2 W# g5 B4 @3 B0 H
    63.                         {2 J1 `, F7 m5 j1 r3 n
    64.                                 u=i*k+j; pc[u]=0.0;4 m* G' T% ~4 g) H% G: Q, D
    65.                                 for (v=0; v<n; v++)( F, q  |' l! |! p( `  q1 o
    66.                                 {
    67. - e: N1 H$ |* i7 g# d: _\\" I; Y
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];0 v7 O6 E9 K$ z) e( ~! ]. }: d4 ^, R
    69.                                 }- C# @- U( b& u( n, T3 d
    70.                         }' @1 V! B6 H, e
    71.                 }; w# I4 \2 [& o! F, J) r
    72.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    73. ! i4 q% S9 `; ^8 O! P
    74.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    75. ; Z$ m3 O* w& F' j4 t
    76.                 break;
    77. ! T  W, C4 {$ M% m$ q
    78.         case 25:        //重载运算符.*5 x3 b4 E* [7 g& x/ A* j6 G
    79.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);\\" f# e\\" ?. e% N+ u+ c# w6 p# q
    80.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);* R* R( [: K6 y+ M\\" }
    81.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组9 f% L# \$ K' o  Z- X+ K
    82.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵): b. X! j1 i( H# @# P3 i
    83.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    84. ! O6 m1 L. r1 q9 ?  r( \
    85.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象4 J- ]( J4 I\\" K  e7 E. P
    86.                 if(!pRealArray3) break;- C$ J* D; I6 e5 j
    87.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小) L1 ?( m4 K0 Z& V. V
    88.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘/ J- G$ ?. W& j: r
    89.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    90. / u! ]7 A! D) S$ }  d; |# v: T
    91.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;6 q% x2 R5 y4 T0 |2 g7 s
    92.                 break;
    93. 1 i; V+ u% J5 e
    94.         case 46:        //重载函数new
    95. + I% Z. D, p) a/ K* z  H: ~6 E
    96.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数& q+ v3 ?7 O0 Y
    97.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型+ q9 a9 t; z  i1 a! r- `/ {
    98.                 break;
    99. $ [0 O: ]- W# d* i; c9 ^+ O1 ]
    100.         case 49:        //重载函数o- v& R% s4 w3 C\\" U/ L! m
    101.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);4 @3 m+ k5 |: o$ \( X7 c3 x
    102.                 if(!pMessage) break;
    103. * z6 U* L8 d$ Q7 t\\" r. P
    104.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);. Z1 ?\\" L8 b/ Z% `\\" u; V
    105.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组& |1 g. ]  J# {\\" k- J, ^
    106.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    107. 5 d- X5 f) Z6 @2 x9 e) z
    108.                 pa=pRealArray1->Array;
    109. & _0 N& J7 t  X: N
    110.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;1 R4 E- x) i& A! g5 u+ K6 e5 r
    111.                 for(i=0; i<m; i++)        //输出矩阵& P' Q& O1 s: j
    112.                 {
    113. ; K; g# s\\" T  j  a, X0 F% e
    114.                         pMessage(L"\r\n"); k+=2;
    115. - ?6 z. m/ D% D. l
    116.                         for(j=0; j<n; j++)
    117. - r; U9 P1 E' r( Q/ ]7 i# j7 u
    118.                         {
    119. # i' q8 r7 o2 }- B2 K6 v
    120.                                 _gcvt_s(chNum,pa[i*n+j],16);4 K, j7 X6 K0 ^$ l3 i
    121.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    122. 0 s/ u; _8 ~& \% b% l
    123.                                 wchNum[u]='\0';8 v9 R. r# Y6 [) O& T8 b
    124.                                 pMessage(wchNum); pMessage(L"  "); k+=2;  M0 R0 u. }$ v3 L7 s. E
    125.                         }
    126. # L: f. V; r2 `# ?- r* K
    127.                 }1 e0 E: a: T5 j4 W% f% N) ^
    128.                 pMessage(L"\r\n"); k+=2;+ y7 `! P9 {5 o: B$ C+ r
    129.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数# T8 N7 z) [2 e1 W+ `
    130.                 break;
    131.   B2 P. c1 A: {  v: v- h: _/ ]; d
    132.         default:1 d2 k* `) q+ F) T% P  }, U7 [
    133.                 break;# ]$ t$ L2 u; Z# X) b: O' K7 D$ b' T
    134.         }
    135. ' L& i0 ^! }/ N3 x2 m; r- H
    136.         return a;# J  F5 ^/ |% k5 O4 V% y0 e4 @6 s. }
    137. }! l# {0 d  \# H6 C* A7 m0 p+ j
    138. void main(void)' B6 _' |5 x1 W7 p$ ]/ {
    139. {3 a4 D1 b( q  Z
    140.         void *hFor;                //表达式句柄' k0 g. v3 T4 p2 g7 H, k
    141.         luINT nPara;                //存放表达式的自变量个数6 o' y# S4 C$ t6 D) A
    142.         LuData *pPara;                //存放输入自变量的数组指针
    143. 1 L9 y, b- E, L3 j6 \. i8 o( I
    144.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置3 C  ]: e+ N5 c; W
    145.         int ErrCode;                //错误代码8 D7 z) H( U4 O) }, Y9 F5 w5 K# h
    146.         void *v;
    147. ( A& Y6 c% c& |# ]: y5 l( h
    148.         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.]}";//字符串表达式,矩阵乘  M& R9 I. W* m
    149.         //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.]}";//字符串表达式,矩阵点乘4 r% }+ K4 x4 h: _' }: h4 k2 ^0 m
    150.         LuData Val;9 f' G3 `( A+ e  |
    151.         if(!InitLu()) return;        //初始化Lu% P6 @, |( [0 ]+ ]7 }. N
    152.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型/ m4 I6 _; {! m1 j0 r- b
    153. % R. T4 \, T9 v. M
    154.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量- l# T# @: E  k& w
    155.         SetConst(L"matrix",&Val);        //设置整数常量
    156. . r1 a+ a* X* Z% O; q5 M
    157.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息% t- @1 t1 e* H9 C4 Q( g
    158.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    159. 6 L5 b% }; \) J) i, d
    160.   
    161. 8 N9 l* z& W\\" x2 c0 X
    162.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式; N* W1 c: r8 w+ N2 ^2 J# O
    163.         if(ErrCode)% i; b; T1 D( q
    164.         {2 L/ F. E* S% \& q: c
    165.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    166. + I# Z0 o, v5 R9 f% b/ N
    167.         }
    168. / A# G1 w# n, L
    169.         else
    170. 7 y/ P& v1 G3 \9 t9 v) a
    171.         {. r+ [, m+ y; H! G- `- l- G6 u: T5 U
    172.                 LuCal(hFor,pPara);        //计算表达式的值, U0 r' K' J: L) t
    173.         }
    174. , h/ H: F; [\\" Z# p% @9 U
    175.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用' @/ g) @3 o6 k+ B# [# R4 ?
    176.         FreeLu();                        //释放Lu7 q& D: O9 x  }) F
    177. }
    习题:" [/ t( ~* P) c, `" W
    7 W% G3 X& N* R3 k
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 , w8 \2 T$ }! s
    # \* Q7 R: ?% k: f) n! t, _5 o
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=( v7 W+ |/ p0 N\" _3 K4 b8 Z/ |1 ]
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],5 G# j) P/ H9 p6 B
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      ! N! y7 q2 Y9 r4 C( z3 c. R
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],7 c0 [& v/ `+ c) o) P9 t) S5 J
    5.     t=clock(),  z: }# @. D3 `9 C+ |+ M
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      5 {+ N. U\" ~% q: M) x+ q9 o) A
    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.( o6 h( s; `* ?, M' n7 V
    2. 5. 4.3 h) a9 I( v- M. g: c
    3. time=0.875 seconds.5 _1 o' Z) k2 g2 |2 u
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];; [. }6 T; @9 _+ j/ K) e
    2. b=[2.,1.;1.,2.];( c( D- N1 \; w) Y, C$ j
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      ( L/ `4 K# q# T6 e  W; _
    4. tic,
      1 ^$ }\" K1 Y, L\" v\" G
    5. d=a*b;
      / G5 ^: Z( T4 V' k
    6. for i=1:1000000
      2 y8 M3 @$ i8 r, @0 g0 f% e
    7.     d=d*c*b;
      ' I4 @  V7 O$ }/ c% x; ?5 p2 [
    8. end
      6 ]2 K2 x5 C; J. Z2 j
    9. d,
      & D, U( I5 C\" A& Z, z
    10. toc
    复制代码
    结果:
    1. d =
      . C6 O3 [3 c. S9 Q0 X& o
    2.      4     5
      & r- H4 u! y: f/ {( d
    3.      5     4
      6 ]- r: k, p- H% Q$ c- g& Y! T
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。' g# U; {4 a9 g6 s
    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-9-1 10:09 , Processed in 0.283531 second(s), 52 queries .

    回顶部