QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8364|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    : Z( N  F& B+ S* D
    5 f3 e; ?( i  E6 t1 _* w    基本要点:: M& H5 l9 U( @. W6 G

    1 F. u& _5 p7 g$ |5 ?3 r; X    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    ! _4 B/ Z  J, a# d% F# \: n9 X& v2 f7 N: T
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。$ I- E8 w, c# k2 {/ L! ~6 k1 [4 I

    9 Z; Y& A5 ^3 W( c    (3)为扩展类型matrix编写其他操作函数(本例未提供)。, u# `! I: ?6 ~' F- N4 O; y" o
    ; d  Z4 `- S* j- u* J: d
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>5 J\\" W# H$ F5 \3 v/ o7 d* _, q
    2. #include <iostream>1 b6 M\\" _4 M3 B) h2 X' u' H# R7 e$ F
    3. #include <math.h>
    4. ) E. _- L\\" l# y2 B- u/ g1 s% J: L
    5. #include "lu32.h"9 O# j3 @3 V6 t) M1 x8 ~3 P/ \

    6. 9 T, w/ @\\" N; d. f7 e( L
    7. #pragma comment( lib, "lu32.lib" )
    8. ) t) {' m- h: T, i5 e+ {  G7 q
    9. % }\\" t\\" ], p* P
    10. using namespace std;
    11. 4 Z, n+ P: e. p$ o
    12. % w+ `% X& G/ d5 s! E+ `9 K  [
    13. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定1 n8 G, i  Q5 F+ k1 x4 S

    14. , }3 C+ w/ ?! }. U- e
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. 6 z\\" z2 S0 d+ w  {
    17. {
    18. ! J( E% p$ D# n/ P  r5 P9 P  N6 _1 h
    19.         wcout<<pch;
    20. ) u' I8 z; k$ d. w
    21. }; r7 o8 i3 ?$ z% S( M+ P
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做: s4 M( ~0 a7 i\\" m3 P
    23. {0 N7 I7 T% S6 l+ \( P, l: }% Y0 H
    24. }, f/ z- |; H8 M5 f# N
    25. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    26. 4 i. E$ F* X- Y
    27. {
    28. & k& Q+ y6 z& k
    29.         LuData a;3 T2 r6 U# G! @6 r% o\\" C% f! F. n
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;% y+ D# p  @  u0 D/ e4 J
    31.         luVOID i,j,k,m,n,u,v;
    32. \\" Y+ c6 V- g7 }& W7 u1 w, L( f
    33.         double *pa,*pb,*pc;
    34. % ?( d' V# T( ^7 p3 X
    35.         luMessage pMessage;
    36. 5 a7 H/ B1 U5 n! c\\" W
    37.         wchar_t wchNum[32];
    38. 9 b# v4 J- z0 O& [  B/ @# q6 v
    39.         char chNum[32];1 x  Y, e. E9 t) h! S1 `8 ]7 K5 Q
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;. J) o, _% C+ _/ }2 b9 b$ `2 B
    41.         switch(theOperator)) V) G$ I! {% s  a
    42.         {! f  @! V8 Z2 T! O% J' V  _
    43.         case 2:        //重载运算符*; X. H# d# h6 D0 }0 S
    44.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    45. / @  K- M' i) y  I9 U
    46.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    47. 9 f/ h, s' H' O- R4 H+ r1 N5 s
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. 8 a% Q* n+ v6 u6 x1 {; K7 r
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. / Y& f1 z# D' h3 K
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    53. ' y; T; B: f* d% d+ Y* u# W
    54.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象! M- a5 ~+ A9 b  P( ^$ e! C
    55.                 if(!pRealArray3) break;- |% E; \* Z! Q
    56.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小; E1 I- ?8 Z) H8 n0 t
    57.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    58. 2 Y& U  b' [1 x! i0 y6 a
    59.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];3 @6 c; }) L- \: H- E! T
    60.                 for(i=0; i<m; i++)        //矩阵乘3 y' c* T* L, ^
    61.                 {
    62. 3 \. K1 E- E! ]8 v6 I\\" ^) c1 b
    63.                         for(j=0; j<k; j++)! S$ b* l5 a$ k( D
    64.                         {
    65. 0 Q+ h\\" v! ~2 A7 m7 j8 m1 O
    66.                                 u=i*k+j; pc[u]=0.0;
    67. 7 M, |* K  b# B0 v  m, l
    68.                                 for (v=0; v<n; v++)
    69.   W- N) x+ k3 V+ e+ [8 f
    70.                                 {
    71. & K1 K+ g9 g2 `6 T' H
    72.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    73. , D  r\\" k6 G) r5 h1 b0 ]5 ~' f8 A
    74.                                 }% z4 U) |  K. x5 ^! C- p
    75.                         }
    76. ' J! \( l- V0 c4 {* @
    77.                 }' Q, N- s+ G8 D0 I) u
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    79. 3 q8 N* y: x: ~( L3 w# M2 X
    80.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    81. % J7 ]0 Y8 N/ H7 T+ w  g
    82.                 break;. o0 a# r6 m  F, z
    83.         case 25:        //重载运算符.*. @2 U. \/ O5 o\\" R) b+ K5 q' A8 v9 O
    84.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);$ ?* ?) F# `' _2 Y, l, O8 y; J8 ^
    85.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    86. ! p0 T* {! R# S3 C
    87.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组1 ?3 v3 P+ o4 M; F( A
    88.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)/ A$ s6 I6 A( N3 q# F4 o
    89.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    90. 3 q: o7 }+ K# P1 A5 Z6 [; ]
    91.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象' [5 \: s+ X3 ^5 i1 U
    92.                 if(!pRealArray3) break;
    93. 4 O5 _; u) S7 ], Y3 @* D
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    95. 3 D% f! B' G. n( Y4 T* R+ Z\\" ^
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    97. / Z' P- }+ u$ E0 [) K
    98.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象! [9 O. G9 r# U' O. x# }0 \2 s  A
    99.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;/ V8 L' d6 b- `; _* v/ O( {
    100.                 break;
    101. - i& x  Z- }* M0 y& P1 t
    102.         case 46:        //重载函数new
    103. ! S7 V. `! u& C9 |5 I$ `
    104.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    105. 3 b8 X5 z0 x: t! e
    106.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型2 {7 u1 m- c6 e( [3 ?) y% r
    107.                 break;4 M* P5 B6 N& _& y  L: ?
    108.         case 49:        //重载函数o
    109. , M4 Y- Y- ?* N2 i- y7 a$ |, l
    110.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);$ [6 o5 R* ?6 G/ Q# W5 ~
    111.                 if(!pMessage) break;
    112. & }5 c% z% n- E$ I- V% ^. m6 f
    113.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    114. ) k6 Y) K* t3 v) }9 D
    115.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    116. % B6 B. x) V: P  e6 _3 {# x
    117.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)\\" Z# u\\" b* t: P
    118.                 pa=pRealArray1->Array;
    119. % N- T  }1 u\\" s* `6 Y: {! t
    120.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    121. % W( @2 f: L+ R7 x3 T' ?
    122.                 for(i=0; i<m; i++)        //输出矩阵
    123. / O! M9 g+ ~6 i+ \: y( v& n
    124.                 {3 [- B) ~: g/ r; E\\" N) @9 V) u; G8 u
    125.                         pMessage(L"\r\n"); k+=2;
    126. ! r% t! ?2 U$ F. a* V
    127.                         for(j=0; j<n; j++)
    128. 3 e; L$ W$ c4 a7 U  Y
    129.                         {8 Z- {9 S# p  r\\" A8 [1 \: j
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);
    131. 2 }+ ]5 Y9 Y5 ]( j3 r0 y
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}2 P# r, B/ j  }( A. ^  |
    133.                                 wchNum[u]='\0';0 o7 @  r* m3 ^: \9 C
    134.                                 pMessage(wchNum); pMessage(L"  "); k+=2;2 N3 q3 g! D$ ?8 L. ~2 g5 L* z
    135.                         }
    136. ) t\\" T3 n  S* s# R1 T. W# v
    137.                 }& w5 }! D, i\\" F6 l/ n9 _* v
    138.                 pMessage(L"\r\n"); k+=2;: \' M. s) j; S, s7 @5 Z
    139.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数$ |4 n- E* a* b7 }; c* q  R# w
    140.                 break;
    141. , F\\" x8 ?( h+ L2 ~! i! M4 w1 {
    142.         default:
    143. - Q2 k, `5 h. M( V( i6 Z1 x
    144.                 break;
    145. 6 v4 {6 l; j6 U
    146.         }0 m% _- e5 R5 z4 h
    147.         return a;0 x) \6 D6 w! {- i' y\\" _+ e% M
    148. }
    149. 1 I# j& f& P, i( Z- o9 F7 T7 O
    150. void main(void)
    151. # n% }2 z4 [3 z& g# r: G4 F
    152. {' }- I; G3 k/ [
    153.         void *hFor;                //表达式句柄. L& c5 e9 \\\" j! r4 ]
    154.         luINT nPara;                //存放表达式的自变量个数
    155. 2 P2 o' c, ]) F; ?* r# I. B
    156.         LuData *pPara;                //存放输入自变量的数组指针' m% K6 `0 E% N( C- i4 l
    157.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    158.   K% {\\" ~4 P: |8 c! N0 n9 h
    159.         int ErrCode;                //错误代码9 h9 F! J7 F: B1 F( Y
    160.         void *v;
    161. 6 k3 b# z& m; X+ D
    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. & C\\" P. l4 A4 x1 z! I% S, N
    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.]}";//字符串表达式,矩阵点乘4 Y! z; y. x& T3 |$ L# Y  p
    165.         LuData Val;- {/ k8 c/ o; E8 F, P
    166.         if(!InitLu()) return;        //初始化Lu' |5 T' u, C2 K% g+ m' }. _
    167.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    168. ( p' a$ D5 l6 J! O. P5 N

    169. * N: o5 C, b( P# L9 M/ Q
    170.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量1 C! i4 B- g; H
    171.         SetConst(L"matrix",&Val);        //设置整数常量3 \: M( B6 j) Q2 {- C* V6 P& w) v\\" L
    172.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息, C, y. R' I9 _2 T
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    174. ( ?7 t* m3 q3 t
    175.   3 {5 t, S* S! P7 X% L
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式6 |2 U7 x; k0 l4 C) F
    177.         if(ErrCode)
    178. 2 Y% U. J# _% s9 q# u' X
    179.         {
    180. - e8 A( W4 y  w; d
    181.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;. A8 r! ~2 k/ ~; Q% b8 J& {7 b
    182.         }9 P9 D0 a% F/ O\\" ]
    183.         else$ s8 _/ y8 \$ V( j
    184.         {
    185. : k\\" [, G* x5 _; N# w% b; e
    186.                 LuCal(hFor,pPara);        //计算表达式的值( f/ q3 r6 ]6 q9 @+ q\\" z$ N3 B
    187.         }\\" n% i( G3 l9 D  [$ G2 q# _' H
    188.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用# Q8 d0 O8 G& S- O
    189.         FreeLu();                        //释放Lu
    190. ) C) S0 A6 y' k: m0 K  C) t
    191. }
    习题:
    4 B6 C' D, v; G: O% I* n9 W& v; D; E- ?
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    5 |! R9 Y& Y  a  Z6 m! E7 [  X& j1 L$ q$ L, f: v' z( t3 G- j0 p
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=5 P. p8 {( ?: x' L/ T& E, T' y
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],8 c1 a8 |! n4 ]1 a, F; Z
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      % R3 D' Y/ K0 N$ N\" G
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],! M7 L& u9 x- a/ B2 b
    5.     t=clock(),  n. e7 R3 o% p\" e9 K/ @1 {- M0 |4 J& P
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      / l# V+ ^/ {7 a+ H8 A
    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.7 r( G+ j8 y1 W, i3 ~' W; d1 n
    2. 5. 4.
      # r2 U3 g' k7 E+ Q3 w9 j  o
    3. time=0.875 seconds.
      , G5 T\" ~6 \* y! g/ s7 [+ l7 H
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      8 Z/ s* n0 }6 Q5 W
    2. b=[2.,1.;1.,2.];
      2 E& V$ T* v' T. N  A5 i1 k\" v7 G
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      ! o( b0 z# B/ K& k
    4. tic,
        @% G& S/ w8 _\" j1 k4 E
    5. d=a*b;
      , N( F& n3 S5 n; b& z$ X3 f2 r! L
    6. for i=1:10000006 T( N) c. T8 x6 w\" R\" @$ ^- Y
    7.     d=d*c*b;
      4 B# m' m2 O! t+ j9 R( F% X5 ?! X  a; X
    8. end
      6 o& {3 a; a' l, N. e
    9. d,
        t6 O% s/ ]& a+ ~8 G
    10. toc
    复制代码
    结果:
    1. d =& x, i! Q( p* s\" ^: f0 z* \
    2.      4     5
        d* W$ ]' Q2 q
    3.      5     4
      * H\" N, R5 K; h2 j
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。1 N! J1 C2 ?# f
    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, 2025-7-26 21:43 , Processed in 0.476293 second(s), 52 queries .

    回顶部