QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8735|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    8 u0 ?! ]; M+ e( h  O0 g9 H9 F
    ; h4 m0 \( E& Q* H3 g0 o; h4 }    基本要点:+ G9 _/ e5 ]' U- c, y. d* @6 m( ^
    ( B1 L' v  a! _  F0 ^
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    / z7 l, \, x7 H4 u( t  j$ _
    3 I6 |* Y2 I. E    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。- Q  y8 X- ^5 h

    5 g% y3 B" k9 O    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    9 n5 N2 B: Y4 ?4 C2 u$ f5 F8 i. i! P
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. + j% h\\" v; L+ n- D1 l9 u
    3. #include <iostream>
    4. 8 U7 Q) [# L8 T7 n7 u
    5. #include <math.h>
    6.   i# K1 [' W# [. O: h. O
    7. #include "lu32.h"7 t; B* r! c8 g/ e* u
    8. 8 y/ c# y* e1 ]2 L( y) ^
    9. #pragma comment( lib, "lu32.lib" )
    10. ; f! R2 M, V  Z) T$ d4 Q\\" n9 v

    11. * |1 w( u/ l! L( [( f
    12. using namespace std;
    13. & w\\" q, u+ m$ s' T4 _8 I: ?% [' ~
    14. & e% Z4 n$ J8 E
    15. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    16. $ ]8 T9 B  x6 A0 l0 m
    17. 4 n) G\\" [# {1 I! [. E% T: H
    18. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 2 Q, e3 F0 q7 ~; r
    19. {0 z# U$ O3 d0 z: n, _/ W# J8 k, R+ N
    20.         wcout<<pch;
    21. 8 A) Q' k3 g+ i$ ~
    22. }( r. H) c$ s1 \5 c
    23. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做/ ^* G\\" q6 t2 G& D+ i# p
    24. {
    25. + U0 q6 G+ d; G2 e! F
    26. }
    27. * q8 x  n4 W+ c7 g6 z  j+ g0 y8 y
    28. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数. A! p8 @) S2 g\\" d& |( N' P\\" g/ J
    29. {4 D3 B# G) y4 `( g
    30.         LuData a;
    31. 2 ?4 K: {, x# {, q$ N( f
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    33. - z8 `0 T2 t' C  I
    34.         luVOID i,j,k,m,n,u,v;6 [! a; N' p- u) |8 V& r$ ^( b6 u
    35.         double *pa,*pb,*pc;
    36. ) l2 E) V3 G- S2 j' Y
    37.         luMessage pMessage;2 u6 H) x% y! @
    38.         wchar_t wchNum[32];
    39. . s- f# \. d3 ^! `
    40.         char chNum[32];+ w9 s* ^/ `6 u
    41.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    42. # Q\\" P. d1 e' ]  [% v+ e, R6 v
    43.         switch(theOperator)
    44. 4 S2 s. B\\" |% Z8 z) w9 `* }) k
    45.         {% H) Y1 j) S! B\\" }5 ]$ ]
    46.         case 2:        //重载运算符*
    47. : T1 y, ?7 s+ x, p9 k( R& M: G
    48.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);* U. L' w, O$ t) U0 m9 t
    49.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    50. 4 D7 F+ j3 P% N' O% r: W
    51.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    52. * C. w: K' ^4 X- s; d
    53.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    54. . f1 @: r, H' y2 Y  C) |
    55.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    56. 0 R' {4 s8 K! o/ n, l1 t1 m
    57.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象, W/ O  L: @; b! |# X7 ]
    58.                 if(!pRealArray3) break;
    59. 1 m6 j6 _, L, q2 m5 H% l
    60.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    61. : r) H- T  D7 v: t# g8 X
    62.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    63. # [1 C: S4 {* N9 D! M5 ^1 r
    64.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];% E0 |) t; |# v8 ?& y
    65.                 for(i=0; i<m; i++)        //矩阵乘/ _8 l+ _. z, n5 |7 g\\" {. I
    66.                 {7 s- n$ b7 B7 d1 n' M% f
    67.                         for(j=0; j<k; j++)4 }' ~( ~' C% I
    68.                         {) G0 l3 |' C9 P8 v% Y- i
    69.                                 u=i*k+j; pc[u]=0.0;
    70. 4 W  x1 h) K! p, }; @8 G0 {' M
    71.                                 for (v=0; v<n; v++)# }' m' e4 t  u
    72.                                 {) a# ?1 l6 ~1 o* ?
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];8 ?$ S  T1 Y5 ?% N: y3 P
    74.                                 }
    75. * h- k6 o  s: S5 u
    76.                         }; W6 k, W, S! c, N) @0 N: t& p
    77.                 }5 L+ j$ j) ~2 ^6 {6 K. e0 A$ T
    78.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象& J4 _! \% b) ?. i
    79.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;) E2 k  W# L# R
    80.                 break;
    81. \\" j. w. ], l9 ]. _, x
    82.         case 25:        //重载运算符.*$ Y+ z/ y% W2 u; }* `
    83.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    84. , Z9 l4 r( |- U. D
    85.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);  d# q5 r3 C* E( X
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组2 `; n2 h3 i# a, j1 S5 E: U9 r8 ]
    87.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)% Z+ s  I  n* [. `
    88.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    89. & }: y: G4 ]; C% P
    90.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象& T0 m: ^2 @. k! O
    91.                 if(!pRealArray3) break;! W* [# ?2 P  x. s5 }
    92.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小: M3 \. g+ R( ~5 @6 E
    93.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    94. ! S# _7 r4 A* h# |( P
    95.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象: V9 W; o2 ^$ ^$ r
    96.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    97. 2 Q' [+ l/ W) \3 i7 T. u4 j1 V
    98.                 break;
    99. / C0 y) }3 V2 E! S; V
    100.         case 46:        //重载函数new\\" [/ o; J  D+ R3 V9 l
    101.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数5 o! t0 X- j# y* E/ ^3 a. H$ Q! |
    102.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    103. $ H\\" C3 w& l8 d$ q  ?
    104.                 break;
    105. / q' N% t\\" L$ K
    106.         case 49:        //重载函数o) D2 L8 T( M0 n+ J: e8 l. p
    107.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    108. 2 _4 M  E' s# Z! w. S: E
    109.                 if(!pMessage) break;
    110. . V) t# i2 b& i
    111.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    112. ; X4 S9 R, {' `% x
    113.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组+ b\\" l8 {9 P2 }+ R\\" A
    114.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)
    115. * ?- i  _1 V5 Q, Z2 _
    116.                 pa=pRealArray1->Array;% e\\" X% _: f+ o( t+ @
    117.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    118. $ p, I; r/ v5 Z# A\\" U
    119.                 for(i=0; i<m; i++)        //输出矩阵4 d- i9 k+ g) a
    120.                 {) ?. v. P- w. P' {
    121.                         pMessage(L"\r\n"); k+=2;7 y2 T, ~* a) k5 H; [
    122.                         for(j=0; j<n; j++)4 p0 [$ d6 C: i
    123.                         {
    124.   _* F\\" l5 D6 R4 V
    125.                                 _gcvt_s(chNum,pa[i*n+j],16);4 p3 V7 ^: l* S, E
    126.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    127. ' |9 ^' A  P8 `\\" `7 v$ J
    128.                                 wchNum[u]='\0';
    129. 5 |, E6 \8 q5 s' y
    130.                                 pMessage(wchNum); pMessage(L"  "); k+=2;3 |\\" s0 U( }. e0 T
    131.                         }' _, M3 `1 [5 \/ d# u0 q: g* O1 ?
    132.                 }
    133. 3 G9 ?, d4 o4 |0 s' O
    134.                 pMessage(L"\r\n"); k+=2;
    135. 0 A2 B* \, T2 E/ l: Z8 @\\" @
    136.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    137. 0 n9 J- k+ y5 Z  P
    138.                 break;
    139. 9 s0 |\\" a& y$ Q. ~\\" a  t: |
    140.         default:/ J0 g; C. Z8 P& u+ `2 O\\" L3 w
    141.                 break;
    142. 0 I1 w! F) u5 P  ]+ [; W0 `
    143.         }6 k6 v+ b2 H% S
    144.         return a;, P% ]. b2 D7 B2 q7 G
    145. }
    146. 2 z* v: H5 u\\" ]  Y* L! q- }' ~
    147. void main(void)- w8 c5 M- [* h; ~: t# p\\" ?
    148. {/ s: q& c0 Y1 d8 F7 n6 y
    149.         void *hFor;                //表达式句柄, Q2 ]2 N, G* @1 ^
    150.         luINT nPara;                //存放表达式的自变量个数
    151. ' y% I- B$ F2 c0 ?: Y3 S
    152.         LuData *pPara;                //存放输入自变量的数组指针( c\\" e0 e2 ]2 R* B
    153.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置. d& V: e1 G' S+ J
    154.         int ErrCode;                //错误代码
    155. 9 o3 a% m# j\\" p: c
    156.         void *v;
    157. # M+ \* `9 P& i# I2 ^& }( b0 [
    158.         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.]}";//字符串表达式,矩阵乘3 D0 a# ?+ w* A. k5 l) L
    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.]}";//字符串表达式,矩阵点乘
    160. * X/ H  k) S+ {6 k, E  p
    161.         LuData Val;
    162. . L4 ]\\" r( Y& r
    163.         if(!InitLu()) return;        //初始化Lu
    164. 8 E6 `! T% S! [; r! @  ]
    165.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    166. 8 }! V, V$ i) x( q, ^; s
    167. * K9 _; H. {& \% |4 o
    168.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    169. \\" k% [1 j! g- {4 U3 D2 F% w) T
    170.         SetConst(L"matrix",&Val);        //设置整数常量7 p0 B. d) j2 L0 `+ P
    171.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息
    172. $ b2 E) R1 _; R% d+ P3 F* O! h
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    174. 9 h\\" |2 b7 H( D1 _: I0 J7 X$ o8 v
    175.   
    176. / ]4 C% L- B; P& `/ F
    177.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    178. 8 |( e4 i* E: b( y. P. f
    179.         if(ErrCode)
    180. 4 @: a; K3 I2 k: Q9 P% R
    181.         {
    182. 7 i+ B0 |: u! ?- k( e4 d9 P
    183.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    184. 3 g; Q. v\\" y5 r) J5 }: m9 l
    185.         }
    186. % V1 h7 a1 n: H; n3 V- B
    187.         else% U9 v6 a! `# y: U1 @
    188.         {
    189. ' F% ?  F' i4 P8 F7 D% }- n
    190.                 LuCal(hFor,pPara);        //计算表达式的值
    191. \\" l6 J  E$ b; ~7 V, @) r1 j* b
    192.         }* _\\" J- v0 J7 W% |; O3 r# f( O
    193.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用  i$ Q4 e/ g% ?; q
    194.         FreeLu();                        //释放Lu' T9 k, `\\" q8 B
    195. }
    习题:
    , s, |+ E( I* o9 [, W0 \3 I) @8 t& g4 k% c
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 : c4 k' w8 s, [3 S7 M5 ^. o

    $ E4 b" d# f; i8 A6 E; J    (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=4 t7 ^: L6 x3 q- `* f\" K* W
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      ( y% y! N' D+ a/ ~) K8 Q
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],( V6 I% h! q9 {2 ?
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],/ q' ?0 r8 `\" i: y
    5.     t=clock(),+ E8 }- e% f7 ]' t
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},0 z% v5 y/ ]. T4 I, g7 S1 z0 r
    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.
      - f+ [7 j) N5 o1 M
    2. 5. 4.
      0 W8 y( @1 ?$ v7 v+ {, H
    3. time=0.875 seconds.# R: [5 H8 n- J# f6 Y
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];; Y8 }# O( U9 c5 I8 [# k
    2. b=[2.,1.;1.,2.];
      ; z/ r& s0 v7 M: O
    3. c=[2/3.,-1/3.;-1/3.,2/3.];' |+ C! L- |8 _( ]* H8 W8 @\" M
    4. tic,- B2 b$ d( G9 R0 Z6 A4 q\" J
    5. d=a*b;! \( P& S& C( ~
    6. for i=1:1000000
      \" k3 Q5 D1 ]+ Q% B: o
    7.     d=d*c*b;
      8 f. S/ j1 C' ^% _
    8. end
      1 j& C* I9 p  a1 w2 z; l5 \* C
    9. d,
      ) U& t( f, M3 Y* l5 g
    10. toc
    复制代码
    结果:
    1. d =
      5 ]3 I, ^- \( }0 V# H
    2.      4     5\" E1 O: e% V3 W% |
    3.      5     4
      1 w. F% q7 a( |
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    4 O; E, b- o' T9 I/ ]
    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-5-25 05:17 , Processed in 0.449623 second(s), 51 queries .

    回顶部