QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8754|回复: 2
打印 上一主题 下一主题

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(标识矩阵)。为了简单,我们仅处理二维实数数组即矩阵类型。
    9 a. k1 a) ~! }! P3 i8 ^3 f1 a% g! L. I* _$ a9 \: H2 N
        基本要点:
    5 s# E9 `- h! O
    2 J, u6 s" U$ ?, R    (1)为扩展类型matrix编写运算符重载函数OpMatrix。5 L7 o0 L; W' f1 ?. Q

    4 l, o2 K; A  ^! `4 z0 Z, D    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。) z5 Z, u: ~: k3 y* J
    1 p+ L- d' Z; Y7 {6 `0 @* D
        (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    9 m+ ^/ F2 {7 Q/ r1 A  q7 J+ [( l
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>. [! d. o  A+ p5 W+ h) O* i$ u5 l
    2. #include <iostream>0 \/ D/ H2 G9 @& e
    3. #include <math.h>- R: n0 Z1 [& w, Q/ m
    4. #include "lu32.h"3 |. p- }2 ~7 b2 y7 V' `' L
    5. ) d1 F! R. P# R8 v$ d
    6. #pragma comment( lib, "lu32.lib" )
    7.   ?7 ^2 R& W1 l6 h

    8. 4 X6 [4 n. G! f3 x% w! [
    9. using namespace std;
    10. 2 a& d$ \  _6 `: o6 U. x

    11. 3 ^6 s: U/ }+ [% ~- y. C) }
    12. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定
    13. 6 _+ x$ J( @1 g! K\\" e

    14. 5 k& x( e/ g% U9 [
    15. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 + Z& o5 |9 i3 Z) a( K
    16. {9 F: Z3 z1 M7 f$ @3 Q
    17.         wcout<<pch;
    18. ( }  \- G4 c6 V8 }8 @3 U& M
    19. }
    20. 6 `$ B8 U; P\\" J6 e( S: C
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做  o# P# G- P, Y& s% ]% ^1 t$ ]; P
    22. {
    23. & `+ J; P$ @1 c0 T/ ^0 @
    24. }
    25. 0 Q' u* r! Z5 d+ y! W5 k
    26. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数  z+ N6 S5 y+ u, X) h$ r$ I3 d
    27. {
    28. 5 j1 [5 h3 S* B  H# {
    29.         LuData a;
    30. . X) t/ n- [\\" N1 _4 ]% W7 g6 C7 Y
    31.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;4 A8 l( `* |6 ]/ |
    32.         luVOID i,j,k,m,n,u,v;
    33. # ]5 ^4 `3 h0 O# Y: y
    34.         double *pa,*pb,*pc;
    35. - W5 i0 ~. E4 Z8 B4 L  s
    36.         luMessage pMessage;  N( r' m+ }5 L! ^( h' }
    37.         wchar_t wchNum[32];0 b& i$ L& h2 M9 j% k
    38.         char chNum[32];8 }  R$ P8 L: L\\" p# \+ L' @- l
    39.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;4 v: T% \\\" t\\" D: k( ~- A
    40.         switch(theOperator)
    41. 6 ?+ f4 K7 o# f\\" L8 `* c! E
    42.         {- [. V; I6 ^1 V6 O3 y9 F. E/ O7 `4 J
    43.         case 2:        //重载运算符*
    44. * A( B+ h- |' o
    45.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    46. 0 Z8 U# x* G8 O
    47.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);7 j5 [0 h- V! l. O: x, G6 e
    48.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组% @+ F; p9 b$ l1 e0 D
    49.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    50. ) ^) z9 C+ k$ t: V7 w& d$ Y
    51.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配, T+ F' i* P* D! w\\" ^; N
    52.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    53. - V$ N& X\\" c; ~
    54.                 if(!pRealArray3) break;9 X# x* v6 x2 E% f  D5 m
    55.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    56. ' R$ s' d! D0 m* O; Q
    57.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;4 F* e0 D3 j# n
    58.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];7 R0 C1 ~7 i1 h: d0 o
    59.                 for(i=0; i<m; i++)        //矩阵乘! j' |; e* u! K& c6 V& p
    60.                 {9 B# a5 k; A: |2 W7 A
    61.                         for(j=0; j<k; j++)8 O7 |( k1 O9 l3 J) l$ {
    62.                         {1 }) Q) W4 a# J* j0 {% i0 P
    63.                                 u=i*k+j; pc[u]=0.0;1 J5 J( T' p2 b( q1 G3 o0 o\\" h$ O
    64.                                 for (v=0; v<n; v++)' _) D# y4 Q1 h7 V) l$ P1 W
    65.                                 {. f+ H/ _2 e8 S) v
    66.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    67. & ?8 c, p5 C$ X- D
    68.                                 }
    69. , T) F5 m) N5 x; M2 M
    70.                         }
    71. 4 n! C  w. Q' P4 r
    72.                 }8 R+ i- y! P! X1 L
    73.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象4 [# I# X5 I, c- I; h( H
    74.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    75. 5 k! u7 N\\" d\\" q* D& K. H. a
    76.                 break;
    77. . S\\" C9 i: e9 Q9 K
    78.         case 25:        //重载运算符.*$ P  o% f+ I9 i9 v\\" d9 A
    79.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    80. / G% A7 m. F& F\\" _) E\\" ]
    81.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);* g. B7 ^3 [* j/ [
    82.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    83. , `/ X+ {- [# H/ B4 c1 m) I  D  t
    84.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)) z6 W+ U& f) X+ U\\" \
    85.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    86.   c5 t& x& H* W9 L4 `
    87.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象. m: C+ L( n0 W. O$ s
    88.                 if(!pRealArray3) break;7 l; d& Z. k2 v* Z( z$ |/ w: T
    89.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小\\" h9 O7 D# @1 k
    90.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘
    91. - i1 H9 p' a; c5 o4 t* y+ ]
    92.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象
    93. : L$ K3 M; n; m$ ?# F
    94.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;& F5 A0 _* ?+ G, o8 O2 ]$ ~
    95.                 break;
    96. 3 ]- R3 U\\" K, p5 _/ _6 T& S8 w
    97.         case 46:        //重载函数new* T  c1 y' c; w% X. \
    98.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数7 I- s& @* Q8 Q  K5 C
    99.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型
    100. ' j% F2 c$ N8 T3 @# g' J2 z
    101.                 break;
    102. ( C, s1 O; d+ g* ]& a* M3 K
    103.         case 49:        //重载函数o2 r- w5 Q+ i& H
    104.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);+ {# u2 G0 P1 g
    105.                 if(!pMessage) break;
    106. * T; W9 w- m' T: L4 ~
    107.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);9 I6 x/ i0 m* P' a
    108.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组
    109. & c- s( ?3 x& y
    110.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)0 o$ J+ v: V/ N  o0 ?: ]8 t; A& G
    111.                 pa=pRealArray1->Array;; x! A' T; o7 u/ c5 S* I
    112.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;
    113. % J9 S9 r. |+ R
    114.                 for(i=0; i<m; i++)        //输出矩阵! i+ P6 |1 @0 _
    115.                 {
    116. 5 O  u7 D- H8 A: N, D2 Q9 v
    117.                         pMessage(L"\r\n"); k+=2;5 G8 j$ X( b8 O5 R- C
    118.                         for(j=0; j<n; j++)
    119. ! ~4 k! u  m9 v! o. K6 V1 v
    120.                         {) u) `$ F' O5 q8 W2 _
    121.                                 _gcvt_s(chNum,pa[i*n+j],16);6 M4 o' T8 n. |& I# A
    122.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    123. & g6 Z' o6 s, B! e5 N\\" h% t3 h4 n
    124.                                 wchNum[u]='\0';0 u  c, v\\" Y; _, @' o7 h9 U9 Q
    125.                                 pMessage(wchNum); pMessage(L"  "); k+=2;  P4 }) }' x& `1 r
    126.                         }
    127. - n' O' Y) e\\" [7 Q6 f1 x
    128.                 }
    129. 2 R* p0 N1 h& X) W% W
    130.                 pMessage(L"\r\n"); k+=2;
    131. 0 b7 s) C, K9 Y
    132.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数
    133. 2 i, g& j( t6 R& ~7 s* v
    134.                 break;
    135. # E$ Q0 G& {* t% ^7 [( X
    136.         default:* z9 h& z$ D. W' J
    137.                 break;# k# L9 K, w8 w% O+ k! L6 a# A
    138.         }. x' o# f. s9 \- @
    139.         return a;
    140. . r2 h# N0 ~% @
    141. }
    142. ' @0 v4 d3 X8 P- j6 v\\" T8 X\\" b
    143. void main(void), U/ q5 U: h+ |% K
    144. {7 W* _2 u; V8 E+ V5 \/ Q
    145.         void *hFor;                //表达式句柄
    146. 2 |- t& z! F/ r& [: @/ C* |, h
    147.         luINT nPara;                //存放表达式的自变量个数
    148. 3 H' ^; w+ P! z5 S$ _% r
    149.         LuData *pPara;                //存放输入自变量的数组指针- ]4 K, R/ m3 S: N% \& ]$ R
    150.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置
    151. 1 X# K8 l) z% D* ?5 O
    152.         int ErrCode;                //错误代码
    153. * h4 C/ U) H. p0 K* I& f
    154.         void *v;% g5 M' |! H/ g; @6 _! h1 T
    155.         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.]}";//字符串表达式,矩阵乘6 ?% @% t, d\\" v- s/ M6 Z
    156.         //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.]}";//字符串表达式,矩阵点乘
    157. 0 t2 B/ K: u% ?0 M$ l& o+ _3 I. V- t
    158.         LuData Val;' u, _/ M- y. q' W, r, ^
    159.         if(!InitLu()) return;        //初始化Lu% C% E2 k; Z. P
    160.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型' Z$ }\\" X. u; V
    161. 5 n. h1 A! @% f
    162.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量
    163. 1 [* `$ ^- v6 G* `1 s
    164.         SetConst(L"matrix",&Val);        //设置整数常量
    165. # d9 H: F3 m$ _# e6 ?% e) x
    166.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息6 P* ^; c0 [/ R* z
    167.         wcout.imbue(locale("chs"));        //设置输出的locale为中文1 e  I' `. Y\\" q7 l$ m; J
    168.   ) I9 [0 \) }7 a2 ]2 |
    169.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    170. . m3 {+ x) |  D1 s3 t/ n
    171.         if(ErrCode)
    172. 5 x& L; j# i5 {7 R
    173.         {
    174. 3 J% |6 k, ~6 X
    175.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;1 g! A6 C6 ]' e0 B) J# B
    176.         }. Y8 c, E2 a4 b\\" r: J' y0 {/ f- ~
    177.         else
    178. ! d4 C8 Y0 v) r
    179.         {
    180. \\" J1 M, u* A9 ]4 B4 w1 M
    181.                 LuCal(hFor,pPara);        //计算表达式的值$ v* @# q7 {& G7 y( B' }# s( q
    182.         }- {4 _5 f# Q- p# Q! @
    183.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用9 c# s1 a* y2 N: t8 X, u
    184.         FreeLu();                        //释放Lu
    185. 2 L6 c% W3 R' }8 |. S% a) L+ l
    186. }
    习题:9 Y+ ~, q8 k5 B6 D  |

    * J! ^% P2 l  M6 a    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    # e$ ?7 t' H0 c* ]3 {5 w& W  g. [% v, ^0 j4 u
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=0 n+ G: l+ _) S( A/ m
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      4 _& F; e6 N& D
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],# N4 k) B) A+ N6 Z+ k9 C( N9 X
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],% X9 p1 V\" s; E% I
    5.     t=clock(),$ \: G9 B- D5 t- M2 K# h# U4 H
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},
      3 Q( d  {0 i. a) s
    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.
      ! Q8 l( u2 |\" a5 \
    2. 5. 4.
      $ f2 W$ w9 n; I, V: T& W- x
    3. time=0.875 seconds.
      5 d3 F- ^' J- |2 o1 X. v
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];, p, x8 T! L% ~) Y
    2. b=[2.,1.;1.,2.];
      : p* P* t  O( \9 ?; B
    3. c=[2/3.,-1/3.;-1/3.,2/3.];
      5 V0 h0 g% k. P9 |  ?
    4. tic,/ T3 _7 P& _. R. G5 n
    5. d=a*b;\" R7 ~6 r# i5 k* {8 Z$ b* ?+ H
    6. for i=1:1000000
      7 S' u3 v( m8 d
    7.     d=d*c*b;\" f! |8 L7 A8 |1 r
    8. end$ K$ d! M6 S4 T( r1 l$ C3 X6 H2 H& y
    9. d,, s0 S\" y\" y1 m. R  n
    10. toc
    复制代码
    结果:
    1. d =9 e9 B2 S# \, i2 F4 z; C7 u# Y  g
    2.      4     5
      $ k/ K/ d) R8 N/ E\" A2 c
    3.      5     4
      & E( ~5 N8 z/ c+ q0 W
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    ) ^+ c  O* y( @/ X7 R9 i, b
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    2#
    无效楼层,该帖已经被删除
    3#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-15 15:03 , Processed in 0.498270 second(s), 63 queries .

    回顶部