在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重 量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比 较著名的大型库。
C++各大有名库的介绍——科学计算

1、Blitz++

参考网站:http://www.oonumerics.org/blitz

Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。

Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用 Blitz++所提供的函数来构建。

2、POOMA

参考网站:http://www.codesourcery.com/pooma/pooma

POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达 到最高的效率,方便在工业和研究环境中使用。

3、MTL

参考网站:http://www.osl.iu.edu/research/mtl

Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel 的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。

4、CGAL

参考网站:http://www.cgal.org/

Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。

 

Intel Math Kernel Library
1.基本线形代数运算(BLAS) 向量与向量、向量与矩阵、矩阵与矩阵的运算
2. 稀疏线形代数运算
3.快速傅立叶变换(单精度/双精度)(fftw)
4.LAPACK(求解线形方程组、最小方差、特征值、 Sylvester方程等)
5.向量数学库(VML)
6.向量统计学库(VSL)
7.高级离散傅立叶变换

IMSL
软件名称 IMSL C Numerical Library(不兼容vc6编译器)
程序设计语言 C, Forton, C#, Java
资源网址 http://www.vni.com/
功能概述 分为统计库和数学库两部分. 数学库包含应用数学和特殊函数.IMSL 程序库 - 已成为数值分析解决方案的工业标准。 IMSL 程序库提供最完整与最值得信赖的函数库。 IMSL 数值程序库提供目前世界上最广泛被使用的 IMSL 算法,有超过 370 验证过、最正确与 thread-safe 的数学与统计程序。 IMSL FORTRAN 程序库提供新一代以 FORTRAN 90 为程序库基础的程序,能展现出最佳化的演算法能力应用于多处理器与其它高效能运算系统。

lapack
软件名称 Linear Algebra Package
程序设计语言 Fortran 77
资源网址 http://www.netlib.org/lapack
功能概述 线性代数计算子程序包

lapack++
软件名称 Linear Algebra Package in c++
程序设计语言 c++
资源网 址 http://math.nist.gov/lapack++/
功能概述 c++版的线性代数计算子程序包

BLAS
软件名称 Basic Linear Algebra Subroutines
程序设计语言 Fortran 77
主 要开发者 Kagstrom B. ,Ling P. ,Van Loan C.
资源网址 http://www.netlib.org/blas
功能概述 Blas是执行向量和矩阵运算的子程序集合。

uBLAS
BLAS in C++ with expression templates. 表达式模版形式的 C++中的BLAS ,

gsl
软件名称 GNU Scientific Library (linux)
程序设计语言 C , C++ compable
资源网址 http://www.gnu.org/software/gsl/
功能概述 范围广泛, 包括数值分析的常见内容

Blitz++
软件名称 Blitz++ (不兼容vc6编译器)
资源网址 http://sourceforge.net/project/showfiles.php?group_id=63961
功能概述 The current versions provide dense arrays and vectors, random number generators, and small vectors and matrices.是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像 C++ 一样方便,同时又比 Fortran 速度更快的数值计算环境。通常,用 C++ 所写出的数值程序,比 Fortran 慢 20% 左右,因此Blitz++ 正是要改掉这个缺点。方法是利用 C++ 的 template 技术,程序执行甚至可以比 Fortran 更快。

MTL
软件名称 Matrix Template Library(兼容vc6编译器)
资源网址 http://www.osl.iu.edu/research/mtl/
功能概述 The Matrix Template Library (MTL) is a high-performance generic component library that provides comprehensive linear algebra functionality for a wide variety of matrix formats. MTL专注于线性代数相关的计算任务,如各种形式矩阵的生成(对角,共轭,稀疏,对称等),相关的计算,变换,以及与一维向量的运算。

一、概念判断法

公约数只有1的两个数叫做互质的数。根据互质数的概念。可以对一组数进行判断。如,4和9的公约数只有1,所以它们是互质数。   二、规律判断法

根据互质数的定义,可总结出一些规律,利用这些规律可迅速判断一组数是否互质。

(1)两个不相同的质数一定是互质数。例如,19和13是互质数。

(2)两个连续的自然数一定是互质数。例如,14和15是互质数。

(3)相邻的两个奇数一定是互质数。例如,91和93是互质数

(4)1和其它所有自然数一定是互质数。例如,1和4,1和13等。

(5)两个数中较大数为质数,这两个数一定是互质数。例如16和97是互质数。

(6)两个数中的较小一个是质数,较大数是合数且不是较小数的倍数,这两个数一定是互质数。例如,7和54是互质数。

(7)较大数比较小数的2倍多1或少1,这两个数一定是互质数,例如,13和27是互质数,13和25是互质数。

三、分解判断法

如果两个数都是合数,可先将两个数分别分解质因数,再看两个数是否含有相同的质因数,如果没有,这两个数是互质数。

例如:130和231,先将它们分解质因数:130=2×5×13,231=3×7×11,分解后,发现它们没有相同的质因数,所以130和231 是互质数。

四、求差判断法

如果两个数相差不大。可先求出它们的差,再看差与其中较小数是否互质。如果是互质数,则原来两个数一定是互质数。

例如:194和201,先求出它们的差,201-194=7,因为7和194互质,所以194和201是互质数。

五、求商判断法

用大数除以小数,如果除得的余数与其中较小数互质,则原来两个数是互质数。例如,317和52,317÷52=6……5,因为余数5与52互质,所以 317和52是互质数

本文转载自:http://hi.baidu.com/ll3%BE%AB%C1%E9/blog/item/36f60125ac20632ed507427b.html

Posted in 数学 | Comments(0)»

近日,国外技术博客lbrady.com 发表了一篇非常有意思的博文。文章认为C++语言庞大而复杂,只有那些在c++开发之旅上吃过许多苦头的程序员才能真正的了解C++。显然作者受到一些刺 激,他的博文名称为“永远不要相信那些自称懂C++的程序员(Never trust a programmer who says he knows C++)”。原文如下:

经过一段长时间的面试工作后,我意识到一个非常重要的关于C++的问题,那就是C++是个“严重两极化"的程序语 言。我的意思是:C++是唯一一个完全不同的两类使用者都自称精通,却对它的理解大相径庭的语言。让我用下面这个图示说明。



图注:(自左向右,自上而下,所标文字为各阶段程序员对C++的认知。分 别是:带类的C语言、那些模板报错信息真令人发狂、引用类型太不可捉摸了、到底啥是虚析构函数?这些异常说明符比Java的差、静态对象初始化段错误、我 们需要一些规则。)

一般的程序员(特别有C语言基础的)都可以很快上手C++开发,并且感到挺熟练。如果是这样的程序员说他很懂 C++,那他肯定在撒谎。因为当他继续在C++开发之路走下去时,他就会经历上图下曲线上标注的所有挫折,而后他就会认识到C++是一个多么复杂的语言。 在面试中,这带来了一个优点(至少对面试官而言):很容易辨别哪些是经历过这些挫折,哪些没有。只要你提及C++真是一个变态的复杂语言时,挫折经历后的 同学就会向你抱怨,他们在使用C++时遇到的127个小问题。而没有经历过的同学就会说:“安啦,那不就是带有类的C语言嘛?”(杨东杰编译)

你对C++语言的理解到了哪一步呢?

原文链接:Never trust a programmer who says he knows C++

优秀来自好的习惯。怎样成为优秀的开发人员?图灵公司最近热销的《高效程序员的45个习惯》一书给 出了很好的解答,非常值得一读。

这 本书的英文原版荣获了有软件奥斯卡之称的Jolt生产效率大奖,在Amazon上也是好评如潮。第一作者Venkat Subramaniam博士是Agile Developer公司创始人,敏捷开发方面的权威人士,精通各种开发技术。第二作者Andy Hunt更是大名鼎鼎的人物,是敏捷宣言的创始人,著名图书出版公司Pragmatic Programmers的创始人。他有两本书大家应该都是知道:经典的Ruby教程《Programming Ruby》还有许多开发人员的最爱《程序员修炼之道》。

译者团队则由著名的敏捷咨询公司ThoughtWorks咨询师钱安川和InfoQ中文站敏捷社区首席编辑、《程序员》杂志前 副主编郑柯组成,可以信赖。

值得一提的是,这本书很像《程序员修炼之道》在敏捷时代的续篇。风格和写法都很神似。下面是从书中摘出的45个习惯标题,每个标题下面的文字是我读 此书的笔记摘要。另外,图灵公司还在官方博客上提供了几 个章节免费阅读(下面给出了链接)。

强烈推荐大家将这些打印出来,贴在自己的办公桌旁边的墙上,学习实践。

态度篇

1. 做实事

不要抱怨,发牢骚,指责他人,找出问题所在,想办法解决。对问题和错误,要勇于承担。

2. 欲速则不达

用小聪明、权宜之计解决问题,求快而不顾代码质量,会给项目留下要命的死角。

3. 对事不对人

就事论事,明智、真诚、虚心地讨论问题,提出创新方案。

4. 排除万难,奋勇前进

勇气往往是克服困难的唯一方法。

学习篇

5. 跟踪变化

新技术层出不穷并不可怕。坚持学习新技术,读书,读技术杂志,参加技术活动,与人交流。要多理解新词背后的所以然,把握技术大趋势,将新技术用于产 品开发要谨慎。

6. 对团队投资

打造学习型团队,不断提高兄弟们的平均水平。

7. 懂得丢弃

老的套路和技术,该丢,就得丢。不要固步自封。

8. 打破砂锅问到底

不断追问,真正搞懂问题的本质。为什么?应该成为你的口头禅。

9. 把握开发节奏

控制好时间,养成好习惯,不要加班。

开发流程篇

10. 让客户做决定

让用户在现场,倾听他们的声音,对业务最重要的决策应该让他们说了算。

11. 让设计指导而不是操纵开发

设计是前进的地图,它指引的是方向,而不是目的本身。设计的详略程度应该适当。

12. 合理地使用技术

根据需要而不是其他因素选择技术。对各种技术方案进行严格地追问,真诚面对各种问题。

13. 让应用随时都可以发布

通过善用持续集成和版本管理,你应该随时都能够编译、运行甚至部署应用。

14. 提早集成,频繁集成

集成有风险,要尽早尽量多地集成。

15. 提早实现自动化部署

16. 使用演示获得频繁反馈

17. 使用短迭代,增量发布

18. 固定价格就意味着背叛承诺

估算应该基于实际的工作不断变化。

用户篇

19. 守护天使

自动化单元测试是你的守护天使。

20. 先用它再实现它

测试驱动开发其实是一种设计工具。

21. 不同环境,就有不同问题

要重视多平台问题。

22. 自动验收测试

23. 度量真实的进度

在工作量估算上,不要自欺欺人。

24. 倾听用户的声音

每一声抱怨都隐藏着宝贵的真理。

编程篇

25. 代码要清晰地表达意图免 费样章链接

代码是给人读的,不要耍小聪明。

26. 用代码沟通

注释的艺术。

27. 动态地进行取舍免 费样章链接

记住,没有最佳解决方案。各种目标不可能面面俱到,关注对用户重要的需求。

28. 增量式编程

写一点代码就构建、测试、重构、休息。让代码干净利落。

29. 尽量简单

宁简勿繁。如果没有充足的理由,就不要使用什么模式、原则和特别的技术。

30. 编写内聚的代码

类和组件应该足够小,任务单一。

31. 告知,不要询问

多用消息传递,少用函数调用。

32. 根据契约进行替换

委托往往优于继承。

调试篇

33. 记录问题解决日志免 费样章链接

不要在同一地方摔倒两次。错误是最宝贵的财富。

34. 警告就是错误

忽视编译器的警告可能铸成大错。

35. 对问题各个击破免 费样章链接

分而治之是计算机科学中最重要的思想之一。但是,要从设计和原型阶段就考虑各部分应该能够很好地分离。

36. 报告所有的异常

37. 提供有用的错误信息免 费样章链接

稍微多花一点心思,出错的时候,将给你带来极大便利。

团队协作篇

38. 定期安排会面时间

常开会,开短会。

39. 架构师必须写代码免 费样章链接

不写代码的架构师不是好架构师。好的设计都来自实际编程。编程可以带来深入的理解。

40. 实行代码集体所有制

让开发人员在系统不同区域中不同的模块和任务之间轮岗。

41. 成为指导者

教学相长。分享能提高团队的总体能力。

42. 让大家自己想办法免 费样章链接

指引方向,而不是直接提供解决方案。让每个人都有机会在干中学习。

43. 准备好后再共享代码

不要提交无法编译或者没有通过单元测试的代码!

44. 做代码复查

复查对提高代码质量、减少错误极为重要。

45. 及时通报进展与问题免 费样章链接

主动通报,不要让别人来问你。

1、遇到不想回答的问题,直视对方的眼睛,微笑、沉默。

 

2、走路抬头挺胸,心情不好时,不想跟人招呼,点头微笑,径直走过。

 

3、请记得,好朋友的定义是:你混的好,他打心眼里为你开心;你混的不好,他由衷的为你着急。

 

4、做自己的决定。然后准备好承担后果。从一开始就提醒自己,世上没有后悔药吃,而我永远有个plan B。

 

5、自己分内的事情,努力做到一百分。

 

6、接受自己不过是个“小小的我”,但眼里要能够悦纳“大大的世界”。

 

7、If you love something, set it free, if it comes back to you, it is yours, if it doesn't , it never was.

 

8、不要试图给自己找任何借口,错误面前没人爱听那些借口。

 

9、不要随意发脾气,谁都不欠你的。

 

10、不说谎话,因为总有被拆穿的一天。

 

11、别低估任何人。

 

12、你没那么多观众,别那么累。

 

13、过去的事情可以不忘记,但一定要放下。

 

14、别人说的记在脑袋里,而自己的,则放在心里。

 

15、社会是有等级的,很多事不公平。别抱怨,因为没有用。

 

16、你永远没有你自己想象中那么重要。

 

17、钱能解决的问题统统不叫问题。

 

18、无论何时说“我爱你”,请真心实意。无论何时说“对不起”,请看着对方的眼睛。

 

19、永远不要以貌取人。慢慢地说,但要迅速地想。

 

20、找点时间,单独呆会儿。

 

21、不是自己的东西不要,就是再喜欢也不行,要懂得放弃。

 

22、不要觉得是生活亏欠了你,其实是我做的努力不够。

 

23、努力向前,再努力向前,再努力一下下,愿望就会实现。

 

Posted in 生活 | Comments(1)»

曾任耶鲁大学校长的小贝诺•施密德特,日前在耶鲁大学学报上公开撰文批判中国大学,引起了美国教育界人士对中国大学的激烈争论。

对中国大学近年来久盛不衰的“做大做强”之风,施密德特说:“他们以为社会对出类拔萃的要求只是多:课程多,老师多,学生多,校舍多”。“他们的学者退休的意义就是告别糊口的讲台,极少数人对自己的专业还有兴趣,除非有利可图。他们没有属于自己真正意义上的事业。”“而校长的退休,与官员的退休完全一样,他们必须在退休前利用自己权势为子女谋好出路。”“新中国没有一个教育家,而民国时期的教育家灿若星海。”  

对于通过中国政府或下属机构“排名”、让中国知名大学跻身“世界百强”的做法,施密德特引用基尔克加德的话说,它们在做“自己屋子里的君主”。“他们把经济上的成功当成教育的成功,他们竟然引以为骄傲,这是人类文明史最大的笑话。”  

中国大学近来连续发生师生“血拼”事件,施密德特认为这是大学教育的失败,因为“大学教育解放了人的个性,培养了人的独立精神,它也同时增强了人的集体主义精神,使人更乐意与他人合作,更易于与他人心息相通”,“这种精神应该贯穿于学生之间,师生之间”。“他们计划学术,更是把教研者当鞋匠。难怪他们喜欢自诩为园丁。我们尊重名副其实的园丁,却鄙视一个没有自由思想独立精神的教师。”  

中国大学日益严重的“官本位”体制,施密德特也深感担忧,他痛心地说:“宙斯已被赶出天国,权力主宰一切”。  

“文科的计划学术,更是权力对于思考的祸害,这已经将中国学者全部利诱成犬儒,他们只能内部恶斗。缺乏批评世道的道德勇气。孔孟之乡竟然充斥着一批不敢有理想的学者。令人失望。”施密德特为此嘲笑中国大学“失去了重点,失去了方向,失去了一贯保持的传统”,“课程价值流失,效率低,浪费大”。  

他嘲笑说“很多人还以为自己真的在搞教育,他们参加一些我们会议,我们基本是出于礼貌,他们不获礼遇。”  

由于当前经融危机引发的一系列困难,导致大学生就业难。施密德特对此说,“作为教育要为社会服务的最早倡议者,我要说,我们千万不能忘记大学的学院教育不是为了求职,而是为了生活”。  

他说大学应该“坚持青年必须用文明人的好奇心去接受知识,根本无需回答它是否对公共事业有用,是否切合实际,是否具备社会价值等”,反之大学教育就会偏离“对知识的忠诚”。  

对中国大学的考试作弊、论文抄袭、科研造假等学术腐败,施密德特提出了另一种观察问题的眼光,他说“经验告诉我们,如果政权是腐败的,那么政府部门、社会机构同样会骇人听闻的腐败”。  

他还说“中国这一代教育者不值得尊重,尤其是一些知名的教授。”  

施密德特认为中国大学不存在真正的学术自由,他说中国大学“对政治的适应,对某些人利益的迎合,损害了大学对智力和真理的追求”。  

他提出“大学似乎是孕育自由思想并能最终自由表达思想的最糟糕同时又是最理想的场所”,因此,大学“必须充满历史感”,“必须尊重进化的思想”,“同时,它倾向于把智慧,甚至特别的真理当作一种过程及一种倾向,而不当作供奉于密室、与现实正在发生的难题完全隔绝的一种实体”。他说“一些民办教育,基本是靠人头计算利润的企业。”

Posted in 生活 | Comments(2)»

1、伸伸懒腰,松松骨,每小时都要做!
2
、推下推下推下,每小时推松手筋!
3
、不想变硬颈,得转转转,两边转!
4
、千万千万千万,每小时转转胳膊!
5
、办公坐姿有讲究!
6
、拿鼠标有正确姿势!
7
、记住每小时转转脚松松筋
8
、记住每小时松松手、踢踢腿拉拉筋

Posted in 生活 | Comments(0)»

斐波那契数列(f(n),f(0)=0,f(1)=1,f(2)=1,f(3)=2……)的其他性质:
1.f(0)+f(1)+f(2)+…+f(n)=f(n+2)-1
2.f(1)+f(3)+f(5)+…+f(2n-1)=f(2n)
3.f(2)+f(4)+f(6)+…+f(2n) =f(2n+1)-1
4.[f(0)]^2+[f(1)]^2+…+[f(n)]^2=f(n)·f(n+1)
5.f(0)-f(1)+f(2)-…+(-1)^n·f(n)=(-1)^n·[f(n+1)-f(n)]+1
6.f(m+n)=f(m-1)·f(n-1)+f(m)·f(n)
利用这一点,可以用程序编出时间复杂度仅为O(log n)的程序。
7.[f(n)]^2=(-1)^(n-1)+f(n-1)·f(n+1)
8.f(2n-1)=[f(n)]^2-[f(n-2)]^2
9.3f(n)=f(n+2)+f(n-2)
10.f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) [ n〉m≥-1,且n≥1]


http://baike.baidu.com/view/816.htm

 

Posted in 数学 | Comments(0)»

参加了2009年的图灵赠书活动,获得了五本免费的图书,其中一本就是这里提到的《软件开发沉思录》,这本书很好的从例子上阐述了整个软件开发的相关内容,包括了:多语言、开发,最后一英里,到发布到测试,还涵盖了软件开发过程中的项目管理等,可以说是以实例的形式对软件开发的方方面面进行了阐述,有如一个经验丰富的长者在讲述整个领域。

在看这本书的时候,对自己接触过的内容感触较深,所以建议有软件开发经验的人进行阅读,至于新手也可以看看,相当于了解一些内容吧,但是可能有的东西未必新手能看懂。

总之,这个书是个好书,是一种经验的介绍,是对一种领域的沉思,非常不错,结合自身的经验感触,体验更深更好。

Posted in 生活 | Comments(0)»

HDU ACM 1020 Encoding 三月 23rd, 2010

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1020

这个题目,主要是给出一个由大写字母组成的字符串,然后将连续的相同的多个字母用nX表示,n表示X的个数,X代表任意大写字母,当n=1时,只用X表示即可。故通过一边遍历字符串,一边统计当前字母的个数,当遇到不同时输出,否则计数。

基于上述分析,代码如下:

#include <stdio.h>

int main()

{

char a[10000],c;

int n,i,j;

scanf("%d",&n);

while( n-- )

{

scanf("%s",a);

c = a[0];

j = 1;

for ( i=1; a[i]!= '\0'; i++ )

{

if ( c == a[i] )

{

j++;

}

else

{

if ( j != 1 )

{

printf("%d%c",j,c);

}

else

printf("%c",c);

c = a[i];

j = 1;

}

 

}

if ( j != 1 )

{

printf("%d%c",j,c);

}

else

printf("%c",c);

printf("\n");

}

return 0;

}

Posted in HDU ACM | Comments(0)»