QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8753|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。$ d% }4 h3 Q. @! \6 H

    & q- D4 P) ]: F! z    基本要点:
    5 {  D' c4 K+ q2 b" ?8 O" s2 k' K% \5 X- \4 B
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。+ i7 C6 F, @6 E) n! A0 w) |

    3 K6 w! F, T( \; Y  ^  b/ x    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    ; b' V# A! r/ x9 x) d) k$ d6 [
    + D+ G3 o6 |& q    (3)为扩展类型matrix编写其他操作函数(本例未提供)。& W0 Z! e" f# }& u
    0 w4 [# n- q- }' ?  D/ d- ]# }
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>: `' ]7 k7 l6 }8 q7 H8 n\\" ?, _# ~
    2. #include <iostream>
    3. - O6 a  _: d, h) V' P9 f. j
    4. #include <math.h>
    5.   G  N8 P, |1 g' M
    6. #include "lu32.h"
    7. ! i- O. g& X4 d+ M* V

    8. 0 w5 ?& W1 e$ i0 G: B' }- R
    9. #pragma comment( lib, "lu32.lib" )( f: x: ?  m4 u% W; ?5 P
    10. 9 Y& t4 s% c% ~9 I6 F
    11. using namespace std;
    12. ' z( D2 o3 B$ V$ {  J
    13. 7 S7 I* D5 L2 X7 W; f
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    15. 2 `8 e: d' a\\" ^& B
    16. + x\\" J8 v4 E/ Q# |9 y0 m' _& F
    17. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 & s) v- f+ i+ K7 g2 s% q
    18. {
    19. 2 F5 V. B' t4 O+ ^; ^3 ?, }
    20.         wcout<<pch;
    21. : l7 \) o& B5 y2 X' Z* S
    22. }7 ?1 F, K- G. w7 ^1 y& V
    23. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    24. , }2 z- k7 ^5 n+ V* l+ F* R9 k3 B3 s* S
    25. {: L- u6 H3 }' c: t% v
    26. }8 z$ M. C- a1 c9 C
    27. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    28. 0 c/ A1 O2 f1 W. v
    29. {( }5 f) v7 S! V* _; }6 `9 d
    30.         LuData a;% g$ o) Y3 W' y3 m6 k
    31.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;# {1 M$ t. W: q
    32.         luVOID i,j,k,m,n,u,v;1 E* x\\" ]8 @4 q% P. C4 u& Q: E
    33.         double *pa,*pb,*pc;
    34. & P. u# |5 |* j( k- u! ~/ q* h
    35.         luMessage pMessage;9 |+ ~  L4 P/ o1 m+ z) Q8 `
    36.         wchar_t wchNum[32];
    37. 1 m# p6 ?1 O1 t4 h1 c/ ^
    38.         char chNum[32];
    39. % x3 X% o\\" G) D- \
    40.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;  F4 Z& w% N# }0 F
    41.         switch(theOperator), B: \: P: I7 [
    42.         {\\" k1 c+ K* W8 Z4 Y% h
    43.         case 2:        //重载运算符*
    44. 1 \' ?8 ?0 B. r. z' O
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    46. 2 e3 V7 v  f\\" }& E  X; l\\" J
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);+ f# e, Q5 @4 l) i
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    49. 2 {, F  P2 e% ^6 j* z$ b& p3 u
    50.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    51. * I) \: w4 b' H  V) e7 _& \1 G
    52.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    53. + t* O8 X1 U* x+ B' q0 f
    54.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象0 C) e' v; x0 V  P3 [2 M7 h
    55.                 if(!pRealArray3) break;2 _3 I( S! O) S9 a* H1 ?( C/ v
    56.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    57. ! A  l4 V% _. h& h' r
    58.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    59. 2 z2 R; C/ N! D( u# E3 W2 E* E
    60.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];
    61. \\" F! N' g5 `\\" }; e
    62.                 for(i=0; i<m; i++)        //矩阵乘
    63. : e# u+ s. d1 k( l0 l
    64.                 {
    65. 4 g5 _\\" ?9 D- \2 R3 E0 o\\" w
    66.                         for(j=0; j<k; j++)
    67. # }, @' B8 g% |! y$ I  w0 P
    68.                         {9 d2 J' J! E; F# T4 V
    69.                                 u=i*k+j; pc[u]=0.0;3 f2 [. {' n' c; G6 Q9 p, c1 W/ @
    70.                                 for (v=0; v<n; v++)
    71. # ?9 K& @. F3 n+ F! a1 e, ~3 j
    72.                                 {' k6 k! Y$ ?\\" \6 G+ l
    73.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];* T: m6 \6 T( g& q& ~( ^
    74.                                 }8 L. ?8 B7 j1 w- \, p2 [- \, K4 @$ j
    75.                         }
    76. ; n& x  e! c  A  S4 r1 I
    77.                 }
    78. ) v+ O8 L8 \' S0 L4 Z
    79.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    80. 0 C1 b% ]! n; O% h5 H
    81.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    82. ' z% X% g9 p0 [: B
    83.                 break;3 V+ w) ]# P# W; L& c
    84.         case 25:        //重载运算符.*
    85. 8 ]4 h3 e; Y7 ?% ?4 K
    86.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);4 M3 b\\" E0 p( K* `\\" |' q
    87.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    88.   X1 }( N0 u  ?6 y0 J
    89.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    90. 0 V7 T( M' ^. {& y
    91.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    92.   b& v0 h0 C  o1 G
    93.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    94. ' h! Q8 T% e: M\\" H2 m) k
    95.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象2 O+ o: o# a' ?( Q. D8 ?7 O* m
    96.                 if(!pRealArray3) break;
    97. 9 j  x0 c9 a3 q+ ~' |' g/ D, v- l, I
    98.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    99. 5 a/ Q+ T; {( _/ ?. @/ p- d& p& h
    100.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘# P. g* A  H& b$ h
    101.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象6 f# @& U3 l1 {\\" o
    102.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    103. , \: t# _( n\\" [& H2 Z, |
    104.                 break;\\" Z$ e  g# c; ~
    105.         case 46:        //重载函数new2 S3 x7 c5 M) I% y$ V
    106.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数% _! n( B9 N% X/ g
    107.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    108. 0 ?/ S4 t% G$ p; [) B, o- V5 O
    109.                 break;; i$ F  v\\" q6 ~  K. n1 h
    110.         case 49:        //重载函数o
    111. 3 U5 _/ V# y2 w) ]
    112.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);
    113. 9 k0 n6 ^' M! S7 u( Z& T2 d
    114.                 if(!pMessage) break;
    115. 9 F/ ~$ d! Q; S
    116.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);: T\\" I$ g& ^/ J& S
    117.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    118. ' O' S8 k- u  K5 Z) c
    119.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)5 Y1 ]# G, X; o\\" k. P( x
    120.                 pa=pRealArray1->Array;
    121. 4 u( e% t7 J. \
    122.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 P  _$ K9 f) U- I/ D/ k
    123.                 for(i=0; i<m; i++)        //输出矩阵
    124. $ O9 X, r8 t; V- V
    125.                 {
    126. \\" X' g& \0 L5 V8 r
    127.                         pMessage(L"\r\n"); k+=2;6 ?+ b% E! o8 |  s, _- S( O
    128.                         for(j=0; j<n; j++)0 ?' N% Q0 k/ v9 F
    129.                         {6 P- W\\" I; z/ ^  b
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);
    131. / T- e. Y4 ?0 r* |( x
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}$ Y) L0 j4 A+ \
    133.                                 wchNum[u]='\0';6 ^7 u+ L# I( b2 l) @
    134.                                 pMessage(wchNum); pMessage(L"  "); k+=2;
    135. 8 P6 g3 a# [: |( @: T! h- g
    136.                         }
    137. ; Z* y( j8 N1 g& j* [4 ^3 C
    138.                 }
    139. ! R. Y7 N3 k- ?: ]% C
    140.                 pMessage(L"\r\n"); k+=2;! c+ k8 j3 u  j& C$ M# }7 `
    141.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    142. : s# _7 i1 c# ^7 ~2 t# }
    143.                 break;/ Z\\" c4 ?; d) z
    144.         default:% X3 _  s2 i( [2 k' P' \/ L
    145.                 break;
    146. - l3 v& w, k5 x- P, [8 ~, F
    147.         }
    148. 9 @' W! E: o! Y' P3 v# s
    149.         return a;
    150. ; B7 w2 f% o9 @5 U
    151. }% Q& t2 |' c) \; O
    152. void main(void)* b, f' m4 G4 o, d. {5 I
    153. {
    154. , C1 K: W+ r% n  H, d: {
    155.         void *hFor;                //表达式句柄
    156. 3 ]# h' m4 G9 I
    157.         luINT nPara;                //存放表达式的自变量个数\\" }, d% d5 u5 n- r! m
    158.         LuData *pPara;                //存放输入自变量的数组指针) x# w, f1 P) q7 c, Z5 M. t
    159.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    160. 3 c9 o0 j8 N, [) h7 E
    161.         int ErrCode;                //错误代码
    162. / w& K8 D# X7 p/ v7 v
    163.         void *v;! \6 h' G$ o7 O' q: Z1 E
    164.         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.]}";//字符串表达式,矩阵乘
    165. % M: C) b- D# D! W
    166.         //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.]}";//字符串表达式,矩阵点乘
    167. \\" z# N; D- ]\\" W7 D+ l# m% S* F0 h
    168.         LuData Val;9 C  T  O& `3 L+ ^
    169.         if(!InitLu()) return;        //初始化Lu6 w( W8 e; q# K1 D, h' \\\" d\\" ~
    170.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    171. 1 Q- N/ o; a) K3 V* l
    172. , S8 N% H# A' q  E% X, @
    173.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    174. 8 f\\" S: c6 i* `. S1 m6 j
    175.         SetConst(L"matrix",&Val);        //设置整数常量1 s9 F& h* F8 K\\" f8 ~3 U2 K
    176.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息' }5 d% v  Y; C& Y% M' G
    177.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    178. - _: Z# e\\" M1 U( _. n% S- ?1 v
    179.   - `. q/ b; P  a' N# s/ J% l
    180.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    181. ) R. R# G& j4 k& _: f  d; I
    182.         if(ErrCode)7 ^0 K4 j- J' Q5 v$ z7 S
    183.         {
    184. - T: I# E2 T7 _
    185.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;
    186. - r9 H; [5 v! @& D4 Q7 V; u
    187.         }
    188. 0 E( L2 c$ J! d\\" s& N\\" S3 ], y
    189.         else
    190. 0 ^- C! Z8 B( p0 }* i
    191.         {
    192. : J5 A- c  V8 J  T- ]1 U9 X
    193.                 LuCal(hFor,pPara);        //计算表达式的值- y! ^% P  A3 b3 H) {
    194.         }& Q& d$ @2 @$ u8 x; p/ c! e( v# N
    195.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用% J\\" W  b$ m- S) r( i( o) g5 p
    196.         FreeLu();                        //释放Lu/ n3 u$ j! M( I# S1 d
    197. }
    习题:) n4 Q) P7 z7 w# U
    8 c+ s: f9 @, Y4 F
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    . m9 {1 W8 o: R0 a4 F/ g! A+ S) t2 S% T. K- p& N0 v5 `: w2 D$ U5 w
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=
      % g; ?6 N; j0 y: a  Q$ a
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      # a$ Y) ]! {  j* e1 X
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],/ a- R8 c/ b6 E6 ?/ a3 g. N
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      + X* u' X# g4 r. ^
    5.     t=clock(),
      \" F% s3 D  r- E& w9 y5 a
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      $ Z  R+ R! n6 q6 f& c
    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.; V0 X, K$ h% C! P0 Q- O7 j/ }
    2. 5. 4.
      6 t2 j1 h4 Q& L# b) Q  Q/ V$ D7 [
    3. time=0.875 seconds.; I2 x3 ?7 ]: ^+ {% c+ w4 Q* f2 G
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];
      \" G, G* B  f: `! {! \; E
    2. b=[2.,1.;1.,2.];9 k, r) P1 _# [
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      7 P1 K! N! M' Q7 n+ g( m
    4. tic,
      1 R# }, J/ b8 E4 }, u
    5. d=a*b;# R4 d# J) w: y
    6. for i=1:1000000
      ' D# g( P! `2 \9 A
    7.     d=d*c*b;4 H6 y! @9 U7 U# Y+ `0 \' E! w! q
    8. end! T$ A) ?\" l+ i9 G5 l& X
    9. d,
      3 a8 c0 i1 r* g9 h' E- Z& F4 {! u7 ~
    10. toc
    复制代码
    结果:
    1. d =$ K! N' B9 I\" v( `4 _
    2.      4     5& O/ ~: G) }5 m- K1 n1 W9 Y
    3.      5     4
      1 T9 k2 V: ~3 h# `& N\" I: k
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    1 T, n9 V; S0 X7 b4 b8 l
    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-6-13 04:02 , Processed in 0.416582 second(s), 53 queries .

    回顶部