QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8741|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。9 i) N+ T; T; f- i- Y  B

    5 M6 v7 c+ n* b2 K/ W8 j( W' D    基本要点:3 C8 O4 R& F' w; T$ @

    9 |, I" ?; G) v, y8 N* K6 Y' u    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    : N) D- M5 Y. {; @' p& h
    ( \  O9 Y! ?5 `, _$ n9 j% U    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。! U2 ?/ _4 O" l4 u0 U* U$ I9 @
    8 w* b; X% d( d% I  L
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。4 ^" l; L9 F. m9 t, G, {
    , w8 \- c8 c8 C4 i: f* J% h
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>! f; S$ w9 f; ]* K
    2. #include <iostream>
    3. \\" f; J/ \3 x- G6 k& Q
    4. #include <math.h>
    5. ( W7 K. V& v+ o\\" {$ W
    6. #include "lu32.h"1 u' X0 a6 m& k% D( Y\\" r

    7. . V: }7 x. ]- m# a
    8. #pragma comment( lib, "lu32.lib" )3 x0 ^( }8 M8 W  G# j- Z( Q
    9. 0 i+ T4 l; m9 w7 f# `
    10. using namespace std;
    11. 3 h0 z  u: M) [7 c5 W0 P6 h1 t
    12. # p: z6 D% U\\" k' A6 v
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定& p- L2 X  b5 R$ [) ?# O% B

    14. / G' N5 ~- ]6 R! l+ e; Y
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 5 I\\" y( e' o: J2 o9 w
    16. {' E  V# |7 F5 E
    17.         wcout<<pch;
    18. 0 p2 ~' }, C3 S5 G
    19. }
    20. ( q+ P$ H. t( |. i7 r
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    22. 4 Z5 _* Z! n5 C4 i
    23. {3 G; |) R$ i0 A
    24. }; t: p8 Q( Z' |( ~/ d
    25. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数- Q3 w. J! _  Y- m6 ~2 O+ J- o- s
    26. {' D8 K; e2 l8 h: h% P% w
    27.         LuData a;# i4 L( S# `# E\\" J$ x! o\\" g8 X
    28.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;1 A$ I  s* }* e1 g0 V( K
    29.         luVOID i,j,k,m,n,u,v;
    30. . ]  W2 g' N; u. Y% |* _
    31.         double *pa,*pb,*pc;
    32. + A. V% L* p- |; ^
    33.         luMessage pMessage;# [/ \+ X' I, L. d; U) L. V
    34.         wchar_t wchNum[32];
    35. 2 H. }5 U\\" b' u* o
    36.         char chNum[32];
    37. 1 e- w' V3 b4 U. Y4 \4 W
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;( T. A! s3 B( z, z1 t3 I3 L5 k7 O
    39.         switch(theOperator)% w! b2 Z( G7 Q  F6 I7 k
    40.         {( H! t0 ^4 B+ ^! h1 {+ G2 v: u5 j
    41.         case 2:        //重载运算符*
    42. * a4 H0 O: _* f4 Z3 t* o
    43.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);6 k9 |' H4 U  ?! F* W
    44.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    45.   l8 g7 P( O6 Q4 G
    46.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    47. & c4 S6 q\\" o7 p8 Z% \. y% i
    48.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    49. 7 Z$ V\\" p9 B- l. v
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配6 b$ T: |! X+ l2 @
    51.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    52. ! G6 R, }/ x. a; |0 q, x
    53.                 if(!pRealArray3) break;# ?8 b( J; i) R9 r! U, b
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    55. ) c\\" o0 ^$ a: W/ t
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. # P1 w- m! V2 q$ C\\" H* E+ p
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    59. ' Y* j/ U* O/ p, M
    60.                 for(i=0; i<m; i++)        //矩阵乘! F1 T& e1 C* v
    61.                 {
    62. 3 t% p( ?8 b; `
    63.                         for(j=0; j<k; j++)- @& ~# v+ v- I; p2 _7 N# n4 T
    64.                         {
    65. / J; @& c, ^4 r: E: U1 n
    66.                                 u=i*k+j; pc[u]=0.0;& G. Z- |# m: y: r; j
    67.                                 for (v=0; v<n; v++)
    68. , @, ~+ \/ @& g
    69.                                 {$ }2 K; n! G5 }* I2 S5 g, w* ?
    70.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    71. ! J& t0 Z8 s\\" ^1 C% O\\" |. _
    72.                                 }1 h. R3 b3 h* @$ R) l
    73.                         }+ v& }5 c% w7 M1 B2 m
    74.                 }
    75. ; k; e2 ^8 m- V( ~( C0 q$ V1 W
    76.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    77. 7 C7 F5 {- ^: k  m
    78.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    79. ' [2 ]1 d7 u7 L1 u
    80.                 break;
    81. $ w% P# b4 J8 t
    82.         case 25:        //重载运算符.*
    83. $ e2 ^) h. N+ d- J) d+ `% V
    84.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    85. 6 s9 c/ P0 ]3 b; ~* U
    86.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    87. ( M1 Y( w  i& D
    88.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    89. \\" h0 r5 s- x! d- _7 s5 X
    90.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    91. 8 F* ~5 V: S: l
    92.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同0 g+ H. D6 \& q1 ~4 Q% o, J, [$ e- z
    93.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    94. \\" B. A4 P7 |  R  J- k; C
    95.                 if(!pRealArray3) break;
    96. / U) e' L9 F9 ^
    97.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小% U5 P/ m- ]& Y9 n+ J* B, L
    98.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘  w) a( J% ^9 L( e9 k6 _: Z
    99.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    100. . u4 X  ?1 J- b$ q- X
    101.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    102. * K  X6 w) Z* e4 h' C; n# e6 q
    103.                 break;9 U5 b. s8 S, l5 ]2 |
    104.         case 46:        //重载函数new% {. W0 b/ `7 I: B
    105.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数/ i; f. G\\" Q9 X\\" A
    106.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    107. 3 v8 E' N+ W$ M! r7 i# r$ h* f, t
    108.                 break;
    109. 9 p! ~: d: S- |; h6 p
    110.         case 49:        //重载函数o
    111. 8 {+ T! D2 y- k# |' e
    112.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);' R& k; J3 a1 H, T: _* H
    113.                 if(!pMessage) break;1 N, [# p  v, ~% U& F
    114.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    115. - A# s6 K' w& @% s4 B0 L9 t3 e
    116.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组% b0 w- X3 z- T2 m
    117.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    118. ! o$ D- S) O1 `: V) d2 a
    119.                 pa=pRealArray1->Array;
    120. 3 T8 L6 c- |/ F5 x. ^  x2 v
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    122. 6 C  r) k8 S, E1 ^8 }. V9 e: o) C
    123.                 for(i=0; i<m; i++)        //输出矩阵
    124. / f/ R3 K% u) F\\" W! \. m2 G' O0 s. r# v
    125.                 {3 t. j9 N8 O% c8 M- w! q! P% e
    126.                         pMessage(L"\r\n"); k+=2;
    127. 0 I. z) }$ b* G0 `
    128.                         for(j=0; j<n; j++)  H) y8 |8 M0 _' Q+ }- V
    129.                         {. x4 o, J' Z- X5 N) s6 J
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);
    131. $ N! `% s, E. m0 O, d
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    133. # S. x/ Z- S7 P9 ]2 F: k
    134.                                 wchNum[u]='\0';- O5 W2 A/ `1 ^7 X
    135.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    136. $ H! w0 c6 _* H1 Z; a1 }
    137.                         }
    138. 7 D2 c3 S; i* ]/ x3 Q, E
    139.                 }: N6 o2 Q/ J1 n, k4 l3 _
    140.                 pMessage(L"\r\n"); k+=2;
    141. + z' [5 w- Z2 _4 B- \# ~- ~
    142.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    143. ) ~, U/ D. I% ^( I
    144.                 break;+ X' e) p0 s0 d4 ^. u
    145.         default:  p1 m. o' M! D5 U+ D. {8 U8 N+ D+ _
    146.                 break;
    147. 2 k; ?9 d- B, j+ k2 b
    148.         }
    149. $ R7 w: S! b5 p3 V! J4 V, y
    150.         return a;$ p( o+ d* R0 L8 F, o; \* X3 N# h
    151. }
    152. , m+ a1 w. P8 i\\" C4 `
    153. void main(void)
    154. . r' L2 Z1 O) [+ x( h! g
    155. {
    156. 8 S+ b0 u7 x9 P0 n7 i' }% V
    157.         void *hFor;                //表达式句柄
    158. / u/ Q* f( Z) V$ ~/ X
    159.         luINT nPara;                //存放表达式的自变量个数
    160. 1 R# ?6 J( E3 p
    161.         LuData *pPara;                //存放输入自变量的数组指针( b; f1 O0 o0 S. C5 N' r9 A
    162.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置! q- Z) R: B& z( o( d: e( }
    163.         int ErrCode;                //错误代码
    164. 7 o1 R' F, X% W5 ^9 ]; e
    165.         void *v;
    166. 3 E* I$ [. [$ \3 l; G\\" x2 l
    167.         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.]}";//字符串表达式,矩阵乘
    168. 3 h' Y- e$ n* ^: P0 M- E/ X( _
    169.         //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.]}";//字符串表达式,矩阵点乘7 b+ m0 p+ y6 l+ w6 B\\" w
    170.         LuData Val;! B) p2 E; V: @3 M
    171.         if(!InitLu()) return;        //初始化Lu
    172. ( w5 ?: O- `' P( z: @3 H0 l
    173.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    174. 9 x; q( ~, H  E\\" ~2 o3 }\\" k

    175. ' U4 v7 X- S7 ?7 j' \
    176.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量# @/ U, _# ?; u# {1 x/ F8 A
    177.         SetConst(L"matrix",&Val);        //设置整数常量: s9 I& I. Z3 F- F. h
    178.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息& b% s& h: n3 `, E\\" i, ~7 [1 P
    179.         wcout.imbue(locale("chs"));        //设置输出的locale为中文2 ^- H  [; i: r- B. N! |  {& X
    180.   ; T6 {6 E; q7 c- b' R3 m# b
    181.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    182. ) N) _! g: ~+ J4 A( D+ u/ g
    183.         if(ErrCode)) X7 Y3 q3 {: o
    184.         {7 x6 o$ d7 ]4 y2 f7 j
    185.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;5 r7 {; \) B6 g' `. Z
    186.         }
    187. 5 A& K+ O9 y# S$ H
    188.         else
    189. ( X( u0 Y5 H; K+ z6 t
    190.         {/ e6 D# @; Z8 W1 j+ S/ ?
    191.                 LuCal(hFor,pPara);        //计算表达式的值
    192. + b) Y  i+ l' ?% _
    193.         }
    194. $ Y8 o# i6 Z8 k; b; a* [
    195.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    196. 6 W' v+ F* T, r% o; |0 j
    197.         FreeLu();                        //释放Lu
    198. \\" D. A\\" s% E; i' {- \
    199. }
    习题:
    9 t" {; d: I( q( V( R& I- @" v$ O3 @/ }3 C( E7 S* ?
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    0 B2 A- J- ?% q) e% u! b8 i2 O- i5 W9 W/ }
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      ) Z# w4 K' Z  |; {9 t$ I- c
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      ! z, |& f, g) h; V
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      5 q- P\" I2 N, [
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],- }$ g' ^% R! a8 f9 Q4 i
    5.     t=clock(),7 B3 v. L1 S: ~\" `4 q
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},5 i$ c- V\" B9 q* H6 y* 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.: m9 U5 i3 J9 u0 \7 x* C
    2. 5. 4.
      4 K3 w7 f8 k, L4 R  x
    3. time=0.875 seconds.
      ' B' y7 V. m, S0 L( e
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      # a( l/ y& |3 J& |/ X, J/ ]' z0 A
    2. b=[2.,1.;1.,2.];
      , K1 ^; z9 u0 ?0 J\" C
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      # T8 `) u0 H- e8 y1 b6 m3 W
    4. tic,
      ! f$ Y  |8 n0 N' g# c
    5. d=a*b;- @5 D  a& e/ I/ g
    6. for i=1:1000000
      . K6 w8 C+ C7 ^0 U0 Q
    7.     d=d*c*b;
      . C# X! }/ D( d8 x3 ^$ h& `\" F, l
    8. end  E: s+ g7 d$ b: @) s9 N/ J0 A  ^
    9. d,' W/ Y7 X$ ^\" a/ P8 Z  n
    10. toc
    复制代码
    结果:
    1. d =
      ( }6 ]. R1 ^! {
    2.      4     5
      * n' r6 r5 F; U  S\" e% f- U' r
    3.      5     40 U0 v+ V: d# C
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。2 [& A6 I4 K; N, O
    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-6-2 02:31 , Processed in 0.457198 second(s), 63 queries .

    回顶部