QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8686|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    * s3 L0 D8 H4 m6 h/ v- A. v
    ( V5 `3 i. _" P( M    基本要点:
    - u/ c* v; Y8 w+ l8 h* j$ C6 a4 [- r! ?8 j1 A* g3 G: m
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。& y5 A# _, F3 L; ^

    4 I) w! J; o9 m+ M2 k% U' @    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    6 q7 O1 m7 @  ^, S
    % n" z0 C+ P' _& @7 _% ?) b/ o- R5 O    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    . D. j% N" l) a* v7 k0 F1 g: I, U& E( j
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. $ e8 b1 d8 j3 r1 d  ]1 c# ^5 @4 {
    3. #include <iostream>& K; L9 ]  ]+ P# [5 w1 G
    4. #include <math.h>
    5. 8 ^' v, d\\" }( w6 M6 W; a
    6. #include "lu32.h"' d% G8 f0 ~# @' M) ^; e0 Z

    7. \\" ]! v# f- n3 I5 i5 D- J
    8. #pragma comment( lib, "lu32.lib" )0 u( [5 S7 J8 ?8 X6 |; `# Z7 U

    9.   R! l) Q* e& d: s# u/ [) o* o1 u0 Q
    10. using namespace std;4 A- B8 j( L! D' K
    11. 0 h% H# z$ ]8 `- N7 U
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定\\" k5 Z8 P! u1 ], w4 h0 D: L* ^5 F
    13. ) B1 D* Z+ V0 M, U, w4 _8 }, N! N
    14. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 ) a7 n( m8 F) r2 z\\" h3 y; y% O. o  H
    15. {8 B4 W2 S; [( i
    16.         wcout<<pch;
    17. # F/ Y6 C1 M; r
    18. }
    19. # B9 W9 h1 l+ A; i0 I
    20. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做& E- E) n! E\\" a* y- {
    21. {4 t3 u( r\\" \6 Q
    22. }
    23. 2 t6 l& F: P$ H7 n; t% V
    24. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数3 x' g. ~$ ]/ f; `1 }; a
    25. {: \/ U7 _/ `7 {& n
    26.         LuData a;\\" A$ n\\" j8 c. b! A\\" |% `
    27.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    28. , k+ b7 c& q+ g5 G% o( s4 N
    29.         luVOID i,j,k,m,n,u,v;, ?+ @* N8 [\\" Y' N3 z
    30.         double *pa,*pb,*pc;1 [' b4 U# V* I
    31.         luMessage pMessage;
    32. . h( @$ U, h& S* K, T- ~+ H
    33.         wchar_t wchNum[32];
    34. / _8 P8 R9 T8 J5 Y$ D' R! r
    35.         char chNum[32];& ]* q1 C7 \5 h, C4 _9 }* m
    36.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;/ g3 M; U: {1 R* j/ L7 ?, P) v- |
    37.         switch(theOperator)
    38. / I7 r: S: V' N& z
    39.         {8 \; e) T) M! }
    40.         case 2:        //重载运算符*
    41. / |: e4 U. I2 m* T6 s1 X% |6 g* @
    42.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);; o1 \3 D\\" A8 v4 }7 ]  M
    43.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    44. # X: \3 R+ j: C% I8 i$ ?
    45.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    46. ! A/ u+ F  E; F1 d\\" ~+ @
    47.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)( y\\" y# Q( o% e1 R0 \; R
    48.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    49. . T' Z* A\\" i# w+ x
    50.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    51. # A, s/ _- s5 U) S! e
    52.                 if(!pRealArray3) break;
    53. - P9 M& e; P1 L4 W
    54.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小9 n6 j: x! V- {$ H* b5 i
    55.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;; B7 T6 A' K% P1 ^/ N9 E( e
    56.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    57. 9 P# J9 I/ f' S\\" B5 E
    58.                 for(i=0; i<m; i++)        //矩阵乘0 J% X' w) }4 c0 t, c$ S7 @
    59.                 {0 w, `4 s& d4 L! i: }2 H1 @! Z
    60.                         for(j=0; j<k; j++)
    61. , [4 Z( m- b8 j% ]2 l
    62.                         {, H) _6 q. ]8 u
    63.                                 u=i*k+j; pc[u]=0.0;
    64. ( b% i  g+ s: s
    65.                                 for (v=0; v<n; v++)
    66. ! Y5 q0 {: @  w, h  e6 [( l' [
    67.                                 {7 e\\" h( A; h- {) z2 Y
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    69. 2 I, o: S: O0 j0 I& K3 u; R
    70.                                 }
    71. 5 R1 m, Y$ B6 ~2 j0 ?5 B% B
    72.                         }
    73. \\" y- _. l6 z. y$ b/ {( ^5 t
    74.                 }* |  \+ ~# _- d9 H4 A( m
    75.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象+ N+ Z+ J+ o' T. X3 c1 z- ]/ e
    76.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    77.   V; v1 \  i+ M% B
    78.                 break;/ ]$ _/ @7 m2 E: h: ~/ U
    79.         case 25:        //重载运算符.*& ]0 g! |0 t) l0 w1 C8 [4 c! F5 Y  s
    80.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);\\" v: @& h5 M+ U1 \$ U4 G8 k
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);  d% P+ I, \\\" ?& _2 P5 s: |
    82.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    83. # S6 m: i/ ~: c8 V
    84.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵); b( v8 v\\" ]9 C2 K
    85.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同* R  [. g\\" @! y- Z
    86.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象
    87. ) k1 N+ d+ M: j& ]+ n
    88.                 if(!pRealArray3) break;
    89. ! b$ R1 s. V0 V. C1 _) P
    90.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    91. 6 i3 \% w* a+ F  M, F4 W
    92.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    93. * P. p0 e+ V8 W4 \* n
    94.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    95. 4 S8 p7 G( ~\\" v+ ~6 q% Z2 m8 n
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    97. , S% }/ N8 g! v! o2 }* X2 m; P- f
    98.                 break;! u8 }: \# @) t6 z8 y6 j
    99.         case 46:        //重载函数new9 g) [. M4 q: m# a, o
    100.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数% o+ Z# ?4 k! m& J
    101.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型- V% z. f' r# Y' ]+ Z
    102.                 break;9 c- G6 [  I: X4 `1 g3 N
    103.         case 49:        //重载函数o8 S! g. C& v, c7 D! b- I* R( r
    104.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);7 J; s1 Q0 D: y
    105.                 if(!pMessage) break;
    106. & \* Z7 N3 q& a/ s4 j% h
    107.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    108. . F$ r* X/ r/ T5 `) O8 B3 X
    109.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    110. $ M. A$ B/ n1 m0 \
    111.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    112. 0 a( U1 Y% i3 `
    113.                 pa=pRealArray1->Array;3 G  Y/ [, l# m! X
    114.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;, w$ o; Y0 j/ K8 {6 v
    115.                 for(i=0; i<m; i++)        //输出矩阵1 T7 m# l; m+ ?0 h$ |+ x% |
    116.                 {
    117. % D! Q  l9 G4 g& s/ W; k
    118.                         pMessage(L"\r\n"); k+=2;! J. U% r# R2 e; w
    119.                         for(j=0; j<n; j++)
    120. ' h' _& {! X- E; z3 l
    121.                         {\\" p, }( f\\" w: H( R/ ]# M
    122.                                 _gcvt_s(chNum,pa[i*n+j],16);
    123. ( m( B5 w' `1 H8 k2 m! @: B
    124.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}: F1 z\\" C9 t% m! m% E
    125.                                 wchNum[u]='\0';\\" ^/ ]9 X# @+ P% `5 C+ T
    126.                                 pMessage(wchNum); pMessage(L"  "); k+=2;9 u. C. c/ r3 ]3 _
    127.                         }- m1 S7 j+ Y2 U) s$ l
    128.                 }' p. L+ \  G9 K  c. V
    129.                 pMessage(L"\r\n"); k+=2;
    130. ! t& U\\" g% T4 f5 }6 q' z  t
    131.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    132. ! F\\" P. s4 {$ z
    133.                 break;6 |3 b( Z, S* O3 e4 p\\" q: y+ u
    134.         default:' ~+ w& ~# B7 R6 v% a0 b' k! C5 W
    135.                 break;  l* Z  Z/ Y% o- Q$ y& h3 V' y- N6 a
    136.         }& K: z4 O0 G) D6 v& ^
    137.         return a;
    138. 1 k8 H8 z/ D8 U/ G- H' Z9 V
    139. }& j4 y* h6 C* p/ i# H4 C5 X
    140. void main(void)\\" Y% Z3 D7 r) ^: z
    141. {
    142. 2 N3 q( q/ J- N9 n  j; A! D; M
    143.         void *hFor;                //表达式句柄& n& |' P0 L: n/ Y0 Z; D
    144.         luINT nPara;                //存放表达式的自变量个数- i+ k# Z9 Y2 [) y, Q; J0 ?, j
    145.         LuData *pPara;                //存放输入自变量的数组指针% ]& w9 I$ y0 z  Z( R! ~
    146.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    147. ; ^3 m* b+ V% W6 k# i# G$ Z
    148.         int ErrCode;                //错误代码
    149. / h* f. `* p& M
    150.         void *v;
    151. ( n  J( L5 o. M& g: }/ P+ K1 n
    152.         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.]}";//字符串表达式,矩阵乘
    153. 6 ~1 S; k4 w$ \5 z
    154.         //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.]}";//字符串表达式,矩阵点乘
    155. / U. @  P; p$ E
    156.         LuData Val;
    157. / a2 o6 j4 z# |$ z. g
    158.         if(!InitLu()) return;        //初始化Lu4 G6 F- P+ O  P+ U, E
    159.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    160. 2 B, ^\\" F/ |$ u) w( b

    161. & E  w- @. R  e$ f' v5 F
    162.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量5 @9 q\\" g4 s; ~' ~, T/ V5 e
    163.         SetConst(L"matrix",&Val);        //设置整数常量
    164. / O. m! g- j( t' R3 r  L( Z
    165.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息8 K! s& O* v) Z. V+ E
    166.         wcout.imbue(locale("chs"));        //设置输出的locale为中文# y9 n, U' [' Q! `
    167.   - P% X0 o5 t7 Y6 `$ e) @3 W
    168.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    169. . T% E: T3 e, a* z
    170.         if(ErrCode)& {7 @0 i7 c8 D& v
    171.         {7 Z- F' o3 v+ H6 b; }6 J2 _
    172.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    173. 2 s5 A# C9 x% h
    174.         }- p$ Z& a0 |* J- w3 g
    175.         else
    176. # B. S, W: G2 @5 l) P
    177.         {
    178. 9 P0 b5 ^) j5 u9 \\\" Z+ k& A
    179.                 LuCal(hFor,pPara);        //计算表达式的值2 q0 d0 N5 R/ q# |3 Q; \) {4 u
    180.         }
    181. 6 ]4 r, A7 {% s9 a  |% v  \
    182.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    183. . d  Y5 h5 O' g1 J
    184.         FreeLu();                        //释放Lu
    185. 0 ]1 R& ^- |# [- Z
    186. }
    习题:( n& T4 t; R" z; K, T( t* S* S
    8 m5 O8 r9 H  `, h2 N3 {
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 ) u! P- l* R0 E0 b
      f9 X. w$ \8 t+ o! h0 v7 x. Y+ i
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      # z9 `0 y, }- x, p7 K; F
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      8 ~/ K% _+ a( `, P9 c
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      . l/ X9 J' F\" K: T# [
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      3 B# h' H\" V& k0 e+ w0 x
    5.     t=clock(),% N. q0 e- U# W) A8 J
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      . K' `9 U* u7 U- W
    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.6 j6 H- L& f  `: a6 ]0 P
    2. 5. 4.# \0 Z+ B* b. z, Z2 L' [+ o
    3. time=0.875 seconds.: q  m% B$ j; \) X# e, @6 [( }. o9 p/ N
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      $ l- o- p7 I! J$ Y, F0 o  I8 I2 ~
    2. b=[2.,1.;1.,2.];\" \6 x- Y# f9 V8 x6 K8 k2 ^
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      % @7 z; Y  I/ @: p: K: m/ u
    4. tic,; ^! v8 x2 O1 u! S8 M
    5. d=a*b;
      , L  N* T/ H; f9 q$ [
    6. for i=1:1000000
      5 O% ~) i9 ]$ K( @
    7.     d=d*c*b;
      9 @7 I% z) T' B, z- W\" n4 z4 `; Z, d
    8. end- q' M) [+ O, s$ R
    9. d,\" L9 S. z' {% i$ L
    10. toc
    复制代码
    结果:
    1. d =
      * a; w7 j3 B6 O! o
    2.      4     5
      1 I( d: R) n6 T4 n/ K\" q) Z
    3.      5     43 k6 i9 H$ \* m\" C* ~
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。9 V  G- M+ n+ z# m
    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-4-19 21:55 , Processed in 0.435807 second(s), 51 queries .

    回顶部