1 #author Todd Veldhuizen,ʯÀÚ
4 #title C++¿Æѧ¼ÆËã¼¼ÇÉ( Techniques of scientic C++)
6 * <lisp>(setq Title "C++¿Æѧ¼ÆËã¼¼ÇÉ")</lisp>
7 - ×÷Õß:[[mailto:tveldhui@acm.org][ Todd Veldhuizen]]
8 - ·Òë: [[http://stoneszone.net][ʯÀÚ]]
9 - ³ö´¦: Indiana University Computer science Technical Report #542 Version 0.4,August 2000
10 - °æȨ: תÔØÇë×¢Ã÷³ö´¦
15 **** 1.1.1 °²¸§×Ó±ê×¼µÄ±àÒëÆ÷
16 ËùÓеÄC++±àÒëÆ÷½öÖ§³ÖISO/ANSI C++±ê×¼µÄ²»Í¬×Ó¼¯¡£ÊÔͼÌṩ¿ÉÒÔÔËÐÐÔÚ²»Í¬Æ½Ì¨ÉϵÄC++¿â»ò³ÌÐòÊÇÒ»¸öÈÃÈËÍ·ÌÛµÄÊÂÇé¡£
18 ±àÒëÆ÷ÖÐ×î´óµÄ¼æÈÝÐÔÎÊÌâÊÇ
22 Èç¹ûÄãÐèҪд¿ÉÒÔÔÚ²»Í¬Æ½Ì¨Ï¹¤×÷µÄ´úÂ룬´ó²¿·Öʱ¼äÄã»áÔڼ尾Öжȹý¡£ÔÚBlitz++¿âÖУ¬ÎÒ²ÉÓÃÁËÀ©Õ¹µÄÔ¤´¦ÀíKludgesÀ´½â¾ö²»Í¬µÄ±àÒëÆ÷¡£ÀýÈçÏÂÃæÕâ¶Î´úÂë:
28 double pow(double x,double y)
29 {return std::pow(x,y);}
33 Õâ¶Î¼òµ¥µÄ´úÂëÔÚBlitz namespace(Ãû×Ö¿Õ¼ä)Öж¨ÒåÁËÒ»¸öº¯Êýpow,Ëüµ÷ÓÃÁ˱ê×¼µÄpowº¯Êý¡£Ò»Ð©±àÒëÆ÷²»Ö§³Ö<cmath>Í·Îļþ£¬ËùÒÔÐèÒªÌ滻Ϊ<math.h>¡£Ò»Ð©±àÒëÆ÷Ö§³Ö£¬µ«ÊÇC mathº¯Êý²»ÔÚstdµÄnamespaceÖС£ÉõÖÁһЩ±àÒëÆ÷¸ù±¾¾Í²»Ö§³Önamespace¡£ÎÒʹÓõĽâ¾ö·½°¸ÈçÏÂ:
36 #ifdef BZ_MATH_FN_IN_NAMESPACE_STD
43 double pow(double x,double y)
45 return BZ_MATHFN_SCOPE(pow)(x,y);
50 ÕâÖÖ½â¾ö·½·¨ºÜÄÑ¿´¡£²»ÐÒµÄÊÇ£¬ÕâÖÖÇéÐÎÈÔ»á³ÖÐøºÜ¶àÄֱ꣬µ½ËùÓеıàÒëÆ÷¶¼Âú×ã±ê×¼¡£
52 Blitz++×Ô´øÓÐÒ»¸ö½Å±¾(bzconfig),Ëü»áÔËÐÐÐí¶àСµÄ²âÊÔ³ÌÐòÀ´Õì²â³öµ±Ç°µÄ±àÒëÆ÷ÐèҪʲôÑùµÄkludges¡£[[mailto::Luc.Maisonobe@cnes.fr][Luc Maisonobe]]ÒѾ½«ÕâЩ³ÌÐò¼ÓÈëÁËAutoconf¹¤¾ßÖС£ÄãÒ²¿ÉÒÔÐÞ¸ÄBlitz++ÖеÄbzconfig½Å±¾À´Ê¹ÓÃËü¡£
54 ÁíÒ»ÖÖ·½·¨À´±ÜÃâ¶à¸öƽ̨֧³ÖµÄ·½·¨Ê±½öÖ§³Ögcc±àÒëÆ÷¡£ÒòΪËüÔÚÖ§³Ö±ê×¼·½ÃæÒªºÃ¹ýºÜ¶à±àÒëÆ÷£¬²¢ÇÒÔÚ±ê×¼¿âʵÏÖÉÏÓнϸߵÄÌáÉý¡£¿ÉÊÇËüÔÚÓÅ»¯ÉÏûÓÐKAI c++±àÒëÆ÷ºÍһЩÌض¨³§É̵ıàÒëÆ÷Ç¿¡£µ«¶ÔÓÚ´óÐ͵Äout-of-cache³ÌÐò£¬gcc×öµÄºÜºÃ¡£(Out-out-cache ³ÌÐò¶ÔÓÚÓÅ»¯²»Ãô¸Ð£¬ÒòΪ´ó¶àÊýµÄcpuʱ¼äÓÃÔÚÁËÄÚ´æÉÏ(Stalling for memory).
57 ¶àÊýµÄc++±àÒëÆ÷ʹÓÃÓÉEDG(Edison Design Group)дµÄÇ°¶Ë¡£Õâ¸öÇ°¶ËÊÇÒ»¸öºÜ½Ó½ü±ê×¼£¬½¡×³¿É¿¿£¬¿ÉÒÔÌṩºÜÓÐÒâÒåµÄ´íÎóÐÅÏ¢¡£Äã¿ÉÒÔÔÚÈκÎƽ̨ÉÏÕÒµ½EDGµÄÉíÓ°¡£ÆäÖеÄһЩÊÇ:SGI C++,KAI C++,DEC cxx,Gray C++,Intel C++,Portland Group C++,Tera C++¡£
59 ´ó²¿·ÖµÄc++±àÒëÆ÷(Borland/Inprise,Microsoft,etc)²»·ûºÏ±ê×¼µÄ³Ì¶ÈÁîÈ˾ªÑÈ¡£ËüÃǶ¼¹Ø×¢ÔÚCOM,DCOM,WFCµÈÉÏ¡£Ò»µã¶¼²»¹ØÐıê×¼µÄÖ§³Ö¡£Microsoft's 6.0 C++±àÒëÆ÷ÔÚ±àÒë¼òµ¥µÄ³ÉԱģ°æʱ¶¼»á¾³£µÄ±ÀÀ£¡£ÔÚºÍMicrosoft¿ª·¢ÈËÔ±¶Ô»°µÄ¹ý³ÌÖУ¬ËûÃÇ˵ÕâÊÇÒòΪËûÃǵĿͻ§²»»á¹ØÐÄÊÇ·ñ·ûºÏ±ê×¼£¬¶øÊÇÔÚ¹ØÐÄһЩWFC/COMµÈ¶«Î÷¡£Ò²ÐíÕâÊǶԵġ£µ«ÊÇÈç¹ûÄãÔÚ×Ô¼º×îϲ»¶µÄ±àÒëÆ÷ÉÏÓÉÓÚ±ê×¼ÎÊÌâ¶øÊܴ죬ÄǾÍÒò¸ÃÏò¿ª·¢ÉÌͶËߣ¬·ñÔòËûÃÇÊDz»»á¿¼ÂÇÕâЩµÄ¡£
62 **** 1.1.3 Ìض¨µÄC++ÓÅ»¯
63 ´ó²¿·ÖµÄ±àÒëÆ÷ÔÚÓÅ»¯C++³ÌÐòÉÏÁîÈËʧÍû¡£¶ÔÓÚÔÚc++Öо³£³öÏÖµÄǶÌ׵ľۼ¯ºÍÁãʱ±äÁ¿£¬³£¹æµÄÓÅ»¯¼¼ÇÉÐèÒªÐ޸ġ£µ«ÊÇKAI±àÒëÆ÷ÊÇÒ»¸öÀýÍ⣬ËüµÄÓÅ»¯×öµÄºÜºÃ¡£ÁíÍâÒ»¸öÊÇSGI±àÒëÆ÷(ËäÈ»¶ÔÓÚKAI£¬Ä¿Ç°ÔÚÁãʱ±äÁ¿Ïû³ýÉÏ»¹×öµÄ²»¹»ºÃ)
65 KAIÔÚÓÅ»¯¼¼ÊõÉÏÓÐÃÀ¹úרÀû£¬µ¼ÖÂÆäËû³§É̲»ÄÜʵÏÖÏàͬµÄÓÅ»¯¼¼Êõ¡£¾¡¹ÜÈç´Ë£¬Ëü»¹ÊǸøEPC++±àÒëÆ÷ÌṩÁËÓÅ»¯ÒýÇæµÄʹÓÃÐí¿ÉÖ¤¡£
68 ¶ÔBlitz++±§Ô¹×î¶àµÄÊDZàÒëʱ¼ä¹ý³¤(ÒÔ¼°ÆäËûµÄtemplate C++ ¿â)¡£ÏÂÃæС½Ú½«½éÉÜΪºÎC++³ÌÐòÐèÒªÕâô³¤µÄʱ¼ä±àÒë¡£
71 Í·ÎļþÊÇÒ»¸ö´óÎÊÌâ¡£C++ûÓÐÒ»¸öºÜÓÐЧµÄÄ£¿éϵͳ¡£µ¼Ö´óÁ¿µÄÍ·ÎļþÔÚÿһ¸ö±àÒëÄ£¿é¶¼ÐèÒª±»½âÎöºÍ·ÖÎö¡£ÀýÈ磬 °üÀ¨<iostream>ÔÚÓÐЩ±àÒëÆ÷ÉÏ»áÀÈë³ÉǧÉÏÍòÐеĴúÂë¡£
73 Template ¿âµÄÇé¿ö¸ü¼ÓÑÏÖØ¡£ÒòΪËùÓеÄÄ£°æ¾ÛÏÖ¶¼ÔÚ±àÒëÆÚ½øÐС£ËùÒÔ³ýÁ˺¯ÊýÉùÃ÷£¬Í·Îļþ»¹°üÀ¨Á˺¯Êý¶¨Òå¡£
75 ÀýÈ磬ÔÚÎÒµÄ×ÀÃ湤×÷Õ¾ÓÃgcc±àÒëBlitz++µÄ example/array.cppÀý×ÓÐèÒª37Ãë¡£Èç¹ûÄã³ýÈ¥ÆäÖÐËùÓеĴúÂ룬ֻÁôÏÂ#include<blitz/array.h>ÕâÒ»ÐУ¬±àÒ뾹Ȼ»¹ÐèÒª22Ãë¡£Ò²¾ÍÊÇÊÇ˵£¬60%µÄʱ¼ä¶¼±»ÓÃÀ´±àÒëÍ·ÎļþÁË£¡
77 Ô¤ÏȱàÒëÍ·Îļþ¼¼Êõ¿ÉÒÔÔÚÒ»¶¨³Ì¶ÈÉÏ»º½âÕâ¸öÎÊÌ⣬µ«ÊÇÓÐʱºòËûÃÇÒ²»áÈÃÎÊÌâ¸ü¼ÓÑÏÖØ¡£ÔÚBlitz++ÖпªÆôPrecompiled Header¿ÉÒÔ²úÉú´óÔ¼64MbµÄdumps,¶ÁÈ¡Ëü»á±ÈËüÈ¡´úµÄÔÍ·Îļþ»ª¸ü¶àµÄʱ¼ä¡£
79 ±¾½Ú¸æËßÄãÒª¾¡Á¿±£³ÖÄãµÄHeaderԽСԽºÃ¡£µ±¿ª·¢Ò»¸ö¿âʱ£¬ÌṩºÜ¶à¸öСµÄÍ·ÎļþÀ´ÔÚÏàÓ¦µÄÇé¿öÏ·ֱð°üº¬£¬¶ø²»Ó¦¸Ã½ö½öÌṩһ¸ö°üº¬ËùÓгÌÐò¿âµÄ³¬´óÍ·Îļþ¡£
82 Ä£°æ¸ø±àÒëÆ÷µ¼ÖÂÁËÒ»¸öÑÏÖصÄÎÊÌ⡣ʲôʱºòËûÃDzÅÐèÒª±»¾ÛÏÖ»¯£¿Õâͨ³£ÓÐÁ½ÖÖ·½Ê½:
84 - ¶ÔÓÚÿһ¸ö±àÒëÄ£¿é£¬Éù³ÆËùÓÐÐèÒªµÄÄ£°æʵÀý¡£Õâµ¼Ö¶àÖØÄ£°æʵÀý-Èç¹ûfoo1.cppºÍfoo2.cpp¶¼Ê¹ÓÃÁË list<int>, ÄãµÃµ½ÁËÁ½¸ölist<int>µÄʵÀý-Ò»¸öÔÚfoo1.oÖУ¬ÁíÒ»¸öÔÚfoo2.oÖС£Ò»Ð©Á¬½ÓÆ÷»á×Ô¶¯µÄÅ×ÆúÖظ´µÄʵÀý¡£
85 - ²»×öÈκξÛÏÖ»¯¡£¶øÔÚÁ¬½ÓʱÆÚÀ´È·¶¨Ê²Ã´Ä£°æÐèÒª¾ÛÏÖ£¬È»ºó»Øµ½±àÒëÈ¥Éú³ÉËüÃÇ¡£Õâ¾Í½Ð×öPrelinking
87 ²»ÐÒµÄÊÇprelinkingÐèÒªprelinkingÄãµÄÕû¸ö³ÌÐòºÜ¶à´Î¡£
89 Ò»¸öÄ£¿é±»Öظ´±àÒëÈý´ÎºÜ³£¼û¡£Äã¿ÉÒÔÏëÏ󣬶ÔÓÚÒ»¸ö´óÐ͵ijÌÐòÕ⽫ºÄ·Ñ¶àÉÙ±àÒëʱ¼ä¡£
91 ²ÉÓÃEDGÇ°¶ËµÄ±àÒëÆ÷¿ÉÒÔÇ¿ÖƲ»×öprelinking,ͨ¹ýoption -tused »òÕß-ptusedʵÏÖ¡£
93 **** 1.2.3 ³ÌÐòÊý¾Ý¿â·½·¨-visual age c++
95 IBMµÄVisual Age C++ ±àÒëÆ÷¶ÔÓÚ·Ö±ð±àÒëÓÐÒ»¸öÓÐȤµÄ¼¼Êõ¡£Ëü°ÑËùÓеĴúÂë±£´æÔÚÒ»¸öÊý¾Ý¿âÖС£ÓÉÓÚÍêÕûµÄÔ´´úÂ붼ÊÇ¿ÉÒÔÔÚ±àÒëÆÚ¼äÈ¡µÃµÄ(¶ø²»Êǽö½öÒ»¸ö±àÒëµ¥ÔªµÄ´úÂë)£¬VAC++ ²»ÐèÒª×öprelinking»òÕßµ£ÐÄ·Ö±ð±àÒëÎÊÌâ¡£±àÒëÆ÷×öÔöÁ¿±àÒ룬µ«ÊǽöÕë¶Ô´úÂë¸Ä±äµÄÇé¿ö¡£ÕâÖÖ¼¼Êõ¿ÉÒÔ´ó·ù¶ÈµÄ½µµÍ±àÒëtemplate c++ ¿âµÄʱ¼ä¡£
98 **** 1.2.4 ¶þ´Î/Èý´Î Ä£°æËã·¨
99 ÏñBlitz++µÄ¿âʹÓÃÁË´óÁ¿µÄtemplate¡£Ò»Ð©±àÒëÆ÷ÔÚÄ£°æ¾ÛÏÖÉÏÓÐ×Ô¼ºµÄËã·¨£¬µ«ÊÊÓ¦ÐÔ²»ÊǺܺá£ÀýÈçÏÂÃæµÄ´úÂë:
114 Èç¹û¾ÛÏÖfoo<N>,ÄÇôfoo<N-1>±»¾ÛÏÖ£¬Í¬Ñùfoo<N-1>,...,Ö±µ½foo<0>¡£±àÒëÐèÒª¶àÉÙʱ¼ä£¿¾ÛÏֵĺ¯Êý¸öÊýÊÇN¸ö£¬ËùÒÔ±àÒëʱ¼äÓ¦¸ÃËæNÏßÐÔÔö³¤£¬¶ÔÂð£¿
116 ²»ÐÒµÄÊǶÔһЩ±àÒëÆ÷²¢²»ÊÇÕâÑù¡£¼òµ¥µÄ˵£¬Ðí¶à±àÒëÆ÷×ÔÉí±£´æÒ»¸öÁ´±í£¬È·¶¨Ò»¸ötemplateÊÇ·ñ±»¾ÛÏÖ¹ýÐèÒªÏßÐÔËÑË÷¡£ËùÒÔ±àÒëʱ¼äΪO(N^2).Õâ¶ÔÓÚºÜÉÙµÄtemplateµÄ³ÌÐò²»³ÉÎÊÌ⣬µ«¶ÔÓÚÏñBlitz++ÄÇÑùÓÐÉÏǧ¸ötemplateÐèÒª¾ÛÏֵijÌÐò¿â¾ÍºÜÖÂÃü¡£
118 ͬÑùµÄÎÊÌâ¿ÉÒÔ·¢ÉúÔÚÓÅ»¯Ëã·¨ÉÏ¡£±ÈÈç±ðÃû¼ì²é¡£ÎÒÔÚһЩÖ÷Á÷C++±àÒëÆ÷ÉÏ·¢ÏÖÁËO(N^2),O(N^3)µÄÓÅ»¯Ëã·¨¡£
121 **** 1.3.1 Ð麯ÊýÊÇа¶ñµÄÂð£¿
122 ÔÚC++µÄÊÀ½çÀ¶à̬Òâζ×ÅÐ麯Êý¡£ÕâÖÖ¶à̬ÊǺÜÓÐ×÷ÓõÄÉè¼Æ·½·¨¡£µ«ÊÇʹÓÃÐ麯Êý»áÓдóµÄÐÔÄÜËðʧ¡£
125 - Ð麯Êý·ÖÅÉ¿ÉÒÔµ¼Ö²»¿ÉÔ¤ÁϵÄÖ´ÐзÖÖ§-Á÷Ë®Ïß×÷Òµ»áÍ£Ö¹(ÔÚһЩƽ̨ÉÏÓÎbranch cache£¬¿ÉÒÔ±ÜÃâÕâÖÖÎÊÌâ)
126 - Ä¿Ç°µÄC++ ±àÒëÆ÷²»ÄÜÓÅ»¯Ð麯Êýµ÷ÓÃ: Ëü×èÖ¹ÁËÖ¸Áîscheduling,Êý¾ÝÁ÷·ÖÎö£¬Ñ»·Õ¹¿ªµÈ¡£
128 ĿǰһЩÑо¿ÏîÄ¿ÒѾ³É¹¦ÔËÓÃÁËÌæ»»Ð麯ÊýµÄ·½·¨£¬³ÆΪֱ½Ó·Ö·¢(direct dispatch)¡£µ«ÊÇÕâÖÖ·½·¨»¹Ã»ÓÐÔÚÈκαàÒëÆ÷ÉÏʵÏÖ¡£Ò»¸öÕÏ°ÊÇÈ¥³ýÐéÄ⺯Êý·ÖÅÉÐèÒª¶ÔÈ«²¿³ÌÐò½øÐзÖÎö-Äã±ØÐëÓÐÕû¸ö³ÌÐò²ÅÄÜÔÚ±àÒëʱ¼ä·ÖÎö¡£¼¸ºõËùÓеÄC++ʵÏÖ¶¼¶Ô±àÒëÄ£¿é½øÐзֱðµÄµ¥¶À±àÒë-ΨһµÄÀýÍâÊÇVisual Age C++¡£
130 ±ØÐëÁ˽âµÄÊÇ£¬¾¡¹ÜÈç´Ë£¬Ð麯Êý²¢²»ÊÇÔÚÈκÎÇé¿ö¶ÔÓÚÐÔÄܶ¼ÊÇËÀÍöÖ®ÎÇ¡£×îÖØÒªµÄÊÇ£ºÓжàÉÙ´úÂëÔÚÐ麯ÊýÖУ¿Èç¹ûÓкܶàµÄ´úÂ룬ÔòÐ麯Êý¶ÔÐÔÄܵÄÓ°Ïì²»»áºÜ¿É¹Û¡£Èç¹ûºÜÉٵĻ°£¬ÔòÓ°Ïì»áºÜÑÏÖØ¡£
132 ÄÇô£¬Ê²Ã´Ê±ºòÐ麯ÊýÊDz»ÊÊÓõģ¿
134 - ÔÚÐ麯ÊýÖеĴúÂëºÜÉÙ(e.g СÓÚ25flops)¡£
135 - Ð麯ÊýʹÓõĺÜƵ·±(e.g. ÔÚÑ»·ÖÐ)¡£Äã¿ÉÒÔʹÓÃprofilerÀ´ÅжÏÕâµã¡£
137 Ð麯ÊýÔÚº¯Êý±È½Ï´ó(½øÐкܶàµÄ¼ÆËã)µÄʱºò¸ß¶ÈÍƼöʹÓ㬻òÕß²»Êǵ÷ÓúÜƵ·±µÄ»°¡£
139 ²»ÐÒµÄÊÇ£¬ÔÚ¿Æѧ¼ÆËã³ÌÐòÖУ¬Ò»Ð©¶ÔÓÚÐ麯Êý×îÓÐÓô¦µÄµØ·½¶¼ÔÚÑ»·ÖУ¬²¢ÇÒÒ»°ã¶¼ÊÇСº¯Êý¡£Ò»¸ö±È½Ï¾µäµÄÀý×ÓÈçÏ£º
143 public:virtual double operator()(int i,int j)=0;
146 class SymmetricMatrix:public Matrix{
147 public:virtual double operator()(int i ,int j);
150 class UpperTriangularMatrix:public Matrix{
151 public:virtual double operator()(int i,int j);
155 Ð麯Êý·ÖÅÉoperator()À´´Ó¾ØÕóÖжÁÈ¡ÔªËØ£¬Õâ»áÆÆ»µÈκÎÒ»ÖÖ¾ØÕóËã·¨µÄÐÔÄÜ¡£
157 **** 1.3.2 ½â¾ö·½·¨A: ¼òµ¥ÒýÇæ(simple engines)
158 "engines"À´×ÔÔÚLANLµÄPOOMAÍŶӡ£Éè¼ÆģʽÉçÇøÒ²ÓÐÒ»¸öͬÑùµÄÃû³Æ¡£
160 Ïë·¨ÊǰѶ¯Ì¬¶à̬£¨Ð麯Êý£©Ì滻Ϊ¾²Ì¬¶à̬(template parameters)¡£ÕâÊÇÒ»¸ö²ÉÓÃÁËÕâÖÖ¼¼ÊõµÄMatrixµÄ¹Ç¼Ü¡£
164 //·â×°Õë¶Ô¶Ô³Æ¾ØÕóµÄ´æ´¢ÐÅÏ¢
167 class UpperTriangular{
168 //·â×°Õë¶ÔÈý½Ç¾ØÕóµÄ´æ´¢ÐÅÏ¢
171 tempalte<class T_engine>
177 //²ÉÓÃÈκξØÕó½á¹¹µÄº¯Êý
178 template<class T_engine>
179 double sum(Matrix<T_engine>& A);
187 ÔÚÉÏÀýÖУ¬¾ØÕó½á¹¹µÄ²»Í¬±ä»¯Òþ²ØÔÚengines SymmetricºÍUpperTriangularÖС£MatrixÀà°Ñengine×÷Ϊtemplate parameter,²¢ÇÒ°üº¬Õâ¸öengineµÄʵÀý×÷Ϊ³ÉÔ±±äÁ¿¡£
189 Óû§Ê¹ÓõķûºÅ±äÁË£ºMatrix<Symmetric> ¶ø²»ÊÇÔÀ´µÄSymmetricMatrix£¬²»¹ýÕâ¸ö²»ÊÇÒ»¸ö´óÎÊÌâ¡£ÎÒÃÇ¿ÉÒÔʹÓÃtypedefineÀ´Òþ²ØÕâ¸öϸ½Ú¡£Í¬Ñù£¬ÔÚMatrixÖУ¬´ó²¿·Ö²Ù×÷Òª±»´úÀí¸øenginesÀ´´¦Àí¡£
191 ÕâÖÖ½â¾ö·½·¨×îÑÏÖصÄÎÊÌâÊÇËùÓеÄMatrix×ÓÀàÐͶ¼±ØÐëÓÐͬÑùµÄ³ÉÔ±º¯Êý¡£ÀýÈ磬Èç¹ûÎÒÃÇÏëÒªMatrix<Symmetric>ÓÐÒ»¸öisSymmetricPositiveDefinite()µÄ·½·¨£¬µäÐ͵ÄʵÏÖÊÇ£º
194 template<class T_engine>
197 //Delegate to the engine
198 bool isSymmetricPositiveDefinite()
199 {return engine.isSymmetricPositiveDefinite();}
207 bool isSymmetricPositiveDefinite()
214 µ«ÊÇÕⲢûÓÐʹMatrix<UpperTriangular>ÓÐÀíÓÉ°üº¬isSymmetricPositiveDefinite()º¯Êý£¬ÒòΪupper triangular¾ØÕó²»ÄÜΪ¶Ô³Æ¡£´ÓÉÏÀý¿ÉÒÔ¿´³öÕâÖÖ·½·¨Ê¹»ùÀà°üº¬ÁËËùÓÐ×ÓÀàÐÍËùÓµÓеĺ¯Êý¡£ËùÒÔµ¼Ö²úÉúÁ˺ܶàÔÚengineÖлáÅ׳öÒì³£µÄ³ÉÔ±º¯Êý¡£
218 class UpperTriangular{
220 bool isSymmetricPositiveDefinite()
222 throw makeError("Method isSymmetricPositiveDefinite() is not defined for UpperTriangular¾ØÕó");
230 ÁíÒ»ÖÖ·½·¨£ººöÂÔÕâЩº¯Êý¶¨Òå»á°ÑÄãµÄÓû§Íƽø»ð¿Ó¡£ÒòΪµ±Óû§ÊÔͼʹÓÃÕâЩ䶨ÒåµÄº¯ÊýµÄʱºò£¬»áµÃµ½Ò»´ó¶ÑÆæ¹ÖµÄÄ£°æ¾ÛÏÖ´íÎó¡£
232 ¿ÉϲµÄÊÇ£¬ÓÐÒ»ÖÖ¸üºÃµÄ½â¾ö·½·¨¡£
234 **** 1.3.3 ½â¾ö·½°¸B: Barton ºÍNackman ¼¼Êõ
235 ÕâÖÖ¼¼Êõ³ÆΪ"Barton and Nackman Trick",ÒòΪ ËûÃÇÔÚËûÃǵĽܳöÖø×÷<<Scientific and Engineering C++>>ÖÐʹÓÃÁËÕâÖÖ¼¼Êõ¡£GeoffÈ¡ÁËÒ»¸ö±È½ÏÓÐÒâÒåµÄÃû×Ö"Curiously Recursive Template Pattern"¡£
237 Èç¹ûÄãûÓмû¹ýÕâÖÖ¼¼ÇÉ£¬ÄÇôËüÒ»¶¨»áÈÃÄ㿪ʼץͷµÄ¡£Êǵģ¬ËüÊǺϷ¨µÄ¡£
241 //»ùÀàÓÐÒ»¸öÄ£°æ²ÎÊý¡£Õâ¸ö²ÎÊý¶¨ÒåÁ˸ÃÀàÓ¦¸Ã´ÓÄÄÀï¼Ì³Ð¡£
242 template<class T_leaftype>
246 {return static_cast<T_leaftype&>(*this);}
248 double operator()(int i,int j)
249 {return asLeaf()(i,j);} //´úÀí¸øleaf
253 class SymmetricMatirx : public Matrix<SymmetricMatrix>{
257 class UpperTriMatrix: public Matrix<UpperTriMatrix>{
261 // ʹÓÃÀý×Ó£¬¿ÉÒÔ½ÓÊÜÈκξØÕóÀà
262 template<class T_leaftype>
263 double sum(Matrix<T_leaftype>& A);
270 ÕâÖÖ¼¼Êõ¿ÉÒÔʵÏÖÒ»°ã»¯µÄ¼Ì³ÐÌåϵ½á¹¹¡£¹Ø¼üµãÔÚÓÚ»ùÀàÓÐÒ»¸öÄ£°æ²ÎÊý£¬¸Ã²ÎÊýΪºó´ú(Ò¶×Ó)ÀàµÄÀàÐÍ¡£±£Ö¤ÁËÔÚ±àÒëÆÚ¼ä¸ÃÀàÐÍÐÅÏ¢ÊÇ¿ÉÒԵõ½µÄ-²»ÔÙÐèÒªÐ麯ÊýµÄ·ÖÅÉ¡£
272 Ôڼ̳ÐÀàÖпÉÒÔÈÎÒâÑ¡ÔñÐԵĽøÐж¨ÖÆ(ÀýÈ磬»ùÀà¿ÉÒÔʵÏÖĬÈϹ¦ÄÜ£¬¼Ì³ÐÀàÖØÔØÏàÓ¦µÄ¹¦ÄÜ)
274 ÓëÉϽڽâ¾ö·½·¨²»Í¬£¬¼Ì³ÐÀà¿ÉÒÔÓÐÆäÌØÊâµÄ£¬½öÊôÓÚ×Ô¼ºµÄ(»ùÀàûÓж¨Òå)³ÉÔ±º¯Êý¡£
276 ÕâÖÖ·½·¨£¬»ùÀàÈÔȻҪ½«Ò»Çе÷ÓôúÀí¸ø¼Ì³ÐÀà¡£
278 ʹÄãµÄ¼Ì³ÐÊ÷¶àÓÚÒ»²ãÊÇ¿ÉÐеģ¬µ«ÐèÒª¶à¼Ó¿¼ÂÇ¡£
280 *** 1.4 Callback inlining ¼¼Êõ
281 Callback ¾³£»á³öÏÖÔÚ³ÌÐòÖС£Ò»Ð©µäÐ͵ÄÀý×ÓÈçÏÂ
282 - ÊýÖµ»ý·Ö:Ò»¸öÒ»°ãÐԵĻý·Ö³ÌÐòʹÓÃCallbackº¯ÊýÀ´¶ÔÐèÒª±»»ý·ÖµÄº¯ÊýÇóÖµ¡£ÔÚC¿âÖУ¬Í¨¹ý´«È뺯ÊýÖ¸ÕëµÄ²ÎÊýʵÏÖ¡£
284 - ¶ÔÒ»¸öÈÝÆ÷ÖеÄËùÓбäÁ¿Ó¦ÓÃÒ»¸öº¯Êý¡£
285 - ÅÅÐòº¯Êý£¬Èçqsort()ºÍbsearch()ÐèÒªcallbackÀ´±È½Ï±äÁ¿¡£
287 ±ê×¼µÄCº¯Êý·½·¨²ÉÓú¯ÊýÖ¸ÕëÀ´ÊµÏÖCallback¡£
289 double integrate(double a,double b,int numSamplePoints,double(*f)(double){
290 double delta=(b-a)/numSamplePoints-1);
293 for(int i=0;i<numSamplePoints;++i)
296 return sum*(b-a)/numSamplePoints;
300 ÕâÖÖ·½·¨¹¤×÷µÄºÜºÃ£¬µ«ÊǶÔÐÔÄÜÓÐÓ°Ïì:ÔÚÄÚ²¿Ñ»·Öеĺ¯Êýµ÷ÓûᵼÖ½ϴóµÄÐÔÄÜËðʧ¡£Ò»Ð©ÓÅ»¯±àÒëÆ÷Ò²Ðí»áÖ´ÐÐinter-proceduralºÍÖ¸Õë·ÖÎöÀ´È·¶¨fÖ¸ÏòµÄÈ·Çк¯Êý£¬µ«ÊÇ´ó¶àÊý±àÒëÆ÷²»»á×ö¡£
302 **** 1.4.1 Callbacks: C++·½Ê½
303 ÔÚC++¿âÖУ¬callbacksÒ»°ã²ÉÓÃÐ麯Êý¡£ÐÂÒ»µãµÄ·½Ê½ÊǶ¨ÒåÒ»¸ö»ùÀ࣬ÈçIetegrator£¬¶¨ÒåÒ»¸öÐ麯Êý£¬Ôڼ̳Ð×ÓÀàÖж¨Òåʵ¼ÊÐèÒª±»»ý·ÖµÄº¯Êý¡£
309 double integrate(double a,double b,int numSamplePoints)
311 double delta=(b-a)/..;
314 for(int i=0;i<numSamplePoints;++i)
315 sum+=functionToIntegrate(a+i*delta);
316 reutrn sum*(b-a)/numSamplePoints;
319 virtual double functionToIntegrate(double x)=0;
322 class IntegrateMyFunction:Integrator{
324 virtual double functionToIntegrate(double x)
331 ͬCÀàËÆ£¬Ð麯Êý·ÖÅÉÔÚÄÚ²¿Ñ»·»áµ¼ÖÂÐÔÄÜϽµ(Èç¹û¸Ãº¯ÊýÖ´ÐÐʱ¼ä±È½Ï³¤£¬ÔòÐ麯ÊýµÄËðʧ¿ÉÒÔºöÂÔ²»¼Æ)¡£¶ÔÓÚÐÔÄÜ£¬ÐèÒªÔÚ»ý·Öº¯ÊýÖвÉÓÃinline the callbackº¯Êý¡£
333 ÏÂÃæ¾Í½éÉÜÈýÖÖ·½·¨ÊµÏÖinlined callbacks¡£
335 1. Expression templates
337 ÕâÊÇÒ»ÖÖ¾«Ï¸£¬¸´ÔӵĽâ¾ö·½·¨¡£ËüÀ©Õ¹ºÍά»¤ÆðÀ´±È½ÏÄÑ¡£Ò»°ã²»±ØÀË·ÑÄãµÄ¾«Á¦È¥Ñ¡ÔñÕâÖÖ·½·¨¡£
341 Callbackº¯Êý¿ÉÒÔ±»·â×°ÔÚÒ»¸öÀàÖУ¬´Ó¶ø´´½¨Ò»¸öº¯Êý¶ÔÏó»òÕ߽зº¯Êý¡£
348 //×¢Ò⣺Ϊinline ³ÉÔ±º¯Êý
349 double operator()(double x)
350 {return 1.0/(1.0+x);}
353 template<class T_function>
354 double integrate(double a,double b,int numSamplePoints,T_function f)
356 double delta=(b-a)/(numSamplePoints-a);
359 for(int i=0;i<numSamplePoints;++i)
362 return sum*(b-a)/numSamplePoints;
367 integrate(0.3,0.5,30,MyFunction())£»
371 Ò»¸öMyFunctionµÄ¶ÔÏó×÷Ϊ²ÎÊý´«Èëintegrateº¯Êý¡£C++±àÒëÆ÷»á¾ÛÏÖ»¯integrate, ÓÃMyFunctionÀ´Ìæ»»T_function;ÕâÑù»áµ¼ÖÂMyFunction::operator()±»inlined½øintegrate()µÄÄÚ²¿Ñ»·ÖС£
373 ÕâÖÖ·½·¨µÄȱµãÊÇÓû§±ØÐ뽫ËùÓÐËûÏëµ÷Óõĺ¯Êý·â×°ÔÚÀàÖС£Í¬Ñù£¬Èç¹ûCallbackº¯ÊýÐèÒª²ÎÊý£¬Ôò±ØÐëÌṩ¸øMyFunctionµÄ¹¹Ô캯Êý£¬²¢±£´æΪ³ÉÔ±±äÁ¿¡£
375 ×¢Ò⣬Äã¿ÉÒÔÏòÉÏÀýµÄintegrate´«È뺯ÊýÖ¸Õë¡£µ«ÕâºÍC·ç¸ñµÄcallbackº¯ÊýÒ»Ñù£¬²»»áÔÚÑ»·Öн«Äã´«ÈëµÄº¯ÊýÖ¸Õë½øÐÐinline»¯¡£
377 3. º¯ÊýÖ¸Õë×÷Ϊģ°æ²ÎÊý
382 double function1(double x)
387 template<double T_function(double)>
388 double integrate(double a,double b,int numSamplePoints)
391 double delta=(b-a)/(numSamplePoints-1);
394 for(int i=0;i<numSamplePoints;++i)
395 sum+=T_function(a+i*delta);
397 return sum*(b-a)/numSamplePoints;
402 integrate<function1>(1.0,2.0,100);
405 integrate()º¯Êý½«Ö¸Ïòcallbackº¯ÊýµÄº¯ÊýÖ¸Õë×÷Ϊģ°æ²ÎÊý¡£ÓÉÓÚÕâ¸öÖ¸ÕëÔÚ±àÒëÆÚ¼ä¾Í¿ÉÒÔÈ·¶¨£¬ËùÒÔfunction1±»inline½øÈëÄÚ²¿Ñ»·¡£²Î¿¼oon-listµµ°¸µÄSumclass algorithmsÌõÄ¿¡£
408 ´úÂëÅòÕͶÔÓÚ»ùÓÚÄ£°æµÄ¿âÀ´ËµÊÇÒ»¸öÎÊÌâ¡£ÀýÈ磬ÄãʹÓÃqueueµÄһЩʵÀý£º
416 ÄãµÄ³ÌÐò»áÓÐÈý¸ö²»Í¬°æ±¾µÄqueue<>¡£Õâ¶ÔÓÚʹÓûùÓÚÐ麯Êý¶à̬µÄÀÏ·ç¸ñc++¿â²¢²»ÊÇÎÊÌâ¡£
418 µ«ÊÇ£¬Êµ¼ÊÖбàÒëÆ÷»áÉú³ÉһЩ»ÄÃýµÄ¶àÓà´úÂëʹµÃÎÊÌâ¸ü¼ÓÑÏÖØ¡£
419 - һЩ±àÒëÆ÷ÔÚÿ¸öÄ£¿éÖоÛÏÖÄ£°æ£¬²¢ÇÒÔÚÁ¬½Óʱ±¨Öظ´¶ÔÏó´íÎó¡£
420 - һЩ±àÒëÆ÷(ÀϵÄ)¾ÛÏÖÄ£°æµÄÿһ¸ö³ÉÔ±º¯Êý¡£ISO/ANSIµÄ±àÒëÆ÷½ûÖ¹ÕâÖÐ×ö·¨£º±àÒëÆ÷Ó¦¸ÃÖ»¾ÛÏÖÕæÕýʵÓõÄÄ£°æ¡£
422 ÕâЩÎÊÌâÒ»²¿·ÖÊÇÎÒÃÇ×Ô¼ºÒýÆðµÄ: ʹÓÃÄ£°æÉú³É´úÂëÌ«ÈÝÒ×ÁË£¬ÒÔÖÁÓÚ³ÌÐòÔ±ºÜÉÙ¿¼ÂÇËüµÄºó¹û¡£ÎÒÇ÷ÏòÓÚÔÚÈκεط½Ê¹ÓÃÄ£°æ£¬ºÜ¶àʱºò¸ü²»²»È¥¿¼ÂÇʹÓÃÐ麯Êý¡£ÎÒ¸öÈËÒ»°ã²»¹ØÐÄ´úÂëÅòÕÍ£¬ÒòΪÎҵijÌÐòÒ»°ã¶¼ºÜС¡£µ«Êǹ¤×÷ÔÚ´óÐͳÌÐòµÄÈ˱ØÐ뿼ÂÇʹÓÃÄ£°æ»¹ÊÇÐ麯Êý¡£
424 - ËäȻģ°æ¿ÉÒÔ´øÀ´½ÏºÃµÄÐÔÄÜ£¬µ«ÊÇÒ²Òâζ×Å´ó¶àÊýÇé¿ö´øÀ´½Ï¶àµÄ´úÂë¡£(Èç¹ûÄãÖ»ÓÃÄ£°æÆäÖеÄÒ»¸öʵÀý£¬ËûÃDz»»á¸øÄã¸ü¶àµÄ´úÂë)
425 - Ð麯Êý¸øÄã×îÉٵĴúÂ룬µ«ÊÇÈ´ÊǽÏÂýµÄ´úÂë¡£ÕâÖÖÐÔÄÜËðʧÔÚÐ麯Êýº¯Êý¼ÆËãÁ¿½Ï´óµÄʱºòÊÇ¿ÉÒÔºöÂԵģ¬»òÕßÔÚº¯Êýµ÷ÓýÏÉÙµÄʱºò¡£
427 µ±È»£¬Ð麯ÊýºÍÄ£°æ²¢²»ÊǶÔÿ¸öÎÊÌⶼÊÇ¿ÉÒÔÑ¡ÔñµÄ¡£Èç¹ûÄãÐèÒª¶¯Ì¬µÄ¶à̬£¬Ä£°æ¾Í²»ÄÜʤÈΡ£ÏÂÃæ¾Í¸ø³öһЩ½µµÍ´úÂëÅòÕ͵Ľ¨Òé¡£
429 **** 1.5.1 ±ÜÃâkitchen-sinkÄ£°æ²ÎÊý
430 ½«ÀàµÄÿ¸öÊôÐÔ¶¼×÷Ϊģ°æ²ÎÊýÊǺÜÓÐÓÕ»óÁ¦µÄ¡£ÏÂÃæ¾ÍÊÇÒ»¸ö¿äÕŵÄÀý×Ó¡£
433 template<typename number_type,int N,intM,bool sparse,typename allocator,bool symmetric,bool banded,int bandwidthIfBanded>
437 ÿ¸ö¶àÓàµÄÄ£°æ²ÎÊý¶¼Îª´úÂëÅòÕÍÌṩÁË»ú»á¡£Èç¹ûÄãʹÓÃÁ˺ܶàÖÖ"kitchen-sink"µÄÄ£°æÀ࣬ÄãÓ¦¸Ã¿¼ÂÇͨ¹ýÐ麯Êý£¬³ÉԱģ°æµÈ¼õÉÙһЩģ°æ²ÎÊý¡£
439 ÀýÈ磬ÎÒÃÇÓÐÒ»¸öÀàlist<>¡£ÎÒÃÇÏëÒªÓû§ÓÐÄÜÁ¦Ìṩ×Ô¼ºµÄÄÚ´æ·ÖÅäÆ÷£¬ËùÒÔÎÒÃÇ¿ÉÒÔ½«Alloctor×÷Ϊһ¸öÄ£°å²ÎÊý:
442 list<double ,allocator<double>> A;
443 list<double , my_alloctor<double>>B;
446 ÕâÑù»áΪAºÍBÉú³É²»Í¬µÄlist°æ±¾£¬¾¡¹ÜÁ½Õߴ󲿷ֶ¼ÊÇһģһÑùµÄ(±ÈÈçÄãÒª±éÀúlist£¬Äã¾Í²»ÐèÒª¿¼ÂÇËüÔÚÄÚ´æÖÐÊÇÔõô·ÖÅäµÄ)¡£²ÉÓÃalloactor×÷Ϊģ°æ²ÎÊýÓÐʲôºÃ´¦Â𣿼¸ºõûÓÐ-ÄÚ´æ·ÖÅäÊǺÜÂýµÄ£¬ËùÒÔ¸½¼ÓµÄÐ麯ÊýËðʧ¶ÔËûÀ´ËµÊÇ¿ÉÒÔ½ÓÊܵġ£ÏÂÃæµÄ·½·¨¿ÉÒÔ»ñµÃͬÑùÁé»îµÄÉè¼Æ:
449 list<double> A(allocator<double>());
450 list<double> B(my_allocator<double>());
453 ÆäÖÐallocatorºÍmy_allocatorÊǶà̬µÄ¡£
455 **** 1.5.2 ½«º¯Êý¶¨ÒåÔÚÄ£°æÍâ
456 Äã¿ÉÒÔͨ¹ý½«º¯Êý¶¨ÒåÒƶ¯ÖÁÀඨÒåµÄÍâÃæÀ´±ÜÃâ´´½¨²»ÐèÒªµÄÖظ´³ÉÔ±º¯Êý¡£ÀýÈ磬ÏÂÃæÊÇÒ»¸öArray3DÀàµÄ¿ò¼Ü¡£
459 template<class T_numtype>
462 //È·±£ÏÂÃæµÄarrayÓÐͬÑùµÄ´óС
463 template<class T_numtype2>
464 bool shapeCheck(Array3D<T_numtype2>&);
467 int base[3]; //Æðʼx,y,zµÄindexÖµ
468 int extent[3]; //ÿ¸öx,y,zµÄ³¤¶È
471 template<class T_numtype> template<class T_numtype2>
472 bool Array3D<T_numtype>::shapeCheck(Array3D<T_numtype2>&B)
475 if((base[i]!=B.base(i))||(extent[i]!=B.extent(i)))
484 shapeCheck()º¯ÊýÈ·¶¨Á½¸öarrayÊÇ·ñÓÐͬÑùµÄÆðʼindexºÍ³¤¶È¡£Èç¹ûÄãÓкܶàÖÖ²»Í¬µÄarray(Array3D<float>,Array3D<int>,...),Äã»á×îÖÕÓµÓкܶà¸öshapeCheck()º¯ÊýµÄʵÀý¡£µ«ÊÇ£¬ÆäʵÕâЩʵÀýÊÇÍêÈ«Ò»ÑùµÄ£¬ÒòΪshapeCheck()²¢²»Ê¹ÓòÎÊýT_numtypeºÍT_numtype2¡£
486 ΪÁ˱ÜÃâ²úÉú¶àÖصÄʵÀý£¬Äã¿ÉÒÔ½«shapeCheck()Òƶ¯ÖÁûÓÐÄ£°æ²ÎÊýµÄ»ùÀ࣬»òÕßÒÆÖÁÈ«¾Öº¯Êý£¬ÈçÏ£º
492 bool shapeCheck(Array3D_base&);
500 template<class T_numtype>
501 class Array3D:public Array3D_base{
506 ÓÉÓÚshapeCheck()ÏÖÔÚ²»ÔÚÄ£°æÀàÖУ¬ËùÒÔÖ»ÓÐÒ»¸öËüµÄʵÀý¡£Èç¹ûÄãÕýºÃÊÇC++±àÒëÆ÷µÄ×÷Õߣ¬¶Áµ½ÕâÀÄãÓ¦¸Ã×¢Ò⣬Õâ¸öÎÊÌâ¿ÉÒÔͨ¹ý×Ô¶¯µÄ½øÐÐÄ£°æ²ÎÊýÓÐЧÐÔ¼ì²âÀ´±ÜÃâ¡£
508 **** 1.5.3 Inlining ¼¶±ð
509 Ò»°ãÇé¿ö£¬ÎÒÇ÷ÏòÓÚÔÚBlitz++Öн«ºÜ¶à¶«Î÷inline»¯£¬ÒòΪÕâÑù×Ó»áÐÖú±àÒëÆ÷ÓÅ»¯(¶ÔÓÚÄÇЩ²»×öinterprocedural·ÖÎöºÍÇ¿»¯inliningµÄ±àÒëÆ÷)¡£Èç¹ûÓÐÒ»Ì죬ÎҸоõBlitz++ÖеÄinlineÌ«¶àÁË£¬ÕâÓÐÒ»ÖÖ²ßÂÔ¿ÉÒÔ´¦ÀíÕâ¸öÎÊÌâ¡£
512 #if BZ_INLINING_LEVEL==0
516 #elif BZ_INLINING_LEVEL==1
517 #define _bz_inline1 inline
519 #elif BZ_INLINING_LEVEL==2
520 #define _bz_inline1 inline
521 #define _bz_iiline2 inline
524 _bz_inline void foo(Array<int>&A)
530 Óû§Èç¹û²»ÏëÒªÈκεÄinline£¬¿ÉÒÔ-DBZ_INLINING_LEVEL=0À´±àÒë,»¹¿ÉÒÔ¿ØÖÆÆäΪ1,2À´¿ØÖÆINLINEµÄ³Ì¶È¡£
533 ÈÝÆ÷Àà¿ÉÒÔ´óÖ·ÖΪÁ½¸ö²¿·Ö:STL·ç¸ñ(»ùÓÚiteratorµÄ)ºÍData/View·ç¸ñµÄ¡£
535 - Ò»¸öÈÝÆ÷ÀàÓµÓÐËùÓеÄÊý¾Ý¡£
536 - ×ÓÈÝÆ÷ͨ¹ýiterator rangeÀ´Ö¸¶¨£¬Ò»°ã²ÉÓÿª·Å-·â±ÕµÄÇøÓò:[iter1,iter2)¡£
537 - ÕâÖÖÉè¼Æ·ç¸ñÀ´×ÔSTL£»Èç¹ûÄãͨ¹ýÕâÖÖ·½·¨Ð´ÈÝÆ÷£¬Äã¿ÉÒÔÈ¡µÃÎÞ·ìµ÷ÓÃSTLËã·¨µÄÓÅÊÆ¡£
538 - ÈÝÆ÷ÖÁÉÙÐèÒªÓÐ1-DÐòÁеÄÓïÒå¡£ËùÓеÄ×ÓÈÝÆ÷±ØÐëintervals½øÄǸö1DµÄ˳Ðò¡£Õâ»á¶ÔÓÚ¶àάÊý×é»á²úÉúÎÊÌâ¡£(ÀýÈ磬A(2:6:2,2:6:2)µÄÔªËØÃ÷ÏÔ²»¾ßÓÐ1-DÐòÁеÄÓïÒå)
539 - iterator»ùÓÚÖ¸ÕëµÄ¸ÅÄ¶øÖ¸ÕëÓÖÊÇC++ÖÐ×îÈÝÒ×·¸´íÎóµÄµØ·½Ö®Ò»¡£Õâµ¼ÖºܶàÈÝÒ×´íÎóµÄʹÓÃiterator¡£
540 - ¶ÔÓÚº¯ÊýÀ´Ëµ£¬½«ÈÝÆ÷×÷ΪֵÀ´·µ»Ø±È½ÏÀ§ÄÑ¡£Ïà·´£¬ÈÝÆ÷¿ÉÒÔÓô«Èë²ÎÊýµÄ·½·¨(argument)À´½ÓÊܽá¹ûÄÚÈÝ¡£
542 **** 1.6.2 Data/View ÈÝÆ÷
543 - ÈÝÆ÷µÄÄÚÈÝ(Êý¾Ý)±£´æÔÚÈÝÆ÷Íⲿ¡£ÈÝÆ÷Ö»ÊÇÒ»¸öÊý¾ÝµÄÇáÁ¿¼¶¾ä±ú¡£
544 - ¶à¸öÈÝÆ÷¶ÔÏó¿ÉÒÔË÷Òýͬһ¸öÊý¾ÝÄÚÈÝ£¬µ«ÌṩËüµÄ²»Í¬µÄÊÓͼ¡£
545 - ʹÓòο¼¼ÆÊý:ÈÝÆ÷µÄÊý¾ÝÄÚÈÝÔÚ×îºóÒ»¸ö¾ä±úÏú»ÙºóÏú»Ù¡£ÕâÌṩÁËÒ»¸öÀ¬»ø»ØÊÕ»úÖƵÄʵÏÖ(ÇÒÓÐЧÂÊ)¡£
546 - ÓÐЩÇé¿ö϶¨Òå×ÓÈÝÆ÷±È½ÏÈÝÒ×(ÀýÈ磬¶àάÊý×éµÄ×ÓÊý×é)¡£
547 - ×ÓÈÝÆ÷¿ÉÒÔÊǵÚÒ»¼¶±ð(first class)µÄÈÝÆ÷(ÀýÈçµ±ÄãÈ¡µÃArray<N>µÄ×ÓÊý×飬½á¹ûÈÔÈ»ÊÇArray<N>£¬¶ø²»ÊÇSubArray<N>)
548 - ʹÓÃÒýÓüÆÊýµÄÈÝÆ÷ÐèÒª½ÏΪ¾«Ï¸µÄÉè¼Æ·½·¨¡£
549 - ´Óº¯ÊýÖзµ»ØÈÝÆ÷±È½ÏÈÝÒ×£¬²¢ÇÒ¿ÉÒÔ½«ÈÝÆ÷°´Öµ´«µÝ¡£
551 *** 1.7 AliasigºÍÏÞÖÆ
553 Aliasing¶ÔC++¿Æѧ¼ÆËã¿âÀ´ËµÊÇÓ°ÏìÐÔÄܵÄÒ»´óÎÊÌâ¡£ÀýÈ磬¿¼ÂǼÆËã1½×¾ØÕóA <- A+xxT£º
556 void rank1Update(Matrix&A,const Vector&x)
558 for(int i=0;i<A.rows();++i)
559 for(int j=0;j<A.cols();++j)
564 ¶ÔÓںõÄÐÔÄÜ£¬±àÒëÆ÷ÐèÒª±£³Öx(i)ÔڼĴæÆ÷Öжø²»ÊÇÔÚÄÚ²¿Ñ»·ÀïÖظ´µÄÔØÈëËü¡£¾¡¹ÜÈç´Ë£¬±àÒëÆ÷²»ÄÜÈ·¶¨µÄÊÇÔÚAÖеÄÊý¾Ý²»»á¸²¸Çx(i)ÖеÄÊý¾Ý¡£Õâ¶ÔÓÚ¾ØÕóºÍÏòÁ¿ÀàµÄÉè¼ÆÀ´ËµÊDz»¿ÉÄܲÉÓõģ¬µ«ÊDZàÒëÆ÷²»ÖªµÀÕâЩ¡£AliasingµÄ¿ÉÄÜÐÔµ¼Ö±àÒëÆ÷²úÉúµÍЧÂʵĴúÂë¡£
566 ÁíÒ»¸öAliasingµÄ½á¹ûÊÇÖжÏÑ»·µÄÈí¼þÁ÷Ë®Ïß¡£ ÀýÈ磬һ¸öDAXPY²Ù×÷y <- y + a*x
569 void daxpy(int n,double a,double*x,double *y)
577 ΪÁËÈ¡µÃºÃµÄЧÂÊ£¬Ò»¸öÓÅ»¯±àÒëÆ÷»á²¿·ÖµÄÕ¹¿ªÑ»·£¬È»ºó½øÐÐÈí¼þÁ÷Ë®ÏßÀ´ÕÒµ½ÓÐЧµÄÄÚ²¿Ñ»··½·¨¡£Éè¼ÆÕâ¸ö·½·¨¾³£ÐèÒª¸Ä±äÑ»·ÖеÄÔØÈëºÍ´æ´¢Ë³Ðò£¬ÀýÈç:
580 //ÐéÄâµÄÁ÷Ë®»¯DAXPYÑ»·
585 double t0=yt[0]+a*xt[0];
586 double t1=yt[1]+a*xt[1];
588 double t2=yt[2]+a*xt[2];
589 double t3=yt[3]+a*xt[3];
591 double t3=yt[3]+a*xt[3];
600 ²»ÐÒµÄÊÇ£¬±àÒëÆ÷ÎÞ·¨¸Ä±äÔØÈëºÍ´æ´¢µÄ˳ÐòÒòΪx,yÖ¸Õë¿ÉÄÜÔÚÄÚ´æÖÐÖصü¡£ÔÚFortran77/90ÖУ¬±àÒëÆ÷¿ÉÒÔ¼ÙÉèÊý×éµØַûÓÐÖصþ¡£¶ÔÓÚÔÚcacheÖеÄÊý×éÕâ»áµ¼ÖÂ20£50£¥µÄÐÔÄܲîÒì¡£ÕâÒÀÀµÓÚÌض¨µÄÑ»·/¼Ü¹¹¡£Aliasing¶ÔÓÚout-of-cacheÊý×éÀ´Ëµ²»ÊÇ´óÎÊÌâ¡£
602 ÓÅÐãµÄc/c++±àÒëÆ÷»á×öAliasing·ÖÎö£¬Ä¿µÄÊÇÈ·¶¨ÊÇ·ñ¿ÉÒÔÈÏΪָÕë¿É±»ÈÏΪÊÇÖ¸Ïò²»ÖصþÄÚ´æµÄ¡£Alias·ÖÎö¿ÉÒÔ¼õÉÙÐí¶àµÄAliasing¿ÉÄÜÐÔ£¬µ«ÊÇËû²»ÊÇÍêÃÀµÄ¡£ÀýÈ磬·ÖÎöÏñdaxpyº¯ÊýµÄ³ÌÐò±ØÐë×öÈ«¾Ö·ÖÎö¡£±àÒëÆ÷±ØÐëÔÚͬһʱ¼ä¿¼ÂÇÄãÖ´ÐеÄËùÓк¯Êý¡£³ý·ÇÄãµÄ±àÒëÆ÷×öÁËÈ«¾Öalias·ÖÎö(SGI»á),·ñÔòÄã¾Í»áÓÐaliasingÎÊÌâ¡£
604 NCEG(Numerical C Extensions Group)Éè¼ÆÁËÒ»¸ö¹Ø¼ü×Örestrict,¿ÉÒÔ±»Ò»Ð©±àÒëÆ÷ʶ±ð£¨KAI,Cray,SGi,Intel,gcc)¡£restrictÊÇÒ»¸ö¿ÉÒÔ¸æËß±àÒëÆ÷¸Ã±äÁ¿Ã»ÓÐAliasingµÄÐÞÊηû¡£ÀýÈ磺
607 double * restrict a; //a[0],a[1]..ûÓÐaliasing
608 int & restrict b ; //bûÓÐaliases
611 ÔÚC++ÖÐrestrictµÄÃ÷È·¶¨Òå²¢²»ÊǺÜnailed down¡£µ«Êǵ±restrictʹÓú󣬱àÒëÆ÷¿ÉÒÔ×ÔÓɵÄÓÅ»¯¶ø²»È¥¿¼ÂÇ×°ÔØ£¯´æ´¢Ë³Ðò¡£
613 ²»ÐÒµÄÊǽ«restrict¼ÓÈëiso/ansi c++±ê×¼µÄÌáÒé±»·ñ¾öÁË¡£ÎÒÃÇ×îÖյõ½µÄÊÇÒ»¸öÄÜÁ¦ÓÐÕùÒéµÄvalarray¡£valarrayÊý×éÀàÉè¼ÆΪûÓÐaliasing£¬Òò´Ë¿ÉÒÔÔÊÐí±àÒëÆ÷¶ÔÆäÉϵIJÙ×÷½øÐÐÓÅ»¯¡£
615 ¾¡¹ÜÈç´Ë£¬restrictÒѾ±»ansi/iso cÁÐΪ±ê×¼£¬Òò´ËÓпÉÄÜÔÚÏÂÒ»´ÎÖмÓÈëc++±ê×¼¡£µ±¿ÉÒÔʹÓÃrestrictʱ£¬¿ª·¢³ÌÐò¿ÉÒÔʹÓÃÔ¤ÏȱàÒëkludge¡£ÀýÈç,blitz++¶¨ÒåÁËÈçϵĺ꣺
618 #ifdef BZ_HAS_RESTRICT
619 #define _bz_restrict restrict
626 double * _bz_restrict data_;
631 ÔÚһЩƽ̨ÉÏ£¬±àÒëÆ÷ÓÐÑ¡Ïî¿ÉÒÔÔÊÐí±àÒëÆ÷¼ÙÉèûÓÐaliasing¡£Õâ¿ÉÒÔµ¼ÖºõÄЧ¹û£¬µ«ÊDZØÐë¸øÓè×¢Òâ¡£ÕâЩѡÏî»á¸Ä±äÄãËùÓгÌÐòÖеÄÖ¸ÕëÓïÒâÒåsemantics of pointers¡£Èç¹ûÄã¶ÔÖ¸Õë×öÁËдÌØÊâ´¦Àí£¬Õâ¿ÉÄܻᵼÖÂÎÊÌâ¡£
634 Traits¼¼ÊõÊÇÓÉNathan MyersÔÚC++ Report 1995ÄêJune·¢±íµÄ[[http://www.cantrip.org/traits.html][¡¶Traits:a new and useful template technique¡·]]ÖÐ×îÐÂÌá³öµÄ¡£
635 TraitÀà±£´æһЩӳÉä¹Øϵ£¬½«Ò»Ð©¸ÅÄîÓ³Éäµ½ÁíһЩÉÏÈ¥¡£Äã¿ÉÒÔ´ÓÒÔ϶«Î÷·¢³öÓ³Éä:
637 - ±àÒëÆÚ¼äÒÑÖªµÀµÄÖµ(ÀýÈç³£Êý)
641 ²¢ÇÒ¿ÉÒÔÓ³Éäµ½¼¸ºõËùÓÐÄãÏëÒªµÄ£¨ÀàÐÍ£¬³£Êý£¬ÔËÐÐÆÚ¼ä±äÁ¿£¬º¯Êý)¡£
643 **** 1.8.1 Àý×Ó: average()
644 ¿¼ÂÇÏÂÃæµÄ´úÂ룬Ëü¼ÆËãÒ»¸öÊý×éµÄƽ¾ùÖµ:
648 T average(const*T data,int numElements)
651 for (int i=0;i<numElements;++i)
653 return sum/numElements;
658 Èç¹ûTÊÇÒ»¸ö¸¡µãÊý£¬Ëü»á¹¤×÷µÄºÜºÃ£¬µ«ÊÇÈç¹ûÊÇһϵÄÇé¿ö£¬¾Í²»ºÃ˵ÁË£º
659 - TÊÇÒ»¸öÕûÊý(int,long):¼ÆËãµÄƽ¾ùÖµ¾Í»á±»½Ø¶Ï²¢°´ÕÕÕûÊýÀ´·µ»Ø
660 - TÊÇÒ»¸ö×Ö·û:ÇóºÍ²Ù×÷»áÒç³ö¡£