QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8748|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。) A7 U; t; f* z7 N9 P: C
    % W# X2 H- a" t* K2 P! u* w
        基本要点:, h. ^, Y  H' \
    3 A' z/ [9 {( d) p# d1 M
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    : T, s' W/ ]! d" C* r& B" C" J. @# c7 @. i% e3 K
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    ' e" Y  I3 Y: q! B" r/ J4 e1 T. q: S7 h( A2 x1 z: E
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。% D# V1 k! O2 Z) t4 ~- l

    5 z$ d! u9 S/ g+ I9 V4 A/ ?4 V2 Y    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>( S6 o7 o; L- X
    2. #include <iostream>
    3. * g( C! x8 ]4 S7 ~
    4. #include <math.h>
    5. , j# I* t' L6 g! n/ P( [
    6. #include "lu32.h"
    7. \\" X. Z  A; N- s\\" p

    8. # C2 y0 p7 B9 X* c2 p
    9. #pragma comment( lib, "lu32.lib" )% u+ `- C4 N( ^. [
    10. ) E7 q5 R, o\\" F
    11. using namespace std;
    12. ) ]- i# P9 @5 Y( U6 _& q: h  P' M
    13. + n' Y% D5 l( J) J! h0 l4 {
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定3 l8 y  k) l) B& p
    15.   G: e6 t3 E7 n
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    17. : z0 q/ Y2 K2 ?+ O
    18. {
    19. 9 n( N( U# G: e\\" x
    20.         wcout<<pch;
    21. \\" G& H1 Z\\" U% Y3 ?* ]& K8 D
    22. }
    23. 6 e, L+ o+ S7 C- _- |4 p6 ^& Y
    24. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做0 c0 b1 X3 Z+ {; X\\" X\\" R+ Q
    25. {3 h5 j\\" i/ B: W1 v4 K* d( Q
    26. }
    27. 8 J9 Y3 W9 o- G/ _% i
    28. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数: F  L2 I2 w7 f. i\\" Y- x% T
    29. {
    30.   d, J6 n$ A5 F. i: k3 l
    31.         LuData a;% P! I! q! j% y. f& Z4 U
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;* e' O9 R6 T/ z; Y0 z
    33.         luVOID i,j,k,m,n,u,v;' y# q5 \8 D4 n
    34.         double *pa,*pb,*pc;
    35. # I$ U% p; t: e, h8 ?
    36.         luMessage pMessage;
    37. . k\\" }: H5 {: P\\" e: z; {
    38.         wchar_t wchNum[32];
    39. ( s, Y7 a$ E. P8 r: m0 s  Q8 m\\" A
    40.         char chNum[32];
    41. . P- C, N/ R+ v
    42.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    43. 1 m) n+ H3 }. m* X; m# {3 e; \: X6 o
    44.         switch(theOperator)
    45. , \% X9 c' a  T7 v$ n, D, E6 W
    46.         {
    47. - O+ a, p4 M% T% h
    48.         case 2:        //重载运算符*& \/ D: r% E) l9 @
    49.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);% @$ K\\" s# P: [; z! q7 ]  c; c4 {
    50.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    51. , o1 u* n' F0 I$ E7 n& J8 S& {
    52.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    53. ) |& h! U! ]8 X/ i4 C% c( Q
    54.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    55. 6 ?+ q# z: n% K# m/ _! b* b
    56.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配; \$ a3 L) A, p0 o6 m5 \
    57.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象# Y& m( O1 W% a) ^
    58.                 if(!pRealArray3) break;
    59. + A7 p3 B; P: `2 v9 h
    60.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小1 k: c& J. @. c4 ~* W. p% @
    61.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    62. - B2 y/ u% ]7 C4 I
    63.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    64. $ l. V, ]+ D0 ~) W% T3 j2 b4 C! L
    65.                 for(i=0; i<m; i++)        //矩阵乘- z* e; W$ H  r  e
    66.                 {- z% m8 q5 ~! ^  {
    67.                         for(j=0; j<k; j++)$ X6 m+ [. G1 l
    68.                         {
    69. 1 _8 o8 K. w- s* o$ _
    70.                                 u=i*k+j; pc[u]=0.0;6 F% C$ \\\" i: G- [9 M' ]/ L! l
    71.                                 for (v=0; v<n; v++): `3 x: @8 A$ E' o
    72.                                 {- i$ M9 V2 N3 \* @  d6 i7 ^
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    74. ; y\\" N7 I: s$ l# f; n, y, x\\" L
    75.                                 }9 ?- s2 g3 N. R( K6 Z3 `
    76.                         }
    77. 6 X* I8 D9 d9 s( B4 f% O1 C( k\\" W
    78.                 }. s) _3 W! x# p* I
    79.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象% k2 g! P2 S/ }- }# U) q/ g
    80.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    81. ' {& A+ s' t8 c4 S# v; Y# I7 @
    82.                 break;
    83. 4 p! b; y- ~# {: [7 J* a
    84.         case 25:        //重载运算符.*% \% D; a% U& ?; [- W) B1 R\\" Y
    85.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);7 S; ?9 G& j+ T0 \3 H8 l6 S/ O
    86.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    87. / [\\" E* n0 w, o+ M
    88.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组  p7 [7 ?  l% T+ p% R
    89.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)+ L: L; R9 q+ q0 k- v
    90.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同1 \; Z! P\\" Y9 x% W5 O# W
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象1 o$ i- O, U$ ~\\" Y\\" X9 B
    92.                 if(!pRealArray3) break;
    93. ' Y4 p: ]+ @8 n0 l# Z5 ~
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小8 ~* _8 z1 J* l/ `- R6 `, v
    95.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘# |6 L/ z+ B6 O. i0 N
    96.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象' H6 [) [, u/ Z1 Z0 J
    97.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    98. , R6 n' Y# f8 f3 V7 ]
    99.                 break;0 x( G7 w* q2 V2 f& d6 z* G
    100.         case 46:        //重载函数new5 j+ m( J/ v! a* I
    101.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数3 e0 s* x- P0 U- F
    102.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    103. 2 ]- j1 [- X' h$ B1 i$ N0 o$ @
    104.                 break;) q; j0 T8 }\\" V& i$ a2 }
    105.         case 49:        //重载函数o
    106. ; n/ |1 Z. z( |5 ^( b- s
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. , `$ f! }, ]8 s
    109.                 if(!pMessage) break;
    110. 8 T5 s# _7 A( H\\" o( F/ j/ U
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    112. 0 a. n. o1 y* P/ |
    113.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组, I7 e6 D. m7 ^/ r0 M& C
    114.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    115. ; u* N9 C: P4 I/ f7 M% n% w% Q
    116.                 pa=pRealArray1->Array;! e5 S& K7 F4 Q4 F5 P1 Z. G* m
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;2 x5 n, O! y& ^; o+ p; v6 O: l
    118.                 for(i=0; i<m; i++)        //输出矩阵$ q4 i& G: i- U2 m: L\\" G
    119.                 {/ Z# [) i' ^3 ^( W
    120.                         pMessage(L"\r\n"); k+=2;
    121. # R2 N4 I. G- F\\" Y
    122.                         for(j=0; j<n; j++)
    123. 1 E6 H9 g6 u- ^1 B
    124.                         {7 D; M9 N9 N# y% i
    125.                                 _gcvt_s(chNum,pa[i*n+j],16);$ @: M( M% u' n\\" x& K% r6 @
    126.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    127. 4 f) \2 G6 B5 x7 O
    128.                                 wchNum[u]='\0';
    129. 6 A, x% H! c5 R1 B/ D
    130.                                 pMessage(wchNum); pMessage(L"  "); k+=2;. O* `: t: I! l\\" X4 k
    131.                         }
    132. , `* G! b9 k6 a: E0 K
    133.                 }2 [  D  _: }  }3 n# C/ Z: u8 n
    134.                 pMessage(L"\r\n"); k+=2;
    135. 5 B) F, h0 y# t0 ?
    136.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    137. ( h7 Z\\" S* E4 {
    138.                 break;
    139. $ D8 |\\" ~7 S/ w  Q' I\\" X  R
    140.         default:$ \! O( l1 Y% {8 |  _2 H
    141.                 break;
    142. ' v4 a3 W. a* y* `# E6 }
    143.         }1 H/ K8 s& Y3 v& u
    144.         return a;
    145. \\" ~% f/ E0 V, t- R
    146. }
    147. ; l$ P3 Q, ?  T# A$ ^
    148. void main(void)
    149. 4 b2 X+ Y& k2 i( z# X  L* D. G0 o/ k
    150. {; n9 F7 ~* e; R& c' B
    151.         void *hFor;                //表达式句柄
    152. $ d9 o9 m7 l  v, ]7 s3 w
    153.         luINT nPara;                //存放表达式的自变量个数* |) h- n4 X, s) @! q5 P
    154.         LuData *pPara;                //存放输入自变量的数组指针
    155.   g7 H- I4 k\\" l7 Z0 X& R! K
    156.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    157. 1 }2 C& t/ |5 o# W* ~1 U) B9 k
    158.         int ErrCode;                //错误代码
    159. ; L% ~3 j. T. P5 Y1 l2 I$ S1 z: z
    160.         void *v;
    161. , p! f0 P/ J+ u
    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. * Q\\" n! t' K: ^* w
    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.]}";//字符串表达式,矩阵点乘: E\\" c: S& s& k, N
    165.         LuData Val;7 w# S# }/ _% k: x8 q5 P1 G$ S, Q* p
    166.         if(!InitLu()) return;        //初始化Lu
    167. 4 a- a! H% [% G2 {
    168.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    169. ! H* O% v6 k6 E8 _
    170. & g9 n$ ^  I) J- _6 c
    171.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量! ]& d0 h: m( @9 l9 B$ z  g, k
    172.         SetConst(L"matrix",&Val);        //设置整数常量: p- P: M; s2 ?$ K1 o! T6 j3 u
    173.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    174. ) ^1 x* t9 P: C5 a. X- |
    175.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    176. $ |+ |3 w& C7 y, e+ Y' D
    177.   . k\\" S1 _( N8 f: e& Z( W) f  W  r
    178.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    179. 4 s) Z- u$ v2 H& Y2 l3 @, ]
    180.         if(ErrCode)/ Y\\" G5 k* l1 b& A8 B
    181.         {5 n3 K\\" ?2 B* I- ~9 D( v
    182.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    183. , _2 \; Z; Q2 ^3 z( ?0 j
    184.         }
    185. ' O8 t+ ^  u: k% ~
    186.         else- |, n/ m& s1 b) ~
    187.         {+ P; l# H  n% N  `: U: i4 |
    188.                 LuCal(hFor,pPara);        //计算表达式的值
    189. / k, y- S* J/ q
    190.         }
    191. 5 M6 c\\" D) u% e; v! m
    192.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    193. ! l0 N1 Y6 i/ g\\" w* @7 R, t
    194.         FreeLu();                        //释放Lu) ^\\" w  a/ j3 _( U$ `
    195. }
    习题:6 R  _- o6 u+ H) p; V6 K1 |
    ) T: e+ T5 r2 x1 E& I
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    2 f; {$ h8 o- T/ Q8 U4 N. e- f6 }! a9 B& Z% {3 F2 r
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=8 ^( F7 d) H2 j2 M
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      * [# C$ {4 m7 Z/ H$ ^, |' M& m
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],- m9 t6 ~. f: v! ^
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      + [9 A9 _+ Z3 ~$ F* R, {# i
    5.     t=clock(),
      5 Y: V8 O& X( s- j) w/ O
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      , D! V! G2 ^7 c, s$ 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.
      3 Z1 G% F4 M( |+ n' e; x
    2. 5. 4.# A/ e/ ?% I0 N3 z1 Y1 Q
    3. time=0.875 seconds.
      + p& i/ D, q7 y
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      ' Z# `8 Z2 q3 ~. S+ G. n5 P8 R
    2. b=[2.,1.;1.,2.];4 n6 u, k# P; M+ @
    3. c=[2/3.,-1/3.;-1/3.,2/3.];3 S/ {- Z. i( l: B! l- ~4 r
    4. tic,\" F6 V7 R& E5 ?& R. Q' O, L5 j
    5. d=a*b;0 @* [* J3 ]% a/ ]# E  Z
    6. for i=1:1000000
      : u  w9 q( G0 h\" k' A; e9 b, {
    7.     d=d*c*b;' v6 |, P: ~0 T; ~
    8. end
      * [3 e6 @4 H2 V) x7 c/ g\" k' N9 y
    9. d,
      \" h\" U# w$ [0 S5 t% H: L
    10. toc
    复制代码
    结果:
    1. d =
      . Z9 ]& w/ Q1 Z; e
    2.      4     5! z2 o7 v# F! I+ u  @# y  b
    3.      5     4
      7 P/ @9 N% \/ \4 x8 L2 [& `$ z
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    1 t1 \3 i% q& \% s! t
    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-11 08:49 , Processed in 0.444157 second(s), 62 queries .

    回顶部