QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8749|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。$ N0 w' p, T' Z" r' e8 b
    , s, h" _( l/ K, _# m  O
        基本要点:
    6 ]0 c) K$ q9 g! `- Q
    ) [' |9 t% }" E# h' P- h    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    ! T5 t! X6 k% {0 N0 ?) B
    4 g2 o: M/ T: g1 g    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。- _0 b3 h  E  y! r% E, t
    % @- D: }/ Z) O
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。) ~/ T6 v, y7 ~
    ; t1 g, w) p7 a+ |! j" N$ H4 w4 ^
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2.   N* v, U3 E' {. h  M! m+ g% h- l+ B, i
    3. #include <iostream>
    4. / E# ^2 l; ^: a% u) p7 K
    5. #include <math.h>0 o  N' s: e8 Q+ H
    6. #include "lu32.h"
    7. ' }$ H, X* j5 _2 }( p8 w

    8. - n8 c! t) L- F
    9. #pragma comment( lib, "lu32.lib" )
    10. 3 @$ B5 ~  ?# d9 x# v# T/ M/ F% i8 k

    11. ( L/ K* _' f# V. f
    12. using namespace std;/ X0 A$ o4 Y# v6 e- @' W

    13. \\" w: F# Z4 A# b  E6 Q
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    15. ! [& Z6 E- v2 ?- P  h
    16. ) x2 g* T. K  e7 p3 M1 V+ c
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    18. 8 _4 ~- k. O; L4 ~8 y) @7 T4 d. ~
    19. {
    20. 4 T# Z2 |  e% F! ^
    21.         wcout<<pch;' r+ L  W$ G  q; r
    22. }
    23. % @\\" t4 U4 V1 v( |5 x/ @: m$ l0 p\\" M
    24. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做$ B9 C6 D! Q$ m6 {' f( r
    25. {+ j0 e/ n# q! d8 D+ M0 R
    26. }\\" N\\" u$ k5 _1 }( k
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    28. / e1 t1 W# ?/ A9 v3 V
    29. {  D8 t. H1 T1 J, l, B
    30.         LuData a;4 E& c! W, z, u/ p: k* z8 Q
    31.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;/ |3 {2 K) ?: L  }\\" e
    32.         luVOID i,j,k,m,n,u,v;
    33. & ]' K# I5 q4 j8 b: a6 t2 i) S
    34.         double *pa,*pb,*pc;' Q\\" `+ Z1 x! t# s
    35.         luMessage pMessage;
    36. : s& V! I( w\\" a$ [
    37.         wchar_t wchNum[32];
    38. - |1 {5 U) b% N; S. j0 k
    39.         char chNum[32];  u( X  [1 Z) e; p2 M
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;/ \7 W- `1 `' a
    41.         switch(theOperator); `3 x) Y3 f/ I/ ^; q8 I
    42.         {
    43. ( ?8 |+ K4 e! y
    44.         case 2:        //重载运算符*# O' p) R' x  n4 R: V& Z
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    46. , s+ h6 D\\" C( R7 Q; t
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);4 P0 _! d5 ?+ u1 I! Y) J3 o- t  f
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. 0 z# Z' r: s7 ~0 c7 y. q
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)7 H5 D$ C' {: I1 z: k( e2 N
    51.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配\\" U8 K, P5 e4 b, P
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象: O$ E1 G! p6 `4 }1 N% _/ `
    53.                 if(!pRealArray3) break;+ l( Y$ \- \# g; H# b' n( w4 o3 ?
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    55. : b3 {7 V9 n# F\\" B
    56.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    57. # L: D1 {7 M7 ~/ B' t
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    59. - ^8 J$ H4 c$ j6 N
    60.                 for(i=0; i<m; i++)        //矩阵乘
    61. \\" e$ u6 j. J& G) O\\" c5 E; r\\" {  y
    62.                 {
    63. * m$ H) g3 W% i! k7 K- h
    64.                         for(j=0; j<k; j++)
    65. 3 P) \) p: |* r
    66.                         {) A6 n' {  `& ]+ M3 h. ?
    67.                                 u=i*k+j; pc[u]=0.0;
    68. 7 i3 {+ V* j. g1 l
    69.                                 for (v=0; v<n; v++)+ ?' |. _6 U, w  j+ D
    70.                                 {
    71. 0 k! \* U% r, y\\" u/ F/ `+ m& _
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    73. \\" b) \- ^2 v( B0 l! `
    74.                                 }
    75. 1 ?5 K% W: J+ _# Z; Q\\" E. ~8 g
    76.                         }! p7 B2 Y+ |6 ]\\" \$ _
    77.                 }4 Z/ z  f+ a1 ?6 V& W  }
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    79. 4 Q\\" n0 {$ O& |1 V* ?
    80.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    81. - D6 k% m& n8 H; D4 T8 B
    82.                 break;
    83. 4 R4 E- w% ~& e. G4 k
    84.         case 25:        //重载运算符.*
    85. 6 S& H) f( d) S6 j
    86.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    87. 7 Z- n8 U; `* [9 T. G+ I- ^( u% K
    88.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);5 {3 T/ z+ G# r) [/ _1 l
    89.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组) ?8 V1 _. y, H; f
    90.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    91. # C- c: @& n( ?, y& ]( i% O8 l\\" t
    92.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    93. 6 y7 `4 {* z4 {: W
    94.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    95. : g) W\\" f0 m\\" o3 r, s! S
    96.                 if(!pRealArray3) break;8 D6 i9 e* u8 l! B
    97.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小3 U  d. c: u7 S- p
    98.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    99. ; W\\" ?9 [8 t: `9 G8 Y4 U
    100.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    101. ! ]8 _& R& Y5 d- x9 r, T# a/ E
    102.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;$ D  ^, B- Z2 N! P
    103.                 break;\\" {+ `6 B/ i4 _. y7 h2 Q) n
    104.         case 46:        //重载函数new
    105. 4 w4 |3 D5 j! W8 P8 L6 i: F: Z\\" d
    106.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    107. 3 c; X+ V  o: P+ a+ C& F
    108.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    109. \\" h( O0 i- l1 [4 V. E9 A5 O! i' A8 f\\" r
    110.                 break;; F+ k9 w9 `' \1 @
    111.         case 49:        //重载函数o  \0 C7 r3 O$ G& F) ?6 ?
    112.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    113. & C8 l& \9 y) V! Y2 C7 G+ A7 S
    114.                 if(!pMessage) break;. q! S$ ?9 G  l% `- [
    115.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    116. ! M  s3 `/ b  n/ L- r- ]
    117.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组- e2 M6 H% Z8 D8 M8 D6 B1 \
    118.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)4 U+ }& q9 Z9 \; j
    119.                 pa=pRealArray1->Array;
    120. 5 T* j/ A* O6 N  u$ d
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;! a$ \  ?& [+ V8 Q. o6 b
    122.                 for(i=0; i<m; i++)        //输出矩阵
    123. . D2 x' }# g\\" F9 @6 o
    124.                 {
    125. + C( `; M: x( g9 R; d( I: }' m7 `
    126.                         pMessage(L"\r\n"); k+=2;
    127. % U\\" b% E/ Y$ Q7 G. u4 d- u, D' F3 M! ]3 v
    128.                         for(j=0; j<n; j++)+ K2 i* ]  _0 T0 n' A
    129.                         {& ^$ \2 b# U% l1 p1 q. {
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);\\" h/ R/ S+ O2 l7 t1 ?2 I: O/ s/ d3 H0 {
    131.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}! s1 p7 @\\" \( w! r
    132.                                 wchNum[u]='\0';. K6 q  i0 A7 h6 H
    133.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    134.   d% P9 C\\" v1 @
    135.                         }
    136. 7 ?! q2 t) l8 l  x7 J7 j$ y
    137.                 }
    138. - V- Z7 H0 b& Q3 D' f* a2 I+ o
    139.                 pMessage(L"\r\n"); k+=2;6 ^6 `+ h( }4 C- O' U- x
    140.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数) y2 V# Z% X. \) f$ l0 J! R
    141.                 break;
    142. ; m* k! q# Y0 I' x7 U( p
    143.         default:
    144. . h; V+ m' Z9 w
    145.                 break;2 W1 b! y+ y2 _0 b* \
    146.         }! {\\" c4 t; E1 z& {9 s
    147.         return a;0 L. g8 L3 n3 i. }6 g
    148. }
    149. ) e+ T$ _5 p\\" b$ Q! o1 f\\" k
    150. void main(void), G4 c' T/ P4 w! L/ e
    151. {
    152. 3 x2 A& q) N. W( [! b4 G
    153.         void *hFor;                //表达式句柄6 v4 @) O6 H4 q; i5 U' [
    154.         luINT nPara;                //存放表达式的自变量个数
    155. + @6 @% @  K& a
    156.         LuData *pPara;                //存放输入自变量的数组指针
    157. ) f/ @; d# ^+ B
    158.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置  i& e( _$ y! e5 j, o3 g$ F& S
    159.         int ErrCode;                //错误代码7 l+ T& D$ y; t# i+ ^( u
    160.         void *v;0 v) s5 I9 A0 p' ^
    161.         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.]}";//字符串表达式,矩阵乘
    162. 8 f/ k* A& |8 W+ d4 r! f
    163.         //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.]}";//字符串表达式,矩阵点乘
    164. 8 _( S. V- \( X. Z1 c- M: m  d$ j
    165.         LuData Val;
    166. * j9 {# G0 @9 g\\" a9 B
    167.         if(!InitLu()) return;        //初始化Lu
    168. % b6 ~4 `4 p0 X  C5 f; W& y; M
    169.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    170. : m0 S* n; }8 y& z8 E, Q2 }$ P
    171. 0 b$ `( C+ S% r% T9 m+ ?. Y, A: x
    172.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量/ L- B# Y, T1 n
    173.         SetConst(L"matrix",&Val);        //设置整数常量
    174. ; _; O) q! L* \/ m9 }6 Y, U* j
    175.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息5 p/ [\\" _9 e9 y5 o0 t. T
    176.         wcout.imbue(locale("chs"));        //设置输出的locale为中文  z- v+ y. \\\" C
    177.   ( ^# @# B0 o& x$ P- l5 [8 D
    178.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式' c1 h6 c0 Y' [% _5 t
    179.         if(ErrCode)
    180. . U- \. p4 `3 f4 v: C9 a
    181.         {
    182. ! z  x, }! ?' o, d  `+ t3 p
    183.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    184. . v% X. q  S  B& K$ G9 v
    185.         }7 D, N4 I* _+ i& R1 L) O0 [
    186.         else
    187.   h' x  y; X, _5 L5 T& w
    188.         {
    189. % I( o% M7 i! u3 Q6 C
    190.                 LuCal(hFor,pPara);        //计算表达式的值* ?' T+ |( G3 m2 l
    191.         }$ }- s5 x& C: V0 a/ n' v$ m
    192.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用5 u, a2 L3 @0 s4 l$ i- h2 T; N+ ]
    193.         FreeLu();                        //释放Lu
    194. - W, ~% j. ~2 D9 [5 [( [
    195. }
    习题:8 \7 Q5 y$ y! Z# y; K
    ! `9 u! w' j8 _3 X3 M
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    0 I$ a1 y6 j  J3 Z3 D# Q* u: [* M
    5 y! v: h  y+ f+ v5 a    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      0 T# u! H+ b! w3 h
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],\" q1 V) x' _7 d- Y! O
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      ) ^; S, B, u# s+ Y# Q! z
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      / n\" T! B3 ]$ ^9 ^5 M
    5.     t=clock(),* Y0 V! s- S8 e$ S) U
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      & ^) g# f, y# h/ D( |( L
    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.: \1 w2 ?% ?3 T\" W
    2. 5. 4.3 K* m5 Q% k. n8 V
    3. time=0.875 seconds.7 H' [6 P8 e; X/ l
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      + E' X: |: V, K0 P\" L: O/ _, c
    2. b=[2.,1.;1.,2.];0 f& k% ~2 }) O
    3. c=[2/3.,-1/3.;-1/3.,2/3.];( E% r6 f, F# a$ g' Z) Z
    4. tic,
      ' s9 J8 s$ k( ~) `) I  t0 Z
    5. d=a*b;
      5 t- ~* j: h8 l# J+ J
    6. for i=1:10000009 g8 O7 x! v! K6 X* \, s
    7.     d=d*c*b;6 [* W+ F6 N! E+ q. w- k\" x# R& Y
    8. end
      6 [5 G: |' X8 A2 k; o% G: s6 w) K+ m
    9. d,
      # V0 a# O: l/ ]; [: R1 x, z
    10. toc
    复制代码
    结果:
    1. d =
      . H% Z) N- ]: H* Q* ]$ `2 I, z; r
    2.      4     5& Y2 e; H- m/ L7 |3 t. v5 a9 S
    3.      5     4
      1 U6 V9 B9 A* b3 J
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    4 g  p2 Z: a% n8 C( P
    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-12 06:02 , Processed in 0.448624 second(s), 63 queries .

    回顶部