QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8743|回复: 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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。4 O$ p  j* W3 p+ R( a+ ?" M/ }
    * U7 _! T6 J) Y* X" L
        基本要点:
    9 e* e: y2 O6 `* L# ^! `. U3 F
    0 M/ T) M7 i) s6 J    (1)为扩展类型matrix编写运算符重载函数OpMatrix。
    7 t  S* B6 j1 _; j- q  L6 l' W+ R. B
        (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。
    1 v1 O0 Z" V6 h0 _- K$ G4 C# H" c9 D- p: T* S% ?1 Y7 D& e
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    4 r( [$ y! [( Z8 y3 N. z$ }( o& X5 k! L+ C9 D8 c
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>4 r1 I0 H, M! `. m- @
    2. #include <iostream>\\" d6 Q# b2 g; [& @8 C
    3. #include <math.h>9 l8 ]+ j; R$ T4 V) ?$ C0 y
    4. #include "lu32.h"* e, S7 x( k+ Y6 ?3 j\\" }) Q% S; T
    5. 4 S/ [9 _& W\\" k, E
    6. #pragma comment( lib, "lu32.lib" )
    7. - A  e( y2 k/ K8 \3 _

    8. ' q4 H3 D8 f2 ^) M) e% t4 R. _, L
    9. using namespace std;
    10. 6 |9 I5 R+ ^  V- b2 o  c; @/ \
    11. 0 y2 ^6 B0 }! I8 G2 q
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    13. 9 u! F5 F0 Y* W2 _

    14. + G% G! j! o5 G& H' e- b
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用
    16. 7 J  C. W( Z! }( p; s+ v6 h8 y
    17. {
    18. + F; F' u9 B, e6 ?, ~
    19.         wcout<<pch;
    20. 6 K1 [* j- Y0 D/ R3 `, F( L
    21. }1 d% ~' e. M5 J5 }# ?1 K
    22. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做
    23. 7 W  e- A3 n& m) ?\\" l  g, R
    24. {: F% p' Q. p) L# j/ G2 X& z
    25. }# k( l  P' B; L+ S8 u% n- Q
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    27. / z, z. Y& r/ ]\\" q
    28. {
    29. 1 M8 Q# {6 |$ @, z5 {+ Z\\" V7 V* ]4 i
    30.         LuData a;
    31. \\" F, w( {$ R. F+ K' Y2 {: E
    32.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;
    33. ; O' F8 f  F% P5 G
    34.         luVOID i,j,k,m,n,u,v;
    35. \\" S; c1 r6 y: @  v6 K
    36.         double *pa,*pb,*pc;1 L9 o# f6 x6 g$ S0 p- s
    37.         luMessage pMessage;
    38. . N  O- U$ o5 b\\" x$ c! G
    39.         wchar_t wchNum[32];* u5 s! a\\" r2 x0 Q$ s
    40.         char chNum[32];
    41.   |8 w( v; D. R! Y* z  w7 K
    42.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    43. 7 y  ?( @- J: F& ~/ t% w\\" X
    44.         switch(theOperator)
    45. $ P4 t( o; q+ N& Y& L7 t0 `5 e
    46.         {
    47. . r* B' ^- \  o, H9 S. t, i) [' q
    48.         case 2:        //重载运算符*
    49. 0 x4 q! f' w& T3 q
    50.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    51. % t9 D( G2 `  H\\" Y) i! k8 C
    52.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    53. . Q5 l! ^- b4 \: B/ O; z
    54.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组/ `/ r$ F) L7 v/ t4 G; a+ f\\" I
    55.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)5 C. H' O9 P% ~4 J
    56.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    57. 3 l0 t5 w+ A& X4 Q8 D
    58.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    59. ( G$ ~* M+ H7 `$ ?7 S: Y5 L) {
    60.                 if(!pRealArray3) break;
    61. 3 N! L& M, h3 P/ O9 E- x4 d
    62.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小5 H\\" d9 ?. J0 D, a: |+ c, m
    63.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    64. 4 ?' E  q& N2 y
    65.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];6 Z, D) Z0 H3 e
    66.                 for(i=0; i<m; i++)        //矩阵乘\\" b# h1 m$ e% s
    67.                 {0 I2 }1 X) f* d- H, x
    68.                         for(j=0; j<k; j++)
    69. . {. e4 W# z' r8 W; [5 E4 G1 S
    70.                         {\\" R' g5 N2 U! i
    71.                                 u=i*k+j; pc[u]=0.0;
    72. 2 J! C$ \$ ]9 Q4 ?
    73.                                 for (v=0; v<n; v++)
    74. ( W4 c* }& L% t\\" t! L6 J
    75.                                 {. @( _) H6 w7 g
    76.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];7 Y/ u7 h4 r' t
    77.                                 }
    78. ; X: s, ]7 M4 F% d. q3 z
    79.                         }
    80. ) [) F! m  g2 y! W% O5 x
    81.                 }
    82. ; _1 f; ]9 |, C# O0 Q, H* X& G
    83.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象# x3 r+ g; ^7 a! S5 w: Q2 s4 A
    84.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    85. + r$ ~( V2 b$ ]) V
    86.                 break;* q, G5 K5 j7 {% O
    87.         case 25:        //重载运算符.*- |4 u: S, c$ u% Q9 f
    88.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);3 p8 q( v( M, I$ b2 z$ |
    89.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    90. ) g  d\\" c* ]( O- l1 s2 J  u
    91.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组2 \. }6 Q5 L% z) D  F! i9 ~
    92.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)7 ?7 z* Z\\" r5 u' j0 Q, ]0 Y4 q/ }
    93.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    94. 2 [0 e( u6 B3 ^- Z' i
    95.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象& O. q! O$ X* N( I- F  J
    96.                 if(!pRealArray3) break;, O1 M0 _9 _* G; T  X: t
    97.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    98. 9 L+ q2 x\\" _, e# [8 b0 w3 E( S0 f
    99.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    100. 6 ?\\" ~  {8 W1 G$ J8 M' d& k
    101.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象  g) V# F1 N& ~) ]2 |) m) l: E
    102.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;, I1 d4 E' {$ {\\" Z/ A
    103.                 break;1 U- D' Y\\" C3 N3 \
    104.         case 46:        //重载函数new- ~- M9 }/ @- a) m0 f
    105.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    106. 1 \% o$ Z  r$ ]5 k, m
    107.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    108. ! D, E* _5 h% z1 F
    109.                 break;
    110. - e; K; d% h# L
    111.         case 49:        //重载函数o
    112. 8 a3 G5 B1 @$ ~/ u* H  j
    113.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);. k! N% I' S. U
    114.                 if(!pMessage) break;
    115. 7 x! S+ y3 p1 l
    116.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);' |& e% s- a- r$ _7 c
    117.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组6 i/ g. a% y$ X) Y
    118.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)- {; O: c4 i* H1 y
    119.                 pa=pRealArray1->Array;
    120. % y) j$ n+ `2 W/ @4 |! }9 H! Z1 `0 f, G
    121.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;) L5 y9 _4 W: {- C( h4 S
    122.                 for(i=0; i<m; i++)        //输出矩阵
    123. + a8 V4 [\\" [* D! R- ~: {
    124.                 {
    125. % g9 D7 k9 z, Q9 H- O; b0 r; y/ T1 q
    126.                         pMessage(L"\r\n"); k+=2;& v- ~1 W. c9 S7 m9 i  L1 s
    127.                         for(j=0; j<n; j++)
    128. 7 E9 y, p4 E* E% |1 J. h: {
    129.                         {2 l6 H% Q\\" r7 i) m, g& ~! Z
    130.                                 _gcvt_s(chNum,pa[i*n+j],16);
    131. 0 C, {7 z% m% S
    132.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    133. & @' c; o% n9 i2 W
    134.                                 wchNum[u]='\0';7 ?$ a; r- U+ J
    135.                                 pMessage(wchNum); pMessage(L"  "); k+=2;8 M: g# v6 j2 P
    136.                         }3 I' I4 ^4 x8 D9 x4 f5 [9 Y& D3 U1 H
    137.                 }9 m! s/ S3 P5 g; {9 b; _7 N
    138.                 pMessage(L"\r\n"); k+=2;
    139. / {  {( [& W* T: y* [8 E0 _! I
    140.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数) s: H! J/ W% e5 m
    141.                 break;0 q8 }$ f3 N. M0 G4 e
    142.         default:1 w9 Y( l: @' g\\" d/ b
    143.                 break;
    144. 6 m4 k1 g6 m- [: _: g
    145.         }6 f+ w6 p3 E) f- L5 P8 d( p  j
    146.         return a;
    147. ; {, ?6 `% w* J
    148. }& o\\" E& c) `, j1 R
    149. void main(void)$ ~* {9 u, G- x+ ^( k
    150. {+ v$ {8 J7 S\\" w/ `' l
    151.         void *hFor;                //表达式句柄$ N) j; ~, f7 ?
    152.         luINT nPara;                //存放表达式的自变量个数: w\\" }! e5 o; o2 i% l
    153.         LuData *pPara;                //存放输入自变量的数组指针
    154. 6 }  t# S# U- M2 ]\\" j- C  T3 J% `
    155.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置% f: }0 [* M\\" Y2 k$ a
    156.         int ErrCode;                //错误代码
    157. - X. F* E1 Y0 _7 U\\" U9 l! E% i
    158.         void *v;
    159. - u2 R/ l, \+ _: o
    160.         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.]}";//字符串表达式,矩阵乘9 f! q. z\\" J\\" Q6 Y; q
    161.         //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.]}";//字符串表达式,矩阵点乘. ?2 H: V) l* {6 y9 J\\" k+ P
    162.         LuData Val;
    163. ) q) F4 L$ L2 ^1 C' N
    164.         if(!InitLu()) return;        //初始化Lu
    165. + |- n) ?8 X# @3 E& l1 B
    166.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    167. 0 ?5 Z8 T9 r( H. R/ H8 P
    168. 1 A* k( c, P/ Q) z# V% i, M
    169.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    170. & c# u' L* U& b% c) H  E4 ]\\" s
    171.         SetConst(L"matrix",&Val);        //设置整数常量  ^. c, |. y. A: M7 W! G  t
    172.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息/ \7 R8 {0 X# P, s) g
    173.         wcout.imbue(locale("chs"));        //设置输出的locale为中文
    174.   H\\" E5 c9 E! \- [3 g. w. p$ C. v
    175.   \\" M( U! j$ I9 H% Y2 z, P5 [1 [0 U
    176.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式. G: U! F8 i0 L' A# k
    177.         if(ErrCode)
    178. 2 N1 h\\" v* h\\" v, f
    179.         {( c& ^( a) k2 Z0 @4 k% H
    180.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;8 R* \5 n' F& |! y
    181.         }
    182. 0 d$ `) Y& |; l  [  b
    183.         else
    184. 5 d: W: P9 d) P
    185.         {
    186. ; T; N: A: w6 S0 w+ j$ |6 n, G! F
    187.                 LuCal(hFor,pPara);        //计算表达式的值
    188. . @0 R2 P) z$ Y
    189.         }  _) R3 L! ?! C3 ^0 x& H, C
    190.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用4 c2 j* c, y\\" q- S7 o4 }
    191.         FreeLu();                        //释放Lu7 J) I- {4 l\\" b. W8 V, X
    192. }
    习题:! d1 h" N5 u* D; p9 c3 y: p
    - S8 `# E/ ]1 t/ l
        (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。 4 f5 j; R/ O0 W9 o8 b# `( w6 a
    9 W% l! G% D  b4 t5 W+ I
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=8 i6 r6 G4 K( i1 B+ g
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],% H+ ]/ f6 y& j# p, Y7 }7 V
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],( k7 B5 I* }% R' v9 g
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],+ g1 A\" o/ ?4 c/ q0 q' f
    5.     t=clock(),  G& m9 X* S- j: ^) S) g# V\" \0 I' Y
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},; J3 q/ G- X) J0 ]- I/ b0 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.
        L; E6 s2 s6 D  x! o: p2 S% F
    2. 5. 4.
      , J  d\" O\" c: j
    3. time=0.875 seconds.
      ' I& B1 O6 a9 c5 Y1 S5 x! h
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];& f, M: Q\" [3 B& F: R) A
    2. b=[2.,1.;1.,2.];
      4 H) _! B2 Z* s
    3. c=[2/3.,-1/3.;-1/3.,2/3.];2 ]) n0 f; n$ k! Z& W1 K
    4. tic,' i; C: r. G/ k; z
    5. d=a*b;/ [- O, m* e- V8 p& d6 _2 b7 l& ~8 C
    6. for i=1:1000000: \( D( i; J! r
    7.     d=d*c*b;# r( S1 p* s2 m9 S4 z
    8. end
      $ b/ [( d4 U1 n( B/ |
    9. d,
      . t. l\" l% F. v! W* a1 O5 O1 @
    10. toc
    复制代码
    结果:
    1. d =2 S3 s6 `4 d. {! t) R5 G
    2.      4     5) G2 Y5 u% M) L# a+ x$ m
    3.      5     4
      0 Q* t* L1 Q1 j  w\" {- g
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。, M3 |( C: b/ n
    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-2 04:31 , Processed in 0.406601 second(s), 52 queries .

    回顶部