QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8899|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    ( }$ [! p9 @7 u8 I
      q$ P3 P) ~: V2 H    基本要点:. Y% i/ W. v! P9 S% n
    ' {1 m( r- ^$ A2 ~
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    & e( e# j! I8 `$ }
    & k4 w, ?" t) E. ]    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    3 L! P; t, Q0 R1 O$ H# V' [+ T4 V* y' T0 M
    : y# z0 `* S) N6 f7 Z+ N    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    ( d) ]( L6 m3 f
    3 d* }+ [% y6 }/ \/ h    (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 1 b9 J\\" {+ f: J! M# c
    3. #include <iostream>2 k% }) v  V% A
    4. #include <math.h>, T( Y/ r( D. @1 S
    5. #include "lu32.h"( v1 t# q/ r9 L3 p  D7 s

    6. ) y+ [6 ]' A! f5 T7 Z. q
    7. #pragma comment( lib, "lu32.lib" )$ N3 f: a, l8 z) \
    8. . Q% \; Y4 {* b0 t; l
    9. using namespace std;
    10. \\" `6 ~* @( t9 l3 K7 O5 P( P
    11. 2 T( v% Q  R2 C
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定$ r0 y- _7 R9 P6 S! E- A/ k

    13. 1 W$ C7 P9 `1 s5 l4 K) H\\" K* \
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    15. . {# o, O. q\\" h3 m0 B
    16. {
    17. 2 q8 R( I* a; [5 {) H
    18.         wcout<<pch;5 t: r# D+ G% h
    19. }
    20. \\" B0 r: _0 H: S: G
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做; n% W; N+ Q6 a4 |# ?' U9 J
    22. {
    23. * k' W0 ?3 {9 ^\\" V9 Y
    24. }
    25. , K9 X3 @) V0 ?+ z
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数1 h- M4 r% ~! t
    27. {$ V' b  U9 J; V9 w1 o* }' s, i
    28.         LuData a;$ X; M. t. R' ^' }. [
    29.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    30. 5 k: D1 p8 Q3 V4 _4 u9 ], X
    31.         luVOID i,j,k,m,n,u,v;
    32. ' L  }( R; v8 v$ k! m2 U1 z
    33.         double *pa,*pb,*pc;
    34. 0 G6 q) T, x( C5 B1 ]9 m' Y! a
    35.         luMessage pMessage;, f: ?9 A& W  s1 ~% S
    36.         wchar_t wchNum[32];\\" S/ d4 V- y5 f) R) w' M\\" x
    37.         char chNum[32];  ?% l; w$ z% h& `% H  _
    38.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    39. 3 r7 u) H6 h3 X\\" l1 B\\" m
    40.         switch(theOperator)/ z6 Y2 n4 ]7 B/ o, F\\" v9 U9 U- T
    41.         {
    42. % Y' e% U0 m2 Q
    43.         case 2:        //重载运算符*+ \# w  t! Q; _9 e$ e! i; G9 N
    44.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);0 i/ ?7 H! s  F5 R
    45.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    46. - E% u- N4 E3 w, t3 m, b5 ]
    47.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组8 w* R9 M9 @( c! x8 v3 H. f
    48.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    49. & [2 o8 I# ?/ f+ i9 r1 a5 z: i
    50.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    51. , \, a\\" a& a1 b/ h; A* D0 O
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象% X2 r- ?7 _% ]7 c1 U3 G
    53.                 if(!pRealArray3) break;% I9 R& Z5 i# c
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小% c+ `6 F7 x* Z# M' R6 G0 h  K
    55.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    56. / z3 [3 t\\" w2 P& F5 I& ~
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];6 ^\\" `7 E) k3 T: u& p
    58.                 for(i=0; i<m; i++)        //矩阵乘/ Q8 }' y0 y  g* Y2 {% \' I
    59.                 {0 j2 q) V/ e0 h2 P
    60.                         for(j=0; j<k; j++)
    61. + U7 t5 A8 Y: d
    62.                         {0 {+ J( U/ `  a4 U2 S# J
    63.                                 u=i*k+j; pc[u]=0.0;9 E3 A4 [) k9 u: m) T, q
    64.                                 for (v=0; v<n; v++)
    65. 0 h4 v# y' T& }9 E* z  N7 c
    66.                                 {
    67. ' N- F5 M8 A6 J$ M) B
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    69. 2 F6 G1 Y9 k& V4 B) G
    70.                                 }
    71. 8 ^% X! F0 _+ Q9 f' X5 Z6 [
    72.                         }
    73. ' R3 R3 _: }: E4 w5 a  k
    74.                 }$ u; N* \4 h6 ~9 Q$ R0 g) M6 j
    75.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象% j7 a, B. i5 {# s0 A, r
    76.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;  b- k. m3 Z. T\\" d$ d1 l5 n. I
    77.                 break;0 e\\" q/ O1 e( g# d3 D; C
    78.         case 25:        //重载运算符.*1 U% O7 j7 H: a3 X
    79.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    80. 5 y3 W4 r\\" z+ D: V
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);, V  U: W+ k0 Y/ h8 v/ p
    82.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组% }1 e0 x: w0 u: A& }. L5 I
    83.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)4 {! \5 V& k5 N  |5 d' l7 T
    84.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    85. , {# O- ^9 B& i: V4 b0 Y) c
    86.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    87. ! b0 W6 @0 U, X9 j- L9 ?2 v; |
    88.                 if(!pRealArray3) break;1 D* K' W5 k: \3 C$ K7 M
    89.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小9 M7 A  h: g1 ~; n( {6 M
    90.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘$ K3 e3 w! R' w\\" H
    91.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    92. - Q9 M( t; q2 }
    93.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    94. - G8 ~/ x) @6 P( S1 `1 A
    95.                 break;
    96. 8 [! D9 A1 g% V! O: k
    97.         case 46:        //重载函数new
    98. . A/ J) l- T9 {: C
    99.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数- [$ Q) l5 m9 w% n
    100.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型\\" @8 d; \0 Z  U! M, L
    101.                 break;+ r7 J9 ~: o\\" P+ o+ W: q& e
    102.         case 49:        //重载函数o8 z- [# t- ~\\" N; f, F! e7 Y\\" W- f
    103.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    104. 7 T& U2 B( N' X: l7 H( f' d# X7 b- |
    105.                 if(!pMessage) break;' c! `$ L$ O8 s5 a1 u2 M- W
    106.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);. g6 w. p/ ]4 D\\" z; F* }# W
    107.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    108. ( E  s9 C! j* ]( t+ r4 D+ ]
    109.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    110. \\" j, o4 V! {; }0 u) p
    111.                 pa=pRealArray1->Array;
    112. ' u1 ~/ |\\" P/ |$ j% p1 H  V  p
    113.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    114. : m2 \: x8 Z. h2 [! Z# C4 P, ~
    115.                 for(i=0; i<m; i++)        //输出矩阵6 [, `$ o) w, V) f1 ?
    116.                 {
    117. 8 \8 t/ a/ B7 M3 C4 v; o5 s6 W
    118.                         pMessage(L"\r\n"); k+=2;& j$ g% c+ j$ _$ T2 R. c2 A
    119.                         for(j=0; j<n; j++)
    120. & R  S9 [* R+ W, @+ h$ y9 x
    121.                         {. h' z5 H: G  `6 A$ m$ D$ x4 j
    122.                                 _gcvt_s(chNum,pa[i*n+j],16);
    123. - ]. n7 e+ z  U. l) ]: `* M9 q
    124.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    125.   i0 T+ ^0 P% S
    126.                                 wchNum[u]='\0';
    127. 9 \0 v% @( K# R! ]
    128.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    129. 4 V8 e9 }: y( h# f2 X5 P
    130.                         }
    131. / E+ X' H7 S& R+ [% j
    132.                 }+ h7 W9 T* g. M% D% k
    133.                 pMessage(L"\r\n"); k+=2;
    134. & J+ ?$ o7 J) x, b
    135.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数) K. W# F: c* T6 C0 a. ]& ~
    136.                 break;7 ^! n. K, l) F. N. R2 R
    137.         default:0 {* \\\" W, c$ R- k; W! a
    138.                 break;
    139. * o  B. f* |. T7 N% T6 {
    140.         }
    141. 0 d6 k* ]* Q# `1 E& A* B; h; o
    142.         return a;9 @3 g+ X2 {\\" D# h9 g
    143. }- A# ]9 \6 A! m9 F6 d
    144. void main(void)5 G$ {' [2 v1 ~4 m- u. A
    145. {
    146. + b5 J+ I& c* n3 e* y  a
    147.         void *hFor;                //表达式句柄
    148. 8 i9 I4 h# Q8 H
    149.         luINT nPara;                //存放表达式的自变量个数
    150. 3 \- O$ _; A) z0 t& @
    151.         LuData *pPara;                //存放输入自变量的数组指针+ c) O% h: S# ?# x( X4 h
    152.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    153. * I8 A- b9 n5 B# u0 O: l
    154.         int ErrCode;                //错误代码
    155. 1 n' y' }& a4 o: W- B
    156.         void *v;4 V! `' B0 N# J! [, ?
    157.         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.]}";//字符串表达式,矩阵乘
    158. - ~: K; @$ N9 @( I5 A) Y+ I
    159.         //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.]}";//字符串表达式,矩阵点乘5 w# w# L7 j7 v8 y6 W
    160.         LuData Val;' C. j! }8 I* B$ t( d
    161.         if(!InitLu()) return;        //初始化Lu
    162. 7 s0 g( ^- w\\" H: a- a9 R7 ^, q
    163.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型7 h+ I' I0 q9 q: m
    164. 1 I5 o\\" B% e+ W- @% \# R
    165.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    166. * y8 A. R$ M7 x' Y/ b
    167.         SetConst(L"matrix",&Val);        //设置整数常量
    168. 0 P( U& F! }1 K
    169.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    170. ) a( v* u\\" u% D/ j* }8 U
    171.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    172. ' Q+ X  a6 b. \* l/ }+ Z  d9 d
    173.   , N% J9 [1 q# u5 W3 ~! C, P
    174.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    175. 4 f2 X  ?7 s, R; Q2 Q5 {- g8 [3 {
    176.         if(ErrCode)
    177. \\" o9 _) I0 k  Y/ \$ i7 t/ a
    178.         {- L7 R6 d7 b3 k* K
    179.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    180. $ W  D( g4 {4 c\\" n
    181.         }
    182. * ]. o/ L; K# p* i7 s& r7 C+ w
    183.         else
    184. - \. [4 H* I7 f8 a) f2 K( h: }6 g
    185.         {
    186. % t: G. N1 T* y) H
    187.                 LuCal(hFor,pPara);        //计算表达式的值. J9 m2 K, u\\" l0 i: Y2 E5 h7 f
    188.         }9 j& u% w) F& k( x
    189.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    190. 5 |3 M% M- Z/ L, d* k) p
    191.         FreeLu();                        //释放Lu9 j* a/ K' c0 d, X
    192. }
    习题:
    # C# L) F% u+ Z) x
    3 s5 G9 h% F  u- Y$ y    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 * T# i; l. E; i+ F: u  S
    7 X* d/ v1 u/ Y/ ^1 i
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=# T* H4 v* V  J( H
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      : P6 o0 k  I; i$ Q- k( {
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      + Z1 z& X8 \& T- ~. D. C- Q
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      1 M1 J$ n. ]& J+ e+ a, K
    5.     t=clock(),
      \" \. H0 j9 Q6 q8 \( M
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      4 ]\" n- Q2 p0 M$ ?! G
    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.: e! y, k$ t\" W/ t. A! y
    2. 5. 4.
      3 M9 f+ Z2 n1 K4 F
    3. time=0.875 seconds.
      1 J9 q: h: P5 v! a
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      . X5 W\" |+ ~. l& a& o
    2. b=[2.,1.;1.,2.];9 W( }( e0 j+ \
    3. c=[2/3.,-1/3.;-1/3.,2/3.];% A! X/ S  P5 a8 @, H
    4. tic,8 |+ y1 |. G& }4 q' u9 C
    5. d=a*b;& z+ J) G$ [! u' ]9 j0 @
    6. for i=1:1000000
        X2 e* ~6 C1 `6 s7 N) Y4 O
    7.     d=d*c*b;  M3 r8 C  L! l
    8. end
      0 ^& K- P/ s: r
    9. d,) A. l2 Y# N- t* Z' D
    10. toc
    复制代码
    结果:
    1. d =$ R0 b; S3 f; [* P
    2.      4     5
      ( ]; B  |& _5 M1 Y' g$ Z/ H1 J* K
    3.      5     43 H; I* A0 b  l5 H; ^5 F+ X* W' D
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。" V8 y% T6 s2 E' M. d% ?
    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 04:53 , Processed in 0.302101 second(s), 52 queries .

    回顶部