QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 8789|回复: 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 v5 z) e( {" u! u) s. X1 m
    ' p& A4 V0 A! n; }3 [
        基本要点:0 q" D  ?1 ?+ ?5 H4 x
    ' u6 k* V/ B/ J* }
        (1)为扩展类型matrix编写运算符重载函数OpMatrix。6 ^2 p1 N. v" D

    % j9 \, P6 N4 _7 L7 G8 l$ Z( }    (2)用函数LockKey将重载函数OpMatrix注册到Lu,锁定的键的类型即为matrix,要注册为常量,以便于使用。5 U$ i" ]( i- A( M/ q

    8 O" d+ Q" Q. I0 x/ E& @    (3)为扩展类型matrix编写其他操作函数(本例未提供)。
    * F  J5 |* L: m  v: q4 L8 n8 `4 D; R0 B. Z+ H8 E) [
        (4)用函数LockKey解锁键matrix(本例中,程序退出时会自动解锁,故可以不用)。
    1. #include <windows.h>
    2. 8 `\\" G& ^% Q( ]9 _2 T9 \8 D3 v
    3. #include <iostream>
    4. ( i$ I  b+ @\\" Z; c
    5. #include <math.h>' o8 v( F. L6 q4 n3 [' ^
    6. #include "lu32.h"  `! A; n  D1 u  s8 o

    7. * t2 c1 Z; y! h3 @3 R* y; A
    8. #pragma comment( lib, "lu32.lib" )
    9. \\" r% a0 b3 _' l+ G

    10. 9 c! Q, I, g) S- W/ V' w5 n! X. M
    11. using namespace std;
    12. + Z3 ]; B- m( n5 q\\" `\\" @1 N5 Q: V
    13. ) d( I& h5 C+ n/ r+ t8 a; O
    14. luKEY Matrix=-1000;        //标识矩阵类型,最终的Matrix由LockKey决定7 ]% d2 Y- j, U0 X! G5 T& h4 K
    15. 4 i/ d0 D4 \7 X# t8 w
    16. void _stdcall LuMessage(wchar_t *pch)//输出动态库信息,该函数注册到Lu,由Lu二级函数调用 1 ]  T- X6 j8 Q$ I: k
    17. {! V& j  t! p\\" y. ~
    18.         wcout<<pch;
    19. % H8 v' Y: M1 \3 \$ f+ T
    20. }6 X  Q. \% i2 @\\" T
    21. void _stdcall DelMatrix(void *me)        //用于LockKey函数,因为是基于系统内置实数数组创建矩阵,故该函数什么也不做4 i- M$ R4 `. V* Q
    22. {: [8 Y6 [1 s: e+ L! z- L
    23. }
    24. 4 r) [9 p& C; m% v9 Z
    25. LuData _stdcall OpMatrix(luINT mm,LuData *xx,void *hFor,int theOperator)        //运算符重载函数,用于LockKey函数
    26. ; X9 v) c' v1 t# w  o
    27. {
    28. \\" K* @\\" a\\" i, G% p9 L
    29.         LuData a;* r5 ~1 J' l( H7 t/ ^; X
    30.         luRealArray *pRealArray1,*pRealArray2,*pRealArray3;1 k! ]5 a9 G/ I  E
    31.         luVOID i,j,k,m,n,u,v;. O4 p% Y6 X8 @; B; x0 a) \
    32.         double *pa,*pb,*pc;5 S- V5 L' {& m, W
    33.         luMessage pMessage;4 T7 o: D6 D; K7 P- @) O) U
    34.         wchar_t wchNum[32];. a( y& Y' o0 j, n4 \
    35.         char chNum[32];$ z6 j& f6 L. i, |& J% n
    36.         a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
    37. 9 ]. n\\" M' j& l2 i2 y9 P
    38.         switch(theOperator)
    39. 6 @* a- ^- ~/ }3 v% _% ?
    40.         {2 R! g# r' i\\" m% P\\" s* J
    41.         case 2:        //重载运算符*  k9 N- o3 j7 B5 X
    42.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);# C0 X- W4 N9 H* V0 Y
    43.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);- R6 O5 b; w) g$ Y$ G0 O( A0 z7 ]7 W
    44.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    45. ' k8 o! t' F8 n9 B; K. Z) W
    46.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    47. % R0 `: s! P; Q' u7 @/ V2 H* J
    48.                 if(pRealArray1->Dim[1]!=pRealArray2->Dim[0]) break;        //维数不匹配
    49. 7 g# O- Y  T$ N8 _# X; _7 d; j  k
    50.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->Dim[0]*pRealArray2->Dim[1],2);        //创建矩阵对象
    51. . L% s- p9 h& y+ f
    52.                 if(!pRealArray3) break;: E1 O% f' B$ }' j* E& L: }
    53.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray2->Dim[1];        //设置矩阵维数大小
    54. ( y3 x- n7 u2 `5 [: G- X2 Y
    55.                 pa=pRealArray1->Array; pb=pRealArray2->Array; pc=pRealArray3->Array;
    56. 1 |; V. I, ]# i\\" S
    57.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=pRealArray2->Dim[1];+ Z9 \, @3 C0 {6 h, |9 \
    58.                 for(i=0; i<m; i++)        //矩阵乘. ^, B# \+ Z5 |
    59.                 {
    60. ) A, G, V. x3 \' d
    61.                         for(j=0; j<k; j++)! W9 L; h  I3 T& ^
    62.                         {/ |% K/ B  z* ^' {: f
    63.                                 u=i*k+j; pc[u]=0.0;: K& ~( Z/ @- @8 C4 K* Q5 H$ W! X* `3 R
    64.                                 for (v=0; v<n; v++)
    65. # s0 k( y  p/ J\\" [2 n
    66.                                 {
    67. 7 s8 Y8 d# z* G
    68.                                         pc[u]=pc[u]+pa[i*n+v]*pb[v*k+j];
    69. & @+ [+ j) O! Q( k1 g, \/ B; @6 h
    70.                                 }
    71. 0 y( a6 b2 D. l- k( ?2 V; C
    72.                         }
    73. 8 J+ g% O  L* R4 d
    74.                 }
    75. 5 W- n: I( K* B! q
    76.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象. ?. x- ]$ J8 l5 _' @
    77.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;
    78. 2 A- D6 R* @. c8 S9 _
    79.                 break;. U, l1 K1 K. S6 N( T  N' G% N% K/ q
    80.         case 25:        //重载运算符.*
    81. 3 D) f3 ^( l, _
    82.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    83. + \- z/ V# q/ N3 K0 c; g
    84.                 pRealArray2=(luRealArray *)SearchKey((char *)&((xx+1)->x),sizeof(luVOID),luDynData_realarray);
    85. 9 t! y  c9 H% v- q' y3 |+ n\\" \' t
    86.                 if(!pRealArray1 || !pRealArray2) break;        //对象句柄无效,不是实数数组
    87. \\" h$ F\\" @$ g7 R8 d0 E9 d( b- @
    88.                 if(pRealArray1->DimLen!=2 || pRealArray2->DimLen!=2) break;        //不是二维实数数组(矩阵)
    89. : R4 B4 }( C; `* Y+ n
    90.                 if(pRealArray1->Dim[0]!=pRealArray2->Dim[0] || pRealArray1->Dim[1]!=pRealArray2->Dim[1]) break;        //维数不相同
    91. \\" R8 Z4 K1 {' c  ^% L0 Q- C
    92.                 pRealArray3=(luRealArray *)NewSysObj(luDynData_realarray,pRealArray1->ArrayLen,2);        //创建矩阵对象: r7 m' c9 S2 @4 ?, p7 g
    93.                 if(!pRealArray3) break;- B# R  G8 A# |
    94.                 pRealArray3->Dim[0]=pRealArray1->Dim[0]; pRealArray3->Dim[1]=pRealArray1->Dim[1];        //设置矩阵维数大小
    95. * N3 O# G. ], P6 B  j! |
    96.                 for(i=0;i<pRealArray1->ArrayLen;i++) pRealArray3->Array[i]=pRealArray1->Array[i]*pRealArray2->Array[i];//矩阵点乘5 a3 [* g5 j1 M  ~3 Z
    97.                 FunReObj(hFor);        //告诉Lu,返回一个动态对象2 ?2 J+ b) x& W6 M, g
    98.                 a.BType=luDynData_realarray; a.VType=Matrix; a.x=0; *(luVOID *)&(a.x)=(luVOID)pRealArray3;$ Q: @1 J7 ^( b0 G
    99.                 break;) S' w) d2 w# u' U0 u5 t& c
    100.         case 46:        //重载函数new
    101. ' s3 l0 \6 k0 E( J, u: \- ]. u: t
    102.                 a=ExeOperator(mm,xx,hFor,theOperator,luDynData_realarray);        //直接调用基本类型luDynData_realarray的new函数
    103. \\" g. Z, X( Q; \* J\\" U# T+ x1 Z. T
    104.                 if(a.VType==luDynData_realarray) a.VType=Matrix;        //设置扩展类型为自定义的Matrix类型) p. _0 r7 g$ y5 z3 d
    105.                 break;, a! Y/ z) Q: B6 N' G& u/ o$ X; S
    106.         case 49:        //重载函数o
    107. \\" Q# J8 T- t# g# C8 o
    108.                 pMessage=(luMessage)SearchKey("\0\0\0\0",sizeof(luVOID),luPubKey_User);$ ^- H) P- R  I
    109.                 if(!pMessage) break;$ F5 x6 }# D5 N9 q
    110.                 pRealArray1=(luRealArray *)SearchKey((char *)&(xx->x),sizeof(luVOID),luDynData_realarray);
    111. & v' k# {! A/ D; {9 p7 k0 `
    112.                 if(!pRealArray1) break;        //对象句柄无效,不是实数数组8 W3 L1 u$ w. r, ~
    113.                 if(pRealArray1->DimLen!=2) break;        //不是二维实数数组(矩阵)\\" @7 q5 k9 i4 Y! V/ R
    114.                 pa=pRealArray1->Array;
    115. : `+ A4 w$ X3 A8 z9 u+ K7 L/ S7 J
    116.                 m=pRealArray1->Dim[0]; n=pRealArray1->Dim[1]; k=0;4 ~! k2 Y9 b: A9 z. o9 e2 ]! R
    117.                 for(i=0; i<m; i++)        //输出矩阵0 h5 d/ I, C/ K
    118.                 {\\" @1 U+ ~1 L& s0 ^! P\\" ~
    119.                         pMessage(L"\r\n"); k+=2;
    120. 3 s6 W' Q0 k  E1 K& {. o* P% b( b
    121.                         for(j=0; j<n; j++)
    122. + C6 _3 o5 L  L! A
    123.                         {* }% e3 v8 r7 {& X\\" i5 q3 n
    124.                                 _gcvt_s(chNum,pa[i*n+j],16);
    125. . w' }* C  v1 t, W- a0 b9 y
    126.                                 for(u=0;chNum[u];u++) {wchNum[u]=chNum[u]; k++;}
    127.   c8 f; j7 ~) @; C
    128.                                 wchNum[u]='\0';. [9 W3 _; \9 K8 v\\" h9 ^% W& N
    129.                                 pMessage(wchNum); pMessage(L"  "); k+=2;+ u4 i. u# M1 H
    130.                         }
    131. 9 b1 X- s\\" a1 t4 [6 _* v
    132.                 }
    133. ! a* P) i; v# K
    134.                 pMessage(L"\r\n"); k+=2;2 f8 e/ X* [$ d8 ]2 Q8 y
    135.                 a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=k;        //按函数o的要求,返回输出的字符总数; Y2 r7 @( c: F
    136.                 break;
    137. 9 A) T8 e# w! k. \5 G
    138.         default:. Y8 |: F6 y+ n4 x  [7 X, E/ k
    139.                 break;
    140. 8 _& v6 O- v6 F6 ~! s
    141.         }9 \; [$ n  t: t7 W
    142.         return a;1 r4 R$ P* [. R1 T# X2 r
    143. }
    144.   X5 d! ^, ^) L) i! Z4 E
    145. void main(void)
    146. # \/ i* X) s* j1 \; P- u
    147. {) ?! N4 V, \+ R; R- a2 ~( {: R8 A
    148.         void *hFor;                //表达式句柄# T/ X1 r1 k! U* u\\" m( ~4 U
    149.         luINT nPara;                //存放表达式的自变量个数! v4 \3 q4 K/ q; k$ l
    150.         LuData *pPara;                //存放输入自变量的数组指针
    151. 8 \8 A. }1 E2 X& N. N8 K/ u
    152.         luINT ErrBegin,ErrEnd;        //表达式编译出错的初始位置和结束位置6 f8 b' X5 Z0 _6 i
    153.         int ErrCode;                //错误代码
    154. 4 V- E& p* V  y
    155.         void *v;
    156. 5 X7 n. O7 I7 g3 e) n+ q
    157.         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.]}";//字符串表达式,矩阵乘
    158. : \9 r& f( H$ m, ], S' Q! d& @
    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.]}";//字符串表达式,矩阵点乘- g/ U\\" N* n) C, i* D0 g+ F5 V
    160.         LuData Val;
    161. ! {% }& l1 H) J& X
    162.         if(!InitLu()) return;        //初始化Lu& ^/ d3 d; j2 ?; t: r\\" n
    163.         while(LockKey(Matrix,DelMatrix,OpMatrix)){Matrix++;}        //锁定一个键,用于存储矩阵扩展类型
    164. 3 S9 Q  w8 l; I( Y+ F

    165. 1 J$ D! ]7 g; U3 q
    166.         Val.BType=luStaData_int64; Val.VType=luStaData_int64; Val.x=Matrix;        //定义整数常量4 I\\" b; h2 I/ v\\" ]7 V' J/ D- \
    167.         SetConst(L"matrix",&Val);        //设置整数常量# z7 s7 k7 p# |% \$ d: u
    168.         InsertKey("\0\0\0\0",4,luPubKey_User,LuMessage,NULL,NULL,1,v); //使Lu运行时可输出函数信息\\" v4 K: l3 {( o+ ?8 Y
    169.         wcout.imbue(locale("chs"));        //设置输出的locale为中文6 o* A# ^9 C; U8 X
    170.   ! Y% l% i# o( t3 r( U6 n+ j
    171.         ErrCode=LuCom(ForStr,0,0,0,hFor,nPara,pPara,ErrBegin,ErrEnd); //编译表达式
    172. 6 }0 [, P4 b8 b
    173.         if(ErrCode). _: |\\" e1 l3 x\\" W0 L; W\\" E
    174.         {
    175. $ y\\" I5 Q' Y: K; `
    176.                 wcout<<L"表达式有错误!错误代码:"<<ErrCode<<endl;1 L! N9 i  v0 i% [. f
    177.         }
    178. ' g5 w- m- I6 a$ ]3 |* ]) J- q
    179.         else1 H% W( E' `8 |/ j
    180.         {, `- y( D4 T! Y3 L: b
    181.                 LuCal(hFor,pPara);        //计算表达式的值
    182. # y/ m; F1 C3 i
    183.         }
    184. % ^% j) y* M/ l
    185.         LockKey(Matrix,NULL,OpMatrix);//解锁键Matrix,本例中,该函数可以不用
    186. # w( S' o1 Y4 e* v6 O/ u
    187.         FreeLu();                        //释放Lu
    188. 8 T& }5 i+ c9 b, G( r, c# Q+ P$ h7 N
    189. }
    习题:  }. q+ G+ I+ y7 g

    . ~# Z! i1 c% `7 j" A    (1)自定义矩阵的加、减、左除、右除、点左除等运算,自编测试字符串代码,重新编译运行程序,观察计算结果。
    3 I. m- I% X7 @/ }/ J8 h9 B4 P' v
        (2)小矩阵乘效率测试。编译运行以下Lu字符串代码:
    1. main(:a,b,c,d,t,i)=% m& e% C+ M2 G0 |\" T; K
    2.     a=new[matrix,2,2,data:1.,2.,2.,1.],
      5 N1 }* F% k* r& }\" ~/ r
    3.     b=new[matrix,2,2,data:2.,1.,1.,2.],
      / r8 ^! r% D) e2 H! f$ i, i, W
    4.     c=new[matrix,2,2,data:2/3.,-1/3.,-1/3.,2/3.],
      ! c' G/ A: \6 H
    5.     t=clock(),
      ) A/ M9 @( s+ M
    6.     d=a*b, i=0, while{i<1000000, d=d*c*b, i++},2 j; O/ I- [. I0 C2 P
    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.
      # g% M$ m, o\" P: }
    2. 5. 4.. N, [, r% q: D, Q8 a2 x3 W: V+ ^5 b: j. O
    3. time=0.875 seconds.
      0 ?1 D. W* f. x2 T+ O% A
    4. 请按任意键继续. . .
    复制代码
    Matlab 2009a 代码:
    1. a=[1.,2.;2.,1.];' g. w# U- A\" `( n, h
    2. b=[2.,1.;1.,2.];( U\" f5 |; S7 ]
    3. c=[2/3.,-1/3.;-1/3.,2/3.];( S; A. R) ?0 _, |6 o
    4. tic,
      9 p$ O0 L0 C  ~4 r' ?
    5. d=a*b;2 M& D/ D, l0 v; S9 J7 B
    6. for i=1:1000000- c8 }# e0 R9 e  A! W! O% n' k: {# C* Y
    7.     d=d*c*b;
      - h\" F\" [6 d' K: f1 R, k
    8. end+ J7 E* P, ]2 X% D' ~- w
    9. d,# `& x* \0 n4 I9 x) [7 }% F
    10. toc
    复制代码
    结果:
    1. d =
      . n8 }+ V# Z- }5 C# h' x
    2.      4     5. a4 o\" r9 X6 e- V8 O
    3.      5     4. {\" p6 W) k3 a1 ?2 X8 @
    4. Elapsed time is 2.903034 seconds.
    复制代码
    本例矩阵乘效率测试,Lu的速度超过了Matlab,主要在于Lu有更高的动态对象管理效率。
    # z3 \: a; C: `/ b& y) p1 H* ~7 F
    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-7-9 10:52 , Processed in 0.319333 second(s), 63 queries .

    回顶部