QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8900|回复: 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 t2 `7 p0 ^& L; `3 g0 }
    / k2 \6 f0 \! `3 K. Q) q    基本要点:
    ! X: I: [: Q+ w% M, E5 ^5 {: f) E2 d8 T( h8 ?5 D
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    & \7 J; s% Z. E8 h6 L4 I+ ?6 X5 \5 }! e  Y( L% M3 ?3 P
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    8 T/ L3 W+ ]- C  x" J, l; S; M2 d: k- o5 x( z$ Z+ f% N( _
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    # M0 [% X  a$ ~. z  H8 M, n: s* @! s% F6 g: e  K/ ?% ?
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>  k. C) W8 \- N
    2. #include <iostream>
    3. & E0 n, v! l: E) Z( m5 q0 A. B
    4. #include <math.h>7 _6 }9 \3 `' |# E
    5. #include "lu32.h"2 c, H, K% u  v* }
    6. : F  b  z& B! e5 P\\" {
    7. #pragma comment( lib, "lu32.lib" )
    8. & N, C3 s+ Q/ b2 ~' E$ r

    9. % w) I) r0 ?# H6 p% W6 i! \
    10. using namespace std;
    11. \\" E4 c/ M6 v+ V! d% L
    12. + C/ y! h1 P* C6 J\\" N: v3 l
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    14. 6 k& Y8 |1 u& w
    15. 3 ?# A0 M0 M- \- q9 o! q, l
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 * f6 z1 |7 l+ r# Z8 M\\" }0 [
    17. {7 |2 y\\" J/ W( ?1 H) o- X: i
    18.         wcout<<pch;
    19. 2 G7 v1 N  m  q
    20. }
    21. 0 \$ L3 T0 r9 P% S8 c  j% f1 Y
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    23. 5 V: z2 o% y% X9 k) I
    24. {
    25. . x7 E/ Y9 u+ V/ a- |
    26. }$ B0 u9 @0 s5 @9 i\\" \# N
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数7 b, G\\" x2 I% v: p
    28. {/ W  b( E% K( J0 D
    29.         LuData a;- Z2 c: _4 d. S; B+ u1 _8 x2 q
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    31. / s6 w  W/ T, ]; H% k! Q
    32.         luVOID i,j,k,m,n,u,v;9 Q& T9 V* t: c( j- B
    33.         double *pa,*pb,*pc;7 k/ D! I- o, ]( z7 ^
    34.         luMessage pMessage;
    35. ' q7 p8 V+ O! \! Y1 t: M7 ?
    36.         wchar_t wchNum[32];$ s2 H$ G2 ]$ G0 }4 ~8 b
    37.         char chNum[32];\\" T( h\\" `9 \; u2 e1 e8 d
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    39. , }( e& U: k* a) R6 W
    40.         switch(theOperator)! R7 A. N7 q9 u8 g$ d! `
    41.         {
    42. ' S+ K  l7 \, O0 h
    43.         case 2:        //重载运算符*
    44. ' }% v, S2 Y% m: D/ X
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);# |& h8 y. ~  K- t! w
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);$ X5 N* R+ b8 y\\" ~3 y$ N$ x
    47.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组, i9 ?3 T: ~% `1 o5 e1 M5 J
    48.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    49. 8 y% I( o( y, s\\" m/ k
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    51. / i2 ?7 x. k% }0 V# _  T
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象1 |, i: j$ n4 s6 V! n  ^; m5 g- q4 f; l+ v
    53.                 if(!pRealArray3) break;
    54. 5 p# E3 P% |2 ]2 z6 C& k
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小# A' f; d% ?: {, j$ [
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. / I1 {) x$ t! q
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    59. 7 f8 y) ?8 {+ ]- f
    60.                 for(i=0; i<m; i++)        //矩阵乘
    61. 2 p4 Z/ O8 {, i1 Y0 P* i
    62.                 {
    63. : b( o5 o& I8 ?
    64.                         for(j=0; j<k; j++)0 h0 C& x7 J% Q% K$ N* K
    65.                         {$ i' \+ e7 l0 M  z\\" V$ r
    66.                                 u=i*k+j; pc[u]=0.0;
    67. * n% E; s% Z1 R( l5 B3 }* H5 P
    68.                                 for (v=0; v<n; v++)
    69. / E* l; a1 x4 i$ _7 |/ L
    70.                                 {
    71. / N4 \9 J2 P$ P5 w  x
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    73. ! I& [! U6 q7 r0 Q
    74.                                 }0 D! F% ^$ W: m8 h
    75.                         }
    76. : R! B. W3 A% f4 w3 J& }& V
    77.                 }
    78. 5 b7 T6 H. X/ }+ o* R
    79.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    80. ( c3 ^/ j- K( T$ Y. Y4 ~! Q6 d
    81.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    82. 0 z6 ?% |* s& }4 }
    83.                 break;% K, B2 ]# S+ w, U' ]3 N& X7 q
    84.         case 25:        //重载运算符.*3 s  ]2 c) |$ s. C
    85.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);! w) d% ~+ n. n8 a
    86.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    87. ; U7 a2 s+ u  o- z\\" A\\" R
    88.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组7 n( k# a7 u* y  `
    89.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    90. # V. |0 ^\\" y' O& O7 W$ @9 r! q
    91.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    92. : Z% ?- N' E5 y: k  x1 R
    93.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    94. % T\\" J# V; p. F, y/ ?5 C- p
    95.                 if(!pRealArray3) break;
    96. 8 |3 q: Z- `6 G# D; w6 h- d
    97.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    98. % U( Y# d3 x! Z0 ?) y
    99.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    100. - D& f8 v0 d7 }- Z7 y, |2 x
    101.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    102. \\" q- ?7 f7 [) J; P: [
    103.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    104. ) ~6 Z8 \. n\\" b3 x\\" D! u7 e
    105.                 break;9 P+ L. K1 [. W, @$ v/ U5 l
    106.         case 46:        //重载函数new2 D+ k# [, A+ u8 Z5 [, a+ {5 X4 a
    107.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    108. 5 z/ s3 A; w& f4 ^7 F2 C
    109.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    110. . w9 ^8 j/ q: j6 _
    111.                 break;
    112. ( R. T) d* s* J2 y+ q5 H
    113.         case 49:        //重载函数o
    114. ) @3 L6 ^3 S3 ^
    115.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    116. 8 \9 _& R2 Y0 r
    117.                 if(!pMessage) break;+ W& \, H( h+ V7 ?
    118.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    119. & B6 i& x% }\\" a/ ]1 q
    120.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组) d9 @2 H$ D: v& i
    121.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)$ w0 B- F2 r: b
    122.                 pa=pRealArray1->Array;
    123. 2 }; |* ?2 [* e$ S3 D0 _
    124.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    125. 7 M8 T! P1 U2 ?\\" @6 q\\" m$ S' F& K
    126.                 for(i=0; i<m; i++)        //输出矩阵
    127. # Z% n' ~% P6 W2 g- f
    128.                 {& @\\" D+ `0 G# Y* |& `
    129.                         pMessage(L"\r\n"); k+=2;8 j+ V, F! V8 G: ]/ }& E
    130.                         for(j=0; j<n; j++)
    131. & a4 t4 ?: E' J2 M0 o$ D
    132.                         {. B: H- [! `- Y5 R2 }* b  G9 y+ O
    133.                                 _gcvt_s(chNum,pa[i*n+j],16);$ ]( Z' S9 s9 G- k. t9 S
    134.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    135. % q* [+ o& j3 N- T7 N4 i
    136.                                 wchNum[u]='\0';' E: B+ x2 v\\" W4 {  s
    137.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    138. ' h2 U* ~' z2 s( X) o( Y
    139.                         }
    140. ) V% u( p* D. T& \) i0 B: R
    141.                 }
    142. + C- X! q' [9 F. M
    143.                 pMessage(L"\r\n"); k+=2;
    144. ( N) V& }7 M+ ?& ]9 C3 `
    145.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    146. , a, S$ j\\" H) O\\" ?
    147.                 break;% S7 \1 I1 L9 W# ]; J  {; H( }% Y# u
    148.         default:3 j& t7 ~6 f; G5 ]0 ^
    149.                 break;: m9 w\\" H! M  n, m, u
    150.         }
    151. ! p  h0 V  Y0 g: |
    152.         return a;
    153. 5 B; s' o2 e- @7 S! L9 w7 z
    154. }
    155. 8 s$ I( |9 x  l& h
    156. void main(void)* E; N9 o- M% l4 ]
    157. {) |( X8 _/ [* r\\" W3 p
    158.         void *hFor;                //表达式句柄
    159. ' |, g' q/ A: T8 B# @+ B/ q7 W
    160.         luINT nPara;                //存放表达式的自变量个数
    161. % w2 N% f5 h9 h9 U8 X. v7 B
    162.         LuData *pPara;                //存放输入自变量的数组指针. O9 M- T# B3 x4 I  a; w# k9 w
    163.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置\\" Q3 o/ s* p- F& M( \& K' v
    164.         int ErrCode;                //错误代码. k* ~% B8 }4 ?+ @
    165.         void *v;4 x# U) ^! R8 ^0 Y: c0 n
    166.         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.]}";//字符串表达式,矩阵乘! k- K8 c7 [+ u8 z. T' X
    167.         //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.]}";//字符串表达式,矩阵点乘# K; u' g, b% |, O
    168.         LuData Val;% d9 O\\" H7 `9 A% G! W
    169.         if(!InitLu()) return;        //初始化Lu
    170. . A\\" @: U7 X# y
    171.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    172. ; t: N, F\\" s# X3 T1 ^2 n
    173. ' Y- e& k9 p* A3 a\\" Q
    174.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量) A8 V7 C1 o& r* z- M8 ]7 w
    175.         SetConst(L"matrix",&Val);        //设置整数常量
    176. $ o' n- T0 n+ `1 s
    177.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息\\" `5 J) M3 c+ j$ T% L; N) b, Z
    178.         wcout.imbue(locale("chs"));        //设置输出的locale为中文6 l7 Z) r% G+ j& W# _: D5 k/ V$ P
    179.   
    180. ) ?  N7 w1 e, g% {0 l# Q$ ]
    181.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式# q: U0 O! Q: W, l' q. z/ t
    182.         if(ErrCode)\\" g: o* y6 \' o# |
    183.         {, a. y3 ?9 g! k( y& Z0 R\\" W/ s8 V
    184.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    185. 0 y\\" s- f0 G2 P3 \/ ?. W6 H; ?2 Z
    186.         }
    187. % h& f. n& a2 [1 n: d
    188.         else0 z6 S- s' {, y9 w  w- x
    189.         {0 C0 u. b5 |3 o! i
    190.                 LuCal(hFor,pPara);        //计算表达式的值
    191. ' H9 L8 p' {% [, R9 m/ E, l1 ?& e
    192.         }7 R) e3 Z8 _) U! U0 D# E
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    194. : ^, N  ^# E! [0 I  F\\" S
    195.         FreeLu();                        //释放Lu1 A; z2 ^\\" Q% ~- X2 i  j( u
    196. }
    习题:
    0 @6 Y- P0 l$ o) B* H: Y
    6 A$ @  e) }- k" F1 s    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    " @. y9 P8 t. h; M+ B, P) U* I9 w& `, P; M1 D8 X
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=4 U1 p* ]! P7 O  |1 n3 p. j- Q
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      ; \, h. Y7 E4 H
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      ! U9 B: U, [, Q+ V% A
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],8 e  o# W/ \' L1 T
    5.     t=clock(),
      0 K2 Y' L) E4 j$ K
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      & b9 W8 Q* z0 w& t7 w- p1 n
    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.
      . {4 }& B1 i' S5 Z8 B
    2. 5. 4.
        U# f. G$ j, `# l\" p: w
    3. time=0.875 seconds.
      3 [: A3 M& S3 o
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      ) L3 ^/ u) i0 x1 Q' W+ M+ h; ~
    2. b=[2.,1.;1.,2.];
      * p! D. K, T' K3 a, L1 g' @$ x
    3. c=[2/3.,-1/3.;-1/3.,2/3.];\" H. I7 p1 O$ J5 g- R  P/ \
    4. tic,
      * V- r\" J: w& Y% {
    5. d=a*b;
      ! p2 G# Z9 s, e* T# \7 I; |
    6. for i=1:1000000
      ! P, ]8 b4 L9 o3 ~' h  T, D) U
    7.     d=d*c*b;/ a, p1 z5 `/ a! m) H
    8. end) L6 z- @% X4 H\" g1 _) s6 h
    9. d,- J# E8 G. N# N. D3 M
    10. toc
    复制代码
    结果:
    1. d =8 e$ T. j' A; |* l
    2.      4     5& M7 \0 U$ b$ j. [7 Y2 e
    3.      5     4
      8 ^$ H+ ^  [) `
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    2 v7 [' `4 F8 ~# }
    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-9-1 07:18 , Processed in 0.616013 second(s), 63 queries .

    回顶部