科学网

 找回密码
  注册
科学网 标签 编程 相关日志

tag 标签: 编程

相关日志

lisp/scheme/guile做数值计算
plasmascience 2020-5-28 22:25
lisp/scheme据说是每个程序员在死之前必须要尝试的程序语言,也有人说它是上帝的编程语言。 一般人看到lisp满屏的括弧就放弃了。 我受到RMS的蛊惑, 2015年开始学一点lisp/scheme的东西, 偶尔闲来无事,喜欢捣鼓一点lisp/scheme。 lisp强调递归的重要性,不直接提供循环结构,因为循环可看作递归的一个特例。 lisp是仅次于fortran的第二老程序语言, 主要的强项是写解析器、编译器、符号计算相关的程序,用来做数值计算不是它的强项。 下面是一个二分法求函数的根的一个guile小程序, 纯为练练手, 每次写lisp程序都很快乐 #!/usr/bin/guile !# (define (root_finder f x1 x2) (let ((tmp (/ (+ x1 x2) 2))) (if (= (* (f tmp) (f x1)) 0) (set! x2 tmp) (set! x1 tmp)) (display tmp) (newline) (if ( (abs (- x1 x2)) 0.001) tmp (root_finder f x1 x2) ) ) ) (define (myfun x) (* (- x 1) (- x 2))) (display (root_finder myfun 1.8 2.2)) (newline)
17060 次阅读|0 个评论
学习AI和Python,首先需要快的IDE开发环境
lhj701 2020-1-29 19:53
学习AI和Python,首先需要快的IDE开发环境 从事计算机专业,新技术日新月异,这一波Deep Learning引发的人工智能和机器学习大潮(尤其在计算机视觉和自然语言处理方面获得较大突破),从事计算机的,几乎无一幸免,要紧跟潮流:学习新知识,掌握新技能。 也难怪,从 感知驱动,到数据驱动,再到梦想的知识驱动 ,尽管从机器到人,人类仅仅是稍微移动了一微米的样子,但是,想一想, 上次的微小的移动是:发明计算机和网络 。而从计算上讲,虽然,计算机从诞生之日起(手摇计算算起),就在自动的计算,但多是人为设定的自动,而不具有今天DL、RL等呈现的自动学习和自主适应的能力。 虽说DL的红利也许有挖尽的那天,但至少,这稍微的进步与推动激发了广大科技人员的兴趣和热情。记得上一波如此广泛的影响,好像是对英语学习的热衷和对学习计算机的热衷(计算机刚刚广泛出现的那会, 对学习使用计算机桌面操作系统的热衷 ),伴随着梦想着的出国炙热大潮,比如当年对《新概念英语》及英语学习广泛的热衷。也许,不用几年,AI就如当年的计算机技术,几乎所有的专业和行业,都会进行应用,成为不可或缺的基本技术工具,所以今天不学,未来也许会掉队啊。 显然, 学习AI有诸多的理论基础瓶颈需要克服,但是Learning is by doing对于理解及掌握枯燥、形式抽象单一的数学公式会更好 ,因此学习编程语言及学会编程应用,有一款快的、界面友好的软件太重要了。虽然学习过BASIC、Pascal、C、C++、Java、C#等语言,用过的各种集成编译环境,还是觉得VC 6.0最好用:又快,界面又友好、易用。可惜,VC 6已经老矣,在Win10下成功安装都困难,并且,现在学习AI和ML、DL、RL等,python属于首选,因此,还是要选择新的编译环境。 对于初学者,个人推荐:Sublime Text 3, VS Code (Visual Studio Code)和Anaconda。安装Anaconda,主要是其自动匹配安装集成得好(解决种种版本及多种软件不兼容和N多相关联软件的依赖),如安装Tensorflow等比较省心(当然,有些需要自己单独调配),然后使用Anaconda Prompt(或Anaconda Powershell Prompt)并利用conda install XXX或pip install XXX,包括pytorch 、tensorflow、 gym、 keras、 pandas、 numpy、 matplotlib等轻松搞定,然后将Anaconda安装的环境配置到轻量级的超快Sublime 和VS Code中,就可以学习AI、DL等编程(感觉Sublime比VS Code更快,适合起步学习者,但Sublime对单步调试等支持不好)。此外Anaconda自带的Jupyter notebook也非常实用,现在很多教材随带的code、运行及讲解都喜欢放在开源项目Github上,多数采用网页交互、可视化、多媒体等集成方式,有助于理解和掌握程序,受到学习者的欢迎。 最后值得称赞的是:这些编译环境都支持多种语言,比如C,C++等,因此,完全可以通过熟悉掌握一种编程平台环境,使用多种语言编程,满足不同的需要,这样省去了诸多编译环境平台的频繁转换。 此外,最为重要是:它们快!这让我又升起对VC 6.0的怀念:但毕竟,那是一个逝去的年代!
个人分类: 教育教学|3190 次阅读|0 个评论
[转载]提升MATLAB运行的技巧
dalianwang 2019-6-25 07:14
提升matlab运行的五个技巧: 尽量调用matlab中自带的函数; 少用find函数,以Logical代替; 矩阵连接时,有效使用end; 能用矢量运算的,避免for循环; 提前分配数组大小。
个人分类: 软件学习|1932 次阅读|0 个评论
Python及常用类库最完善的中文文档
bukun 2019-3-29 20:13
Python 3.8中文文档(C语言实现版本) 3.8.0a3 Python是Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。 NumPy 数值计算 v1.16 NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。 Sphinx 文档构建工具 2.0.0b2 Sphinx是一种工具,由Georg Brandl编写并根据BSD许可证授权,它使得创造灵活和美观的文档变得容易。它最初是为 Python文档 而创建。它具有出色的设施,可以记录各种语言的软件项目。 当然,这个站点(文档)也是使用Sphinx从reStructuredText源创建的! Peewee 轻量数据库ORM 3.9.2 Peewee是一种简单而小的ORM。它有很少的(但富有表现力的)概念,使它易于学习和直观的使用。 Pillow 图像处理 5.4.1 Pillow 是一个对 PIL 友好的分支,作者是 Alex Clark 和贡献者。而 PIL 是一个 Python 图像处理库,作者是 Fredrik Lundh 和贡献者. Requests HTTP for Humans v2.21.0 Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!特点:Beautiful is better than ugly.(美丽优于丑陋),Explicit is better than implicit.(清楚优于含糊),Simple is better than complex.(简单优于复杂),Complex is better than complicated.(复杂优于繁琐),Readability counts.(重要的是可读性) Scrapy 应用程序框架 1.6 Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。 Flask Web 开发微框架 1.0.x “micro”并不意味着整个Web应用程序都必须适合于一个单独的python文件(尽管它当然可以),也不意味着flask缺乏功能性。微框架中的“微”意味着Flask的目标是保持核心简单但可扩展。Flask不会为您做很多决定,比如使用什么数据库。它所做的那些决策,例如要使用的模板化引擎,很容易更改。其他一切都取决于你,所以这个瓶子可以是你需要的一切,而不是你不需要的。默认情况下,flask不包括数据库抽象层、表单验证或其他任何可以处理该问题的库。相反,flask支持扩展来向应用程序添加这样的功能,就好像它是在flask本身中实现的一样。许多扩展提供了数据库集成、表单验证、上载处理、各种开放式身份验证技术等等。Flask可能是“微型的”,但它已经准备好生产使用的各种需要。 PyQuery 网页解析库 1.4.1.dev0 pyquery:一个类似jquery的python库.pyquery允许您对XML文档进行jquery查询。API尽可能类似于jquery。PyQuery使用LXML进行快速XML和HTML操作。PyQuery库是一个非常强大又灵活的网页解析库,PyQuery 是 Python 仿照 jQuery 的严格实现。语法与 jQuery 几乎完全相同。 PyCodeStyle 工具 2.5.0 pycodestyle(以前叫pep8)是一个工具,用于根据中的一些样式约定检查您的python代码。特征:插件架构:添加新的检查很容易。可解析输出:跳转到编辑器中的错误位置。小:只有一个python文件,只需要stdlib。为此,您可以只使用pycodestyle.py文件。附带了一个全面的测试套件。 Whoosh 全文检索 2.7.4 whoosh是一个类和函数库,用于索引文本,然后搜索索引。它允许你为你的内容开发定制的搜索引擎。例如,如果您正在创建博客软件,您可以使用whoosh添加搜索功能,允许用户搜索博客条目。 Pygments 语法高亮 2.3.1 这是 Pygments 的家。它是一种通用语法高亮显示工具,适用于代码托管、论坛、维基或其他需要美化源代码的应用程序。亮点是:支持300多种语言和其他文本格式,特别注意提高突出质量的细节。对新语言和格式的支持很容易添加;大多数语言使用简单的基于regex的词法分析机制。有许多输出格式可用,其中包括HTML、RTF、LaTex和ANSI序列,它可用作命令行工具和库,…它甚至能高亮 Perl6! Django 文档中文版 3.0.dev Django是一个开放源代码的Web应用框架,由Python写成。Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。 Tornado 文档中文版 6.1.dev1 Tornado 是一个python web框架和异步网络库,最初开发于 FriendFeed . 通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,使其非常适合 long polling , WebSockets 以及其他需要与每个用户建立长期连接的应用程序。 Pyramid 文档中文版 v1.10.2 Pyramid 是一个小型、快速、实际的python web框架。用 Pyramid 您可以编写非常小的应用程序,而无需了解很多。通过学习更多,您也可以编写非常大的应用程序。 Pyramid 会让你迅速变得富有成效,并与你一起成长。当你的应用程序很小时,它不会阻碍你,当你的应用程序变大时,它也不会妨碍你。其他应用程序框架似乎分为两类:支持“小应用程序”的和为“大应用程序”设计的。 Pyramid Cookbook 中文版 v0.2 Pyramid 专题手册是由 Pyramid 社区成员提供的“专题技巧”的集合。 专题手册是主要 Pyramid 文档的补充材料。 SQLAlchemy 中文版 1.3 SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于Java里Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型。不过,Elixir和declarative等可选插件可以让用户使用声明语法。 Bottle Python Web框架 0.13.dev bottle 是一个轻量级的python web框架, 可以适配各种web服务器,包括python自带的wsgiref(默认),gevent, cherrypy,gunicorn等等。bottle是单文件形式发布,代码量不多,可以用来学习web框架. Sanic 异步框架 19.03.1 Sanic 是一个和类Flask 的基于Python3.5+的web框架,它编写的代码速度特别快。除了像Flask 以外,Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法,编写非阻塞的快速的代码 OpenPyXL 文档中文版 2.6.1 OpenPYXL是一个用于读/写Excel2010 XLSX/XLSM/XLTX/XLTM文件的python库。它的诞生是由于缺少从Python(OfficeOpenXML格式)本地读/写的现有库。作为openpyxl,phpexcel团队的所有荣誉最初都基于phpexcel。 NetworkX 网络分析文档中文版 2.2 NetworkX, Python开发的网络分析类库,用于创建、操作和研究复杂网络的结构、动态和功能。NetworkX提供:研究社会、生物和基础设施网络结构和动态的工具;一种适用于多种应用的标准编程接口和图形实现;为协作性、多学科项目提供快速发展环境;与现有的数值算法和C、C++和FORTRAN代码的接口;能够轻松处理大型非标准数据集。 PyCurl 网络工具文档中文版 7.43.0.2 PyCURL是一个Python接口,它是多协议文件传输库的LIbCURL。类似于URLLIB Python模块,PyCURL可以用来从Python程序获取URL所标识的对象。然而,除了简单的获取,PyCURL公开了LIbCURL的大部分功能,包括:速度-LIbCURL非常快,并且PycURL作为LiCURL之上的薄包装器也是非常快的。PycURL被标榜为比请求快几倍。特性包括多协议支持、SSL、身份验证和代理选项。PyCURL支持大多数LBCURL的回调。多和共享接口。用于网络操作的套接字,允许将PyCURL集成到应用程序的I/O循环中(例如,使用TrnADO)。 BeautifulSoup4 Web解析库 4.7.1 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。 NLTK 自然语言工具包 3.4 NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。它提供了易于使用的接口,通过这些接口可以访问超过50个语料库和词汇资源(如WordNet),还有一套用于分类、标记化、词干标记、解析和语义推理的文本处理库,以及工业级NLP库的封装器和一个活跃的讨论论坛。 Scapy 交互式数据包处理程序 2.4.2 Scapy是一个python程序,它允许用户发送、嗅探、分析和伪造网络包。这种能力允许构建能够探测、扫描或攻击网络的工具。换句话说,scapy是一个强大的交互式数据包处理程序。它能够伪造或解码大量协议的数据包,在线发送,捕获它们,匹配请求和回复,等等。scapy可以轻松处理大多数经典任务,如扫描、跟踪路由、探测、单元测试、攻击或网络发现。它可以替代hping、arpsoof、arp sk、arping、p0f,甚至可以替代nmap、tcpdump和tshark的某些部分。
903 次阅读|0 个评论
苏州码子
热度 4 jiangxun 2019-2-3 09:42
作者:蒋迅 没有想到,这样的题目会是在英文的 论坛 上先看到。在此之前,我从来没有听说过“苏州码子”。据 维基百科 ,“苏州码子”又称花码、草码、菁仔码、番仔码、商码,是一种传统在中国民间流行的数字,产生于中国的苏州,起源自算筹。因为苏州码子容易学习,书写便捷,一串数字能连笔写出(阿拉伯数字就不能),而且写法如同算珠,可以配合算盘使用,所以曾经广泛使用于商业中,在账簿和发票等均有使用。现在这种数字在中国大陆及台湾几近绝迹,但在港澳地区的街市、旧式茶餐厅及中药房偶而仍然可见。在1990年代之前,香港公共小型巴士普遍以此标示车资价钱,现时仍有少数路线仍以此标价。香港小学数学课程中将之称为中国古代数字 或中国数码,并于小学五年级教授有关用法。苏州码子曾被用在英国广播公司电视连续剧《新世纪福尔摩斯》第1季第2集《银行家之死》中的神秘符号,但是误以竖写表达(例如剧集中路边小贩的价钱牌用竖写,实际只用横写)。 其实苏州码子是明码,从一二三四五六七八九数字上,古老沿用另一套精彩的商业暗码: 旦底(一),月心(二),顺边(三),横目(四),扭丑(五), 交头(六),皂脚(七),其尾(八),丸壳(九)。 苏州码子脱胎于中国文化历史上的算筹,也是唯一还在被使用的算筹系统。花码由南宋时期从算筹分化。同算筹一样,花码是一种进十进位制计数系统。与算筹不同的是算筹通常用在数学和工程上,花码通常用在商业领域里,主要用途是速记。程大位的《算法统宗》介绍了苏州码子,称之为“暗马式”和“暗子马数”。苏州码子从明代被苏、杭一带人们采用,在民间流行了数百年后,最终被阿拉伯数字取代其地位。 下面是几个苏州码子的图片: 20世纪初香港两家酒楼给客人的开支清单上可见到苏州码子的使用(香港历史博物馆展品)虽然清单是从右到左直写,但是苏州码子是从左到右横写。 香港街市以苏州码子此标示的价钱(左:每两12元;右:每两15元) 香港莲香居餐牌用苏州码子标示价钱。酒楼职员称以往酒楼餐牌都用毛笔写,写阿拉伯数字不好看,必须写苏州码子才能写出书法美感。 北京民国时期的门牌,门牌号阿拉伯数字和苏州码子并用。图中北京鲁迅旧居的老门牌,上方的阿拉伯数字21,与下方的苏州码子。 根据 知乎 ,国内现在还残存着苏州码子。 《神探夏洛克》里还曾靠它破案 。万一哪天你碰上了,可别说不认识。 我的文字编辑器不能识别苏州码子,我也只好不多讨论。最后想针对苏州码子出一个题:写一个程序将一个正整数转成苏州码子。这道题是在 codegolf.stackexchange.com 上看到的,那上面已经有了用各种语言写的程序了。注意这里的“code golf”(程序高尔夫?) 是指用一行代码来完成。如果你对这样的题目感性趣,这里有许多有趣且具有挑战的题目。
个人分类: 谈数学|24932 次阅读|10 个评论
windows下visual studio以及c编程
richor 2018-10-30 15:00
windows 下 visual studio 的使用: 安装的时候,如果用 c++ ,选择通用 windows 开发 + 使用 c++ 的桌面开发。 https://zhidao.baidu.com/question/1951627826004020948.html 新建项目 - 》 C++ 控制台应用程序 位置,选择默认目录, source/repos ,可更改。 为所选项目创建目录。 出现找不到 float.h 的错误: https://www.zhihu.com/question/57751508 将 sdk 版本从 8.1 改为 10.0 即可。 一定要加 #includepch.h 属于在 vs2015 中新加入的预编译功能: https://docs.microsoft.com/zh-cn/cpp/build/reference/creating-precompiled-header-files#pch-files-in-the-build-process 在此之前,叫 stdafx.h https://stackoverflow.com/questions/51928685/can-i-use-include-pch-h-instead-of-include-stdafx-h-as-my-precompile-heade 在2017之前,使用tmain instead of main. tmain是main的一个包装。 运行程序的时候用 ctrl + F5 , instead F5 如果要运行 main 的通用程序:源文件处,删除 stdafx.cpp 即可。 --- 也可以直接下载 cl.exe 来使用 : https://www.microsoft.com/en-us/download/details.aspx?id=48159 cl 应该是 compile and link 的意思。 很好的 walkthrough: https://msdn.microsoft.com/en-us/library/bb384838.aspx?f=255MSPPError=-2147217396
个人分类: 计算机|2 次阅读|0 个评论
等比数列求和——竟然是一道面试题?
iggcas010 2018-6-21 20:53
什么鬼? 一道高中的数学题都拿来问我? 简直侮辱我的智商! 所以我不回答这个问题, 随你怎么说! 下面本宝宝把这个题怎么写成程序来实现 a为首项,q公比,n是第n项 1、笨方法——常规方法 defmy_sum(a,q,n): s=0 foriinrange(n): s+=a*q**i returns 2、递归方法——麻烦自己去推下公式哈 defmy_sum2(a,q,n): ifn==1: returna else: returnmy_sum2(a,q,n-1)+a*q**(n-1) 3、代入数据 a,q,n=2,3,4 s1=my_sum(a,q,n) print(s1) s2=my_sum2(a,q,n) print(s2) 结果完全正确!至于怎么推导求和公式,自己推哈! 面试到这样的公司也是悲催,公司里面连个高中以上学历的人都没有吗? 这道题到底是考验谁的智商?
3772 次阅读|0 个评论
生信人写程序1. Perl语言模板及配置
woodcorpse 2017-6-24 18:38
科学网对Markdown排版支持较差,对格式不满意的用户请跳转至 CSDN 或 微信 阅读; 如果感觉文章对您有帮助,想继续阅读同类文章,请扫描下方二维码关注“生信宝典”公众号,每天接收最新生物信息学原创文章。只关注宏基因方向的用户请微信搜索“宏基因组”公众号添加。 生物信息领域常用语言 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python/Java..(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准。 生物信息常用语言非常广泛,我常用的有Perl, R, Shell,此外参与网页制作还用过PhP+mySQL,写博客用Markdown。这些其实都是非常小众的语言,如果和计算机专业的人交流,对方可能没听过这些语言。本系列“生信人写程序”主要以Perl为主,并伴随一些零星的R和Shell编程的经验和技巧。对于生信Perl使用人员有个交流和互相提高的平台,让新人少走点弯路。对于没有任何Perl基础强例建议别入坑,想学生信找Python教程吧,不解释看下图。 TIOBE世界编程语言使用排行 我们可以看到世界前三是Java, C, C++,大家都听说过;第四是Python,目前在生领领域有取代Perl地位的趋势,目前Perl列第9(世界十大语言之一)下降一位。R语言的数据分析领域有应用越来越广泛,今年上升两位至14名;Shell由于版本和各类较多,在50-100名间有4种,此语言只建议快速解决小问题,不建议写太长的任务,很容易跨平台不兼容。 总结: 生信常用语言:Shell+R+Python/Perl 世界三大语言:Java, C, C++ 生信语言的排名:Python 4th, Perl 9th, R 16th Perl写作环境模板推荐 很多人三行两行或直接命令行用perl直接解决问题,虽然快,但是不容重用和别人使用。因此,良好的写作环境和模板是效率和专业的体现,即提高自己的代码重用性,也方便交流和他人使用。 编程环境IDE 推荐使用:Editplus 4.0,网上到处都是注册机和序列号,随便用,下载址搜不到可以点链接: http://pan.baidu.com/s/1jHJJ1qe 密码:6xm6。优点是可配置模板,可直接编辑服务器脚本(省略上传步骤),高效的代码调试。 编程模板 是解决常用功能的写作模板,如帮助文档部分(提高代码重用和版本管理,方便其他人使用),命令行参数管理(可读性的命令行是程序的基础),程序运行时间统计(项目时间管理),常用文件读取数据结构样式(方便修改文件输入和输出)等; 下面是实现这样功能的模板: #!/usr/bin/perl -w # 加载时间管理,参数管理,文件名和路径处理的基础包,无须安装 use POSIX qw(strftime) ; use Getopt::Std; use File::Basename; ############################################################################### #命令行参数据的定义和获取,记录程序初始时间,设置参数默认值 #Get the parameter and provide the usage. ############################################################################### my %opts ; getopts( 'i:o:d:h:' , \ %opts ); usage unless ( exists $opts {i} exists $opts {o} ); my $start_time = time ; print strftime( Start time is %Y - %m - %d %H : %M : %S \n , localtime ( time )); print Input file is $opts {i}\nOutput file is $opts {o}\n ; print Database file is $opts {d}\n if defined ( $opts {d} ); $opts {h} = 1 unless defined ( $opts {h} ); ############################################################################### #读入的数据或注释文件,用于与输入文件比较或注释(可选),提供三种方式 #Read the database in memory(opt) ############################################################################### #open DATABASE,$opts{d}; # 1. 散列结构数据库,要求数据文件有唯一ID并且无顺序要求 #my %database; #database in hash #while (DATABASE) { #chomp; #my @tmp=split/\t/; #$database{$tmp }=$tmp ; #} # 2. 数组结构数据库,无唯一ID,但有顺序要求 #my (@tmp1,@tmp2); #database in array #while (DATABASE) { #chomp; #my @tmp=split/\t/; #push @tmp1,$tmp ; #push @tmp2,@tmp ; #} #close DATABASE; # 3. 批量数据文件,读取一批有相似结构的文件 #open a list file #my %list; #my @filelist=glob $opts{i}; #foreach $file(@filelist){ #open DATABASE,$file; #$file=basename($file); #while (DATABASE) { #my @tmp=split/\t/; #$list{$file}{nr}++; #} #close DATABASE; #} ############################################################################### #Main text. ############################################################################### # 正文部分,读取输入文件,列出输入和输入文件的三行作为示例,方便编程处理数据 open INPUT, $opts {i} ; #chrm0 snppos1 ref2 mat_gtyp3 pat_gtyp4 c_gtyp5 phase6 mat_all7 pat_all8 cA9 cC10 cG11 cT12 winning SymCls SymPval BindingSite cnv #1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113 open OUTPUT, $opts {o} ; #chrm snppos ref mat_gtyp pat_gtyp c_gtyp phase mat_all pat_all cA cC cG cT winning SymCls SymPval BindingSite cnv #1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113 my %count ; # h参数用于去除有文件头的行 while ( $opts {h} 0 ) { #filter header INPUT; $opts {h} --; } # 输入和输入处理部分,常用按行读取处理并输入,默认按tab分割数据 while (INPUT) { chomp ; my @tmp = split /\t/ ; print OUTPUT $tmp \t $tmp \n ; } close INPUT; close OUTPUT; ############################################################################### #Record the program running time! # 输出程序运行时间 ############################################################################### my $duration_time = time - $start_time ; print strftime( End time is %Y - %m - %d %H : %M : %S \n , localtime ( time )); print This compute totally consumed $duration_time s\.\n ; ############################################################################### #Scripts usage and about. # 程序的帮助文档,良好的描述是程序重用和共享的基础,也是程序升级和更新的前提 ############################################################################### sub usage { die ( qq! Usage: template.pl -i inpute_file -o output_file -d database -h header num Function: Template for Perl Command: -i inpute file name (Must) -o output file name (Must) -d database file name -h header line number, default 0 Author: Liu Yong-Xin, liuyongxin_bio\ @163 .com, QQ: 42789409 Version: v1. 0 Update: 2017 / 6 / 2 Notes: \n! ) } 模板导入Editplus 将上述代码保存为template.pl,在editplus中选择Tools — Preference — Template — Perl,点击template.pl右边的..按键,选择你自己的template.pl即可,以后选择perl脚本会自己加载该模板。 希望对大家有帮助!
个人分类: 编程|3296 次阅读|0 个评论
R 如何将NetCDF (nc)格式数据分层转存为asc格式
michunrong123 2016-4-16 23:13
###################################################### # This script is used R to read netcdf data # and export to asc # Author: Mcr ####################################################### #nc多层数据没能在GIS中打开,将nc转存为多个asc后可以使用。 rm(list=ls()) library(RNetCDF) library(raster) library(ncdf4) library(lattice) setwd(...) #设定nc数据所在位置路径 my.data-open.nc(TH33.nc, write=FALSE) #打开nc文件 print.nc(my.data) #查看内部属性 #lon-var.get.nc(my.data, lon) #定义经度 #n.longitudes - length(var.get.nc(my.data,lon))#经度单元格个数 lat-var.get.nc(my.data, lat) #定义纬度 #n.latitudes - length(var.get.nc(my.data, lat))#纬度单元格个数 #my.depth-var.get.nc(my.data,depth) #深度, 第三变量 #n.depth - trunc(length(my.depth)) #n.depth r - raster(ncol=7560, nrow=4320,xmn=73, xmx=136, ymn=18, ymx=54) #建立一个空栅格图,7560列,4320行,经度73-136,纬度18-54 ##=================读取输出第1层===================================## TH33_01_tmp-var.get.nc(my.data,TH33,c(1,1,1),c(7560,4320,1))#读取第一层文件 #☆c(1,1,1) 表示c(读取nc栅格图起始单元格的行位置,读取nc栅格图起始单元格的列位置,读取nc栅格图 #起始单元格的层位置) #☆c(7560,4320,1) 表示c(读取nc栅格图单元格总行数,读取nc栅格图单元格总列数,读取nc栅格图层数) TH33_01_tmp-TH33_01_tmp #将列顺序倒置,这与输出图的方向有关。 values(r)-as.vector(TH33_01_tmp) #将数据读并存储到刚才建立的r栅格图中 plot(r,asp=1) #展示r, 注意图的方向 TH33_01-as.data.frame(r) #将r栅格内数据转为data.frame TH33_01 =-9999 #将NA替换为-9999,要不然asc数据读入到GIS会出错。 fileCon-('TH33_01.asc') #最终输出asc文件的文件名 writeLines('ncols\t\t7560\nnrows\t\t4320\t\nxllcorner\t73.00417\nyllcorner\t18.00417\ncellsize\t0.00833\nNODATA_value\t-9999', fileCon) #为要输出的asc文件写上表头,包括列数,行数,起始经度纬度,分辨率和空值数据用-9999表示。 write.table(TH33_01,'TH33_01.asc',append=TRUE,sep= ,row.names=FALSE,col.names=FALSE) #文中代码只输出了七层数据得第一层数据,第i层用c(1,1,i),c(7560,4320,1)。 #输出范围可以通过行列数进行调整,而相应的经纬度也需要调整。 ###文中会有纰漏,请见谅指正。
个人分类: 科研软件|9041 次阅读|0 个评论
[转载]Win32 编程
BoxiongQin 2016-4-1 12:13
看到一个非常好的Win32编程专栏, 专栏地址 ,感谢有这么多优秀的程序员在网络上共享他们的知识和经验。
个人分类: 软件开发|1200 次阅读|0 个评论
[转载]-Control Structures Loops in R-R语言的循环控制结构
xiangxing 2016-3-7 20:34
R语言,循环,控制结构 From: http://www.r-bloggers.com/control-structures-loops-in-r/?utm_source=tuicoolutm_medium=referral As part of Data Science tutorial Series in my previous post I posted on basic data types in R . I have kept the tutorial very simple so that beginners of R programming may takeoff immediately. Please find the online R editor at the end of the post so that you can execute the code on the page itself. In this section we learn about control structures loops used in R. Control strcutures in R contains conditionals, loop statements like any other programming languages. Loops are very important and forms backbone to any programming languages.Before we get into the control structures in R, just type as below in Rstudio : ?control If else statement: #See the code syntax below for if else statement if(x1){ print(x is greater than 1) }else{ print(x is less than 1) } #See the code below for nested if else statement x=10 x=10 if(x1 x7){ print(x is between 1 and 7)}else if(x8 x 15){ print(x is between 8 and 15) } x is between 8 and 15 For loops: As we know for loops are used for iterating items #Below code shows for loop implementation x = c(1,2,3,4,5) for(i in 1:5){ print(x ) } 1 2 3 4 5 While loop : #Below code shows while loop in R x = 2.987 while(x = 4.987) { x = x + 0.987 print(c(x,x-2,x-1)) } 3.974 1.974 2.974 4.961 2.961 3.961 5.948 3.948 4.948 Repeat Loop: The repeat loop is an infinite loop and used in association with a break statement. #Below code shows repeat loop: a = 1 repeat { print(a) a = a+1 if(a 4) break } 1 2 3 4 Break statement: A break statement is used in a loop to stop the iterations and flow the control outside of the loop. #Below code shows break statement: x = 1:10 for (i in x){ if (i == 2){ break } print(i) } 1 Next statement: Next statement enables to skip the current iteration of a loop without terminating it. #Below code shows next statement x = 1: 4 for (i in x) { if (i == 2){ next} print(i) } 1 3 4 Creating a function in R: function() is a built-in R function whose job is to create functions. In the below example function() takes one parameter x, executes a for loop logic. The function object thus created using function() is assigned to a variable (‘words.names’). Now this created function will be called using the variable ‘word.names’ #Below code shows us, how a function is created in R: Syntax: function_name = function(parameters,..){ code} words = c(R, datascience, machinelearning,algorithms,AI) words.names = function(x) { for(name in x){ print(name) } } #Calling the function words.names(words) R datascience machinelearning algorithms AI Hands on exercise of what we have learnt so far We create a data frame DF, run for loop, ifelse in a function and call the function #create 3 vectors name,age,salary name = c(David,John,Mathew) age = c(30,40,50) salary = c(30000,120000,55000) #create a data frame DF by combining the 3 vectors using cbind() function DF = data.frame(cbind(name,Age,salary)) #display DF DF name Age salary 1 David 30 30000 2 John 40 120000 3 Mathew 50 55000 #dimensions of DF dim(DF) 3 3 #write a function which displays the salaried person name findHighSalary = function(df){ Maxsal = 0 empname = for(i in 1:nrow(DF)){ tmpsal = as.numeric(DF ) if(tmpsal Maxsal){ Maxsal = tmpsal empname = DF } } return(as.character(empname)) } #calling the function findHighSalary(DF) Mathew R语言,控制结构,循环
个人分类: 数据生活|1732 次阅读|0 个评论
[转载]SPSS Syntax tutorial
zhangdong 2015-5-18 22:12
Source: http://www.maths.surrey.ac.uk/explore/sivasakthyspages/spss_syntax.html 代码是最好的操作记录,所以即便是可以方便的Drag-and-click如SPSS的软件,也要掌握programming的方法,可大幅减少工作量,提高效率,并降低出错概率。Mark。 SPSS Syntax.pdf
1292 次阅读|0 个评论
你的大脑是用什么基本原理自动编程的?
热度 1 wengjuyang 2015-3-10 22:34
以下文字只是草稿(版本 4.3 ),征求你的评论和反馈,以求对每个人都有用,不论你是否会给计算机编程! ==== 回顾历史,公众对科学的接受步伐总是缓慢的。譬如,查尔斯·达尔文因为顾忌公众的反映等待了大约 20年(从十九世纪30年代到1858年)才发表了他的进化论。直到20年以后(十九世纪70年代)科学界和一般公众的许多人才接受了进化是一个事实。当然,关于进化的争论至今还在持续着。 是不是公众对科学的接受在现代就加快了?不一定如此,虽然我们有了更良好和更快捷的通讯方法。其主要原因还是没有变化,而且是更加剧了 —— 余下了的未解决的科学问题是更复杂而且所需要的知识超出了任何一个人的现有知识范围。 举例来说,脑的类网络计算——联接主义计算——已长期地被工业界质疑和忽略了。深度卷积网至少在 1980年就被提出了。深度卷积网中的最大汇集方法在1992年就已被发表。但是,苹果、百度、谷歌、微软、三星和其它主要相关公司直到2012年后才显示相当兴趣。这是一个约20年的延迟。以上提到的两项技术并不是很难理解。然而,这两项突然火起来了的技术已经被发现了的更根本更有效的脑工作原理证明是已经落后了。此文直观地解释六个脑工作原理。 工业界和学术界的兴趣对两件事的结合很 热心——容易理解的测试和有哪个主要公司在参于。工业界读到了这样的声明:“简单地等到更快的图像处理卡和更大的数据集,我们的结果就会被改进了” ( Krizhevsky et al. NIPS 2012 )。可是,近来被揭示的脑原理已经告诉我们,这些测试的方法只能带来的改进会消失,不会趋于像似人类那样的零误差率,不管 摩尔定律还可以持续多久,也无论在训练数据集合内加了多少静态图像。为什么? 这是因为这样的静态训练集 阻碍 参加者考虑自主目标分割的问题。 人类婴儿脑子里的神经元是通过婴儿与实际物理世界的交互来学习目标分割的。 是不是我们的工业界和公众再需要一个 20年?或更久? 在另一方面,神经科学领域和神经心理学领域已经通过提供实验数据而取得了很多进展 (如, Felleman Van Essen, Cerebral Cortex 1991 )。然而,众所周知,这些领域是数据多但理论弱。这些领域里研究者们只使用局部工具(如吸子模型),所以被脑的丰富现象(如线路和行为)所 压倒。 他们缺乏计算机科学的整体性的自动机理论的指导。其部分原因是过去的自动机的网络模型不是自然地涌现的。举例说,神经元的多选择性( 如 , X. -J.Wang et al. Nature 2013 ) 过去分析得很少但被广泛地观察到。但这 神经元的多选择性 已经被在发育网内的图灵机在理论上完备地解释了。这种新的图灵机中 神经元的 多 选择性是由涌现了的漂亮的线路造成的,但每个神经元还是用一个它的高维而动态的输入空间里的简单的内积相似性。 2011年10月一位很受人尊敬的多学科教授慈善地写道:“我告诫这些研究生,他们能从事脑的研究而干好科学。或者从事机器人的研究而干好工程。然而,如果他们试图同时两项都从事,其结果必然既不是好科学也不是好工程。”工业界和公众需要多久才能接受这个对脑的悲观看法在当时就已经不再正确了呢? 已经被揭示的脑原理可能给多个方面带来一系列根本的变化,包括人类生活的方法,国家和团体的组织方法,我们的工业,我们的经济,以及人类是如何互相对待的。 已知的人脑的原理告诉我们, 任何人的大脑,无论他的教育和经验如何,是根本性地短视的。在空间和时间上都是如此。 海特( J. Haidt ) 教授在他的专著《 自以为是的心灵: 为什么政治和宗教分裂好人群 》对这种短视有很好的证明,虽然这种证明不是通过脑计算的语言。 用脑计算的语言来讲,你的脑子里的精准的线路是漂亮地自主地连接成的。怎样连接由你的实时经验来决定,而基因组只是起一个调理的作用。脑抽象所需要的各种不变性也是主要地取决于实时经验。血清素(譬如由威胁产生), 多巴胺( 譬如由赞扬产生 ) 和其它神经递质快速地加偏向于这些线路,而使更长期的想法在竞争中失去发放的机会。并且这些偏向有长期作用。所以,你犯了长期性的错误但你还是感到你是对的。每个人都是如此。由于经历的不同,短视的内容会不同。 从传统的观点出发,许多领域的专家认为计算机和脑好像用了很不同的原理。 已用数学证明了的在发育网内自然地涌现的图林机( J. Weng ,“ 脑作为一个涌现有限自动机:一个理论和三个定理 ” IJIS , 2015)应该改变我们的直觉。这新结果提出了以下六个脑原理: 1、发育程序(类似基因组,非指定任务)调理一个非指定任务的 “ 脑 ” 网络 ---发育网---的发育(终身学习)。原则上,发育网是通用的,具备学习任何任务的能力,只要肢体干得了。 2、大脑中的图像是自然感知到的由很多物体混合在一起的杂乱场景。在典型的机器训练中(譬如, Krizhevsky et al. NIPS2012 ),每个训练图像有一个划分边框框出要学习的物体。而一个人类孩子不是这样。发育网自己学习物体分割。 3、大脑的肌肉具有很多子区域,每个子区域或代表陈述性知识(抽象概念,如位置、类型、大小等),或代表非陈述性知识(如驾驶汽车或骑自行车)。 4、在物理世界的每个脑至少是一个在发育网里的超图灵机。在这个网里的每个区域(不是静止存在的,见 M. Sur et al. Nature 2000 和 P. Voss, Frontiers in Psychology 2013 )使用一个统一的区域函数。这个区域函数是非线性的,但不会出现局部极小,和工程的直观相反。 5、脑的发育网的学习是增量式的 —— 即每个时刻采用一个“感知 -运动 ” 模板对来更新 “ 大脑 ” ,随后立即将其丢弃。换言之,真正的大脑只有一对立体视网膜,不能储存一对以上的图像。 6、脑的发育网总是最优的 —— 每个网络更新计算 “ 大脑 ” 的最大似然估计,基于有限的计算资源及出生后至今的有限学习经历这两个条件。 脑的逻辑完备性(部分,不是全部)可以从在发育网里的通用图灵机来理解。 通用图灵机在原则上类似于我们的现代计算机。这个自动机脑模型指出每个大脑都是一个自动机,但是又区别于传统的符号自动机,因为自动机脑模型实现自我编程 —— 即涌现。传统的图灵机都无法自己编程,但是脑图灵机可以。 自动机脑模型已经预测了脑线路动态地、精确地记录来自经验的统计量。这和神经解剖学实验大致一致(见 Felleman Van Essen, Cerebral Cortex ,1991 )。作为特例,该模型预测了“ ’ 人 ’ 和 ’ 车辆 ’ 之间的注意转移会极大地改变所有分类在大脑中的表达 ” ( J. Gallant et al. Nature Neuroscience , 2013 ),并且人类的注意力 “ 会调节其内侧颞叶中神经元的活动 ” ( C.Koch et al. Nature , 2010 )。关于位置细胞的工作获得了 2014年诺贝尔生理学和医学奖。该工作暗指神经元只对自下而上的信息(位置)进行编码。自动机脑模型对该观点提出了挑战:神经元对自下而上的内容(譬如位置)和自上而下的内容(譬如目的)均进行编码,正如 Koch et al. 和 Gallant et al. 所报道的那样。 遗憾 的是,自动机脑模型意味着所有的神经科学家和神经网络研究人员们在没有得到严格的自动机理论训练时,是无法理解他们所研究的脑的。例如,传统的神经系统模型和传统的神经网络专注于对模式的识别,但却不具备一个接地符号系统应该具备的功能( 如 “ 规则式地组合和再组合 ,” StevanHarnad, Physica D, 1990 )。自动机理论就具备这样的功能。该新观点是否让我们的学生和研究人员们感到震惊,还是可以指引他们把时间花在更加有意义的事件上? 理解脑自动机可以帮助我们找到许多重要问题的答案,其中一些将在下面列出。 自动机脑模型预言:任何大脑中都没有绝对的对或错,但其环境经验会对大脑进行连接和再连接。我们在此仅仅提出问题,并不给出是或者否的答案。 我们的工业界和公众如何才能意识到理解大脑的大门已经向其敞开?人们如何才能看到这带给他们的经济前景? 我们的教育系统应该如何进行改革来迎接新的脑时代?我们的政府是否对该来自自然的现代召唤做出了迅速并正确的回应? 我们年轻的一代面对展现在他们眼前的此次机遇应该如何行动?当前狭义的学位对其职业生涯真的足够吗? 每个人应该如何好好利用有关其自身大脑的新知识,从而使其职业生涯更加成功呢?这包括政治家、官员、教育者、律师、企业家、医师、技术员、艺术家、工人、司机、和其他任何脑力和体力工作者。 无论他们身处世界的那个角落和干什么。我们每个人都受同样的脑原理支配。每个人的大脑自动编程。
5452 次阅读|2 个评论
Fortran与C#混合编程的一些思考
T573029173 2014-11-6 13:10
Fortran 与 C# 混合编程 Fortran 语言是世界上最早出现的、比较底层的计算机数值计算高级程序设计语言,较高层的程序设计语言,它具有实现精度高、计算速度快的功能特点,且其自身就拥有非常强大的程序集和计算类的数据结构,因此广泛应用于数值、科学和工程计算领域。但是 Fortran 语言的图形界面开发功能较弱,不适合开发独立的桌面或 Web 应用程序。 C# 是最近几年微软推出的新一代面向对象的界面开发语言,它以强大的 .NET 底层框架为基础,拥有十分强大的图形化界面开发平台。 C# 程序设计以 C 和 C++ 入门,在保留 C++ 设计灵活性的基础上,加入了 VB 的快速开发,因此十分适合图形界面的交互系统快速开发。然而,由于 .NET 采用的是托管机制,使得 C# 语言的计算速度、精度以及执行效率相对来说不是很理想。 因此,本文设想:能否在开发一个系统的时候将系统的工程计算部分和项目组织部分分开实现?将计算部分用数据精度高、计算速度快、执行效率高的 Fortran 语言实现,将项目组织部分用快速、高效的 C# 图形化用户设计语言。如此,在开发交互式解释系统软件时,可以采用 C# 与 Fortran 混合编程,这样既可以发挥 C# 的高效开发特点,又使得现有的经典 Fortran 计算程序可以得到充分利用。本文主要从混合编程的实现方面阐述了一些常用的方法和要点。 混合编程,是指利用两种或两种以上的程序设计语言组合起来的程序设计开发,彼此互相调用,传递参数,共享数据结构或数据信息,从而形成一个统一的程序系统的过程。利用 Fortran 语言和 C# 语言进行混合编程是为了能够更充分地发挥两种语言各自的特点,其基本思路如下: 运用 Fortran 语言编写动态链接库 ( DLL ) ,在 DLL 中提供计算的函数接口,然后在 C# 中调用该 DLL 中计算部分的函数,实现计算过程。这里需要注意的是,由于我们使用的是 Fortran 编译器,生成的 DLL 属于第三方非托管 DLL ,因此无法直接在程序中添加 DLL 的引用。 1. 混合编程的基本步骤 1.1 创建 Fortran 动态链接库 DLL STEP1 : 进入到 FORTRAN 集成开发环境下,依次打开 File | New | Fortran Dynamic Link Library ,为新的动态库命名如 : FORTRAN.DLL STEP2 : 使用 Ctrl + N 快捷方式,添加文件 Free Format 的 *.f90 子程序作为当前工作空间。 STEP3 :Fortran 建立动态链接库是使用子函数形式的,我们推荐是用 SUBROUTINE 而避免使用 FUNCTION. 同时要记得使用编译为 DLL 的注释性命名 : !DEC$ ATTRIBUTES DLLEXPORT :: FORDLL STEP4 : 当完成 DLL 的程序设计以后,编译生成 DLL 文件。进入工程文件中的 Bin/Debug 目录,便能找到该 DLL 库文件。 1.2 C# 调用 Fortran DLL 的过程 准备工作 : (1) 将 Fortran 生成的 DLL 文件拷贝至 C# 工程文件的 bin/Debug 目录下,目的是确保可执行程序 (exe 文件 ) 与库文件 (dll 文件 ) 在同一文件夹中,便于 Windows 自动查找 DLL 文件。当然这里除了手动拷贝 DLL 到 C# 的工程目录下外,还可以使用 脚本程序 让开发工具来完成。 (2) 在进行 Dll Import 连接之前,需要在 C# 中 增加 对动态连接库操作的类的 引用 : Using System.Runtime.Interopservices; 完成相关的连接设置就可以在 C# 程序中使用 Fortran DLL 中的子例程了。 C# 调用动态链接库的参数设置是使用 Dll Import 属性 来实现。然后使用一个 实例来装载传递过来的子例程和相应的参数 。 Example: // 通过 DLL Import 属性来设置调用 DLL 文件的参数。 public staticextern void FORDLL() // 使用一个具体的实例来装载从 Fortran 编译的 DLL 文件传递过来的子例程和相应的参数。 DllImport 的命名参数 : l CallingConvention 指示入口点的调用约定。如果未有指定 , 则使用默认值 : CallingConvention.Winapi l CharSet 指示用在入口点中字符集,默认为 CharSet.Auto l EntryPoint 给出 DLL 中入口点的函数名称。若未指定,则使用方法本身的名称。 l ExactSpelling 指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配。默认为 False l PreserveSig 指示方法的签名被保留还是被转换。当签名被转换时,它被转换为一个具有 HRESULT 返回值和该返回该值的一个名为 retval 的附加输出参数的签名。默认值为 True 。 l SetLastError 指示方法是否保留 Win32 上一错误 ,默认为 False 。 FORDLL 修饰符说明 : l public 用来说明这个函数是公用的,可以在程序中的其它地方访问它 ; l static 则表示这个函数是静态的,即 C# 在调用的时候不会传递参数外的其它信息 ; l extern 则表示这个函数由程序以外的模块实现 ; l void 代表函数的返回类型,这个视情况而定。 2. 混合编程的关键技术 混合编程时,要注意调用程序与被调用程序遵守相同的规则,包括语言约定的一致性和数据处理的相容性等接口问题。 2.1 语言约定一致 1 函数名命名约定。 相互匹配的标识符在编程过程中应处理成一致的,因为不同语言的编译器智能机械的按本语言的命名约定进行处理。 C# 语言的符号名是区分大小写的, Fortran 语言中不存在符合名大小写的问题,在 Fortran 编译器中,默认的导出函数名是纯大写形式,两者如果处理不一致则导致程序连接失败。 而在 C# 中调用 Fortran Dll 时,必须指定与 Fortran 中的函数名一致。在 Fortran 代码中的解决办法是: ① Fortran 的缺省方式使符号名在 OBJ 文件中变成大写,如果在 C# 中调用一个使用 Fortran 缺省的子例程时,在 C# 中需用一个纯大写的函数名称来调用; DOUBLE PRECISION FUNCTION ADD (A, B) !DEC$ ATTRIBUTES DLLEXPORT:: ADD DOUBLE PRECISION A, B ADD =A + B END 纯大写 —— 对应的 C# 声明为: private static extern double ADD ( double A, double B); ② 如果想在 C# 中使用小写声明 Fortran 中的子例程,则应该在 Fortran 程序中需用 C 和 STDCALL 属性将所有名称转换为纯小写的形式 ; ③ 若是在 C# 中调用一个例程以大小写混合形式出现的时候,需要使用 Fortran 的 ALIAS 属性来解决混合形式之间的命名冲突。 Double Precision Function ADD (A, B) ! DEC$ATTRIBUTES DLLEXPORT :: ADD ! DEC$ATTRIBUTES ALIAS: 'Add' :: Add Double Precision A, B Add = A + B End 大小写混合 —— 对应的 C# 声明为: private static extern double Add ( double A, double B); ④ C# 中提供的解决方案是,通过使用 Dlllmport 的 EntryPoint 属性,指定 Fortran 的导出函数名。 例如: DOUBLE PRECISION FUNCTION ADD (A, B) !DEC$ATTRIBUTES DLLEXPORT :: ADD DOUBLE PRECISION A, B ADD = A + B END 对应的 C# 声明为: private static extern double ADD( double A, double B); 2 堆栈管理约定。 C# 语言在 windows 平台上的调用模式默认为 StdCall 模式,既由被调用方清理堆栈。而 Fortran 语言则默认由调用方清除。 所有涉及堆栈这样一种数据结构的参数,调用例程 (C#) 和被调用例程 (Fortran) 必须统一调用双方的堆栈清除方式才能保证 2 种语言间的正常函数调用 。因此, 堆栈管理约定包括 : 在调用过程中子例程接受参数的数目和顺序,调用完成后由哪一方来清理堆栈等 。这一约定在 Fortran 语言或 C# 语言中均可以采取措施进行统一。 1 ) 在 Fortran 语言中可以通过编译指令 “ !DEC$ ” 后的可选项 “ C ” 或 “ STDCALL ” 参数来实现: l STDCALL 模式 指定由被调用方清除堆栈。 l C 模式 声明由主调用函数清除堆栈( 但在传递数组和字符串参数时不能用此方法 )。 2 ) 如果在 C# 语言内做改动,则需要在 DllImport 属性中设置 CallingConvention 字段的值为 Cdecl (表示由主调用方清理堆栈)或 StdCall (表示由被调用方清理堆栈)。 堆栈清理方式 程序语言 调用方清理 被调用方清理 C# Cdecl 模式 StdCall 模式 (C# 默认 ) FORTRAN C 模式 STDCALL 模式 3 参数传递约定。 只有以同样的方式发送和接收参数,才能获得正确的数据传送和正确的程序结果。常见的参数传递为 值传递和引用传递 两种。 C# 默认的是值传递,而 Fortran 默认的是引用传递, 因此在混合编程过程中应注意保持传递方式的一致性。 1) 若统一为引用传递,在 Fortran 中无需做任何修改,因为 Fortran 默认的就是引用传递类型;而只需将 C# 的参数类型定义为引用类型,此时需 使用 ref 关键字 。 public static extern voidFORDLL(ref int m); // 通过 ref 将整形参数 m 被定义为引用传递 2) 若统一为值传递类型,在 C# 中无需做任何修改,因为 C# 中默认的就是值传递类型;而只需将 Fortran 的参数定义为值类型,此时 使用 VALUE 关键字。 !DEC$ ATTRIBUTES VALUE:: m ! 使用 VALUE 将 m 定义为值传递方式 若传递过程中既有值类型,也有引用类型,则为上面的两种综合使用, Fortran 中使用引用为 REFERENCE 。 !DEC$ ATTRIBUTES REFERENCE:: m ! 使用 REFERENCEE 将 m 定义为引用传递方式 2.2 数据类型一致 在 Fortran 中常用的数据参数类型有: REAL , INTEGER , DOUBLEPRECISION 。 REAL: 表示浮点数据类型,即小数,等价于 C# 的 float 。 INTEGER: 表示整数类型,相当于 C# 的 int 数据类型。 DOUBLEPRECISION: 表示双精度数据类型,相当于 C# 的 double 数据类型。 在 C# 调用 Fortran DLL 是必须保证参数的一致性,例如在 Fortran 中变量定义的是 REAL 类型,而我们传入的是 Double, 那么就会出现计算错误。 数据传递也就是涉及基本的数值传递和字符串的传递,其中 数值传递又包括单值型数据和数组型的数据。 1 数值传递。 满足好引用类型就基本可以实现,但是在传递数组的时候要特别注意: C# 的数组是从 0 开始记录的,而 Fortran 则是从 1 开始记录; 另外, C# 采用的是按行存放,而 Fortran 则为按列存放。在传递时应详细考虑数组问题。 例如在 Fortran 中的 A 数组,在 C# 中就应为 A 。 并且数组传递还应注意,只需要传递数组的首地址即可, DLL 需要的是数组的起始位置。 int ; FORDLL(ref bb ); 2 字符串传递。 传递和返回字符串是混合编程中最为复杂,也是需要考虑问题最多的部分。 C# 和 Fortran 的字符串传递同样麻烦,首先, C# 中的字符串是双字节的 Unicode 类型,而 Fortran 中默认的是单字节的 Ansi 类型。 这样产生的问题是 C# 会自动把 Fortran 的每两个字符合并为一个字符, Fortran 中的 128 个字符的字符串变成了 C# 中的 64 个字符的垃圾。另外, C# 和 Fortran 关于字符串的表示方式也有所不同: C# 的字符串表示方式与 C 语言相同,使用 \0 表示字符串的结束; Fortran 中则采用在最右端添加空格表示,并在最右端使用一个隐藏的参数表示实际的长度, 因此要正确的传递字符串,应该解决如何正确表达字符串长度的问题。 解决方案 1: 原理很简单,就是避免直接的进行不同类型的字符串传递,换用整型数组传递。 C# 中的字符串传向 FORTRAN 的具体操作流程如下: step1: 在 C# 中将字符串分割为字符数组; step2: 再将字符数组转为 ASCII 码数组 (0~128 的整数 ) ,然后传递给 FORTRAN ; step3: 在 FORTRAN 中利用 CHAR() 函数将 ASCII 码还原为字符串即可。 NOTE: FORTRAN 传向 C# 也是可以采用相同的思路进行 --------------------------------------------------------------------- // C# 中的字符串分割,并转存为 ASCII 码数组 String c = abcdefg ; ASCIIEncoding ascii = new ASCIIEncoding (); int ; for ( int i = 0; i c.Length; i++) { num = ( int )ascii.GetBytes(c) ; // 通过 ASCIIEncoding 类的对象调用 GetBytes 方法将字符串转变成字符,然后将字符转变成 8 位的 Byte 类型,再将 Byte 类型转变成 int 类型。 } int m = c.Length; S( ref num , ref m); // 在 C# 中使用 ref 关键字,表示参数传递时使用引用类型 --------------------------------------------------------------------- //C# 调用 DLL 声明及操作 //DLL 程序在 C# 代码中的入口点 public static extern void S( ref int ka, ref int m); // 使用一个具体实例 S 来装载传递过来的子例程和相应的参数。 // 参数说明 :ka 为 ASCII 码数组名 ; m 为 ka 数组大小 ( 即字符串长度 ) ---------------------------------------------------------------------- !FORTRAN 中还原字符串的操作 SUBROUTINE S(ka, m) !DEC$ ATTRIBUTESDLLEXPORT :: S CHARACTER(m)::str DIMENSION ka(m) INTEGER i INTEGER x, y DO i=1, m str(i : i) = char(ka(i)) END DO END ----------------------------------------------------------------------- 解决方案 2: 根据 Compaq Visual Fortran Version 6.6 随机帮助文件中的 Programmer's Guide - Creating Fortran DLLs - Programming withMixed Languages 和 Language Reference - A to Z Reference - A toB - ATTRIBUTES 等相关部分的内容做出的一个测试例程,用来说明 C# 调用 Fortran DLL 过程中参数传入 Fortran 的实现(只涉及到了数值类型和字符及字符串类型,其它类型读者可以继续到帮助中阅读相关资料)。 ! FortranDLL.f90 文件的内容如下: ! 用来建立 DLL 项目 ! 函数 WTSTR(Str) 用来建立 Str 文件并在该文件里记录 Str 字符串的内容 SUBROUTINE writestr(str) !DEC$ ATTRIBUTESDLLEXPORT,ALIAS:'WTSTR':: Writestr Character*(*) str Open(1, file = str) Write(1,*) str END SUBROUTINE writestr ! 函数 Iadd2(A,B) 用来就算两个整型数 A 、 B 的和并将结果输出到屏幕 SUBROUTINE iadd2(a, b) !DEC$ ATTRIBUTES C, DLLEXPORT, ALIAS: 'Iadd2' :: Iadd2 INTEGER :: a, b INTEGER :: sum sum = a + b WRITE(*,*) The sum:,sum, in DLL iadd2 END SUBROUTINE iadd2 ! 上述 Iadd2 函数中用来 C 属性字段,是用来说明参数是按值来传送的,而在 WTSTR 函数中因为是 ! 用来传递字符类型的,所以不能用 “C” 。( If C or STDCALL is specified for a subprogram, !arguments(exceptfor array sand characters)are passed by value. ) //C# 中的调用代码如下: // 这部分代码将编译生成 .EXE 可执行程序,调用上面的 DLL using System; using System.Runtime.InteropServices; namespace CCallDll { class Program { //WTSTR 函数说明部分,注意此处字符串参数的传递 public static extern voidWTSTR(string str,int strlength); //Iadd2 函数说明部分 // 两种类型的参数传递涉及到在 Fortran 程序中的处理也不一样 public static extern void Iadd2(inta, int b); // 主程序入口 static void Main(string[] args) { //Delcare the String Variable. Notice: it'sUnicode which occupies 2 Bytes string unicodeString=This.txt; Console.WriteLine(Originalstring is:{0},unicodeString); Console.WriteLine(The lengthof the string:{0},unicodeString.Length); //Call the Function of WTSTR(,) 此处增加了一个表示字符串长度的参数是因为 //Fortran 、和 C #存贮字符串的方法不一样 ( 详情查阅相关资料,有很多介绍 ) WTSTR(unicodeString, unicodeString.Length); Iadd2(1000,10); } } }
8092 次阅读|0 个评论
行香子·细胞核重新编程
热度 1 kongmoon 2014-10-30 08:00
韭菜茬茬,随刈随更 。 手足断、何日新增。 再生之任,干细胞承。 叹既分化,难分裂,拒分生。 廉颇虽老,基因可塑,巧雕琢、干细胞萌。 器官再造,健体重逢。 看破重修,损重建,断重横。 2012 年 10 月 8 日,瑞典诺贝尔奖评审团宣布,日本科学家山中伸弥 (Shinya Yamanaka) 与英国科学家约翰 • 格登 (John Gurdon) 因在细胞核重新编程研究领域的杰出贡献,获得 2012 年诺贝尔生理学或医学奖。   细胞核重新编程就是让一个已经高度分化的细胞能变回像干细胞一样,能分化出各种器官组织,给自体器官移植提供一条可行之路。例如我们的头手心肝都来自同一个受精卵,他们的细胞核里面的基因是一样的,但为什么细胞形态各有千秋呢?原来细胞的基因有一种选择性表达的特点。高度分化的细胞如神经细胞里的基因只表达出与神经相关的功能,而分化程度低的干细胞却能表达多个基因,从而变成其他细胞,例如造血干细胞能变成红细胞、白细胞、 T 细胞等。   分化程度低的细胞保持着旺盛的分裂能力,如韭菜、壁虎尾巴等,而细胞高度分化以后失去了分裂能力,就不能再变成其他的器官组织,如高等动物的手足等。但细胞核里面的基因还是完整的,基因工作起来就像电脑程序一样,按部就班严格表达,通过一定的技术手段影响它,改变表达途径,就有可能让这些高度分化的细胞回到干细胞的状态,诱导形成所需的器官组织。 诱导多能干细胞简称 iPS 细胞( induced pluripotent stem cells, iPS cells ),最初是日本科学家 山中伸弥 ( Shinya Yamanaka )于 2006 年利用 病毒载体 将四个 转录因子 ( Oct4, Sox2, Klf4 和 c-Myc )的组合转入分化的体细胞中,使其 重编程 而得到的类似 胚胎干细胞 的一种细胞类型,后来世界各地不同科学家陆续发现其它方法同样也可以制造这种细胞。但是目前 iPS 技术还无法克服 iPS 细胞容易癌变的缺陷,相信人类总会解决这一问题,实现器官再造健体重逢这一目标。
个人分类: 生物|3248 次阅读|0 个评论
karel机器人JAVA配置
热度 1 zhaiyujia2013 2014-6-7 14:12
Lesson 1 ——JAVA编程基础,配置karel机器人 Karel是一门面向初学者的教学编程语言,由Richard E. Pattis在他的书《Karel The Robot: A Gentle Introduction to the Art of Programming》中提出。Pattis在他斯坦福大学的课堂上使用这门语言。这门语言根据Karel Čapeka——一位最早提出Robot一词的捷克作家来命名。 一个Karel程序用于控制一个名为Karel的简单机器人,它生活在一个由街道(左右方向)和渠道(上下方向)所组成的网格环境中。Karel能理解5种基本的指令:move(Karel向它面对的方向移动一格),turnleft(Karel向左转90°),putbeeper(Karel在它所处的格子中放置一个报警器),pickbeeper(Karel将它所处格子中的报警器捡走),以及turnoff(Karel将自己关机,程序结束)。 对Karel机器人的操作能够帮助我们对面向对象的编程有建立过程化编程的思想基础,对于不了解计算机编程原理和编程操作的新手,Karel是一个不错的入门工具,参考斯坦福大学《编程方法学》的介绍。 karel机器人的配置过程如下。 1.安装eclipse,要用karel机器人,就要安装stanford定制版的eclipse。但Stanford定制eclipse的下载地址不接受校外访问,我们采用迂回战术,自己封装制作可以运行Karel的eclipse。主要针对windows用户。 Eclipse 是一个开放 源代码 的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。下载地址: http://www.eclipse.org/downloads/packages/eclipse-standard-432/keplersr2 默认安装到C:\eclipse下,推荐安装到这里,也可以根据个人喜好调整。 用户根据自己的电脑系统选择32位/64位,下载安装。如不能下载,提供备用地址:百度网盘 http://pan.baidu.com/s/1qW8rDZu (本课程所有资料均可从网盘相应文件夹内下载) 2.安装JDK/JRE,具体什么功能以后解释,有的eclipse带有JDK文件不需要重新安装,有的没有,而Myeclipse则带有JDK,不需要安装,这里先不管,以防万一,安装JRE吧,下载地址: http://pan.baidu.com/s/1kTLteQz 3.将普通版eclipse变成 Stanford版 Eclipse。下载文件eclipse-plugin, http://pan.baidu.com/s/1dDpHn6T 解压之后将Eclipse Plugin文件夹下的内容复制到\eclipse\plugins文件夹下,运行eclipse,你的Stanford版eclipse就有了~! 与传统eclipse不同的点在于,Stanford版eclipse增加了图中红色的两部分工具条。 4.配置Karel机器人,下载Karel源文件。下载地址:http://pan.baidu.com/s/1kTBjJmv 解压文件后,将文件导入eclipse。通过Stanford Menu-Import Project或是 导入文件,在弹出的对话框中选择Keral源程序所在文件夹,这是是Assignment1。点击Finish完成导入。 点击工具栏中快速奔跑的小人 ,keral这个小傻瓜就在自己的世界里开始旅行了!跑起来跑起来~ 安装过程中注意的几个问题及解决方案: 首先,大部分讲解JAVA语言的教程,首先就是教我们如何配置JAVA环境,而eclipse自身可以探测JAVA的安装路径,也就是说不需要我们去配置JAVA的path呀,Classpath呀等等,但往往因为系统不同的原因,会出现很多问题,这里我们常见的问题有这样一个,就是eclipse探测不到你安装了JAVA,无法运行,解决方法就是,打开eclipse下面的eclipse.ini文件,输入两句话,-vm,换行输入java/jdk文件中bin所在的路径。 如图所示 其次,额,其次发生了再说吧~
个人分类: Java编程基础|5399 次阅读|1 个评论
vim中设置字体
xiaowangsun 2014-4-6 15:52
我是在windows下用的Gvim的,先在菜单选择--编辑--选择字体,选好适合的字体,我选的是大小为小四的Luncida Console,Luncida Console 是一种等宽字体,用在编程中比较方便。 然后再vim的一般模式,通过输入: : set guifont 查看字体的详情,我的vim显示为: guifont=Lucida_Console:h12:cANSI 其中的h12表示小四的磅数,我还不知道“cANSI”表示什么,后边查查。 在配置文件_vimrc中添加语句: set guifont=Lucida_Consola:h12:cANSI 保存一下,重启vim,搞定! 注意 : vim的_vimrc文件必须用管理员身份修改,游客只能查看。
个人分类: vim|11333 次阅读|0 个评论
什么是最好的编程语言?(怎样才能爱上编程呢?)
热度 1 bigdataage 2014-3-11 12:35
什么是最好的编程语言?(怎样才能爱上编程呢?) 经常有人会写点评论编程语言的文章,可能是一些很古老的快被遗忘的语言,也可能是正在流行的新语言。现在我也要写点什么,写出了我对编程语言的一些想法。 免责声明:除非你精通三十门以上的语言并且能够很好地用他们编程(或者是其中的绝大部分),否则你不能客观地评价这些语言的好坏。是的,就像其他人写的关于这方面的文章一样,我也有自己的偏好。事实上,我认为如果你精通很多门语言,你就会认为这个话题是多么的荒诞可笑。 下面这些就是在我的博客中被评为最伟大的语言: Assembly:机器语言 C:形式化语言 Javascript:网编编程语言 Scheme:与C和Javascript相比,更轻巧,嵌入性更好,是极其灵活的编程语言 范例程序来自 Rosetta Code 合适的语言 我不把这些语言称之为合适的语言(reasonable languages)是因为他们是最好的语言(best languages)。他们是现在人们普遍使用的编程语言,人们用他们来编写软件。当然了,你可以避免这些争论而是自己去做决定,如果那样的话,进入下一部分吧。 Ada 我总是对一种语言存储安全的方面很好奇。大体来说这对于真实的操作系统和普通的一般的应用系统都是很有意义的。如果你有相关专业背景的话,并且使用这种语言的话,你不需要读下面的这一部分,但这是一种一旦你知道你需要用它来做什么,你就没有什么选择余地的语言。Ada代码: function Best_Shuffle(S: String) return String is T: String(S'Range) := S; Tmp: Character; begin for I in S'Range loop for J in S'Range loop if I /= J and S(I) /= T(J) and S(J) /= T(I) then Tmp := T(I); T(I) := T(J); T(J) := Tmp; end if; end loop; end loop; return T; end Best_Shuffle; 看起来很安全,不是吗!:) Bourne (Again) Shell 我经常考虑,难道我真的需要用shell来写Linux脚本吗?真的有必要吗?如果你不用shell写script(脚本)也没有关系,因为最终你要面对面的处理这些script,并且你还要考虑怎样在Bare Metal Age和pre-stackoverflow中处理这些问题。这种语言没有什么令人吃惊的地方,也没有什么可以扩展你的思维或让你更有创造性的特性,也难以从应用的业务角度去证明它是好的。也许仅在不知道什么情况中才可以体现出来吧。然而他在系统管理中是那么重要,并且没有看起来那么糟糕。就像是Javascript,你需要比其他语言更多的实践练习。 为什么我要用Unix Shell呢? 我是OSX/Linux/POSIX系统管理员 为了实现自动化 为了使用命令行的强大功能 一些Bourne Shell代码。享受这些布尔表达式吧! #!/usr/bin/env sh l=1 while do m=1 while do printf * m=`expr $m + 1` done echo l=`expr $l + 1` doneC 尽管你可能不喜欢C语言,但你必须要尊重它。他可能是最伟大的语言之一。他能真正地能编写系统级代码。它是UNIX的制造者,是所有语言的鼻祖,是通用的系统级编程语言。它久经沙场,经历时间的检验,广泛传播。太多的开发,调试,性能分析工具支持着C的发展,这也使得它减少了作为语言的缺陷(我看来,这些缺陷不多)。这是一个真正实现了其目标的语言:成为通用的语言。今天,它甚至形成了最奇怪的一个体系结构,这也使得今天很难手写出比C编辑器编译出的代码更好的代码。 尽管有这么强大的工具,但这是需要被人掌握的。这种语言很是冷酷无情,你需要懂它知道你自己在用它干什么。理解机器内部对C语言很重要,C语言可以控制机器的底层。这一点很好,有积极的一面:如果没有C语言这样的底层语言,有些事情我们做不到。C语言程序员必须要彻底理解他们自己在干什么,这一点对于长时间运行的可靠的软件是极为重要的。如果有什么事物可以分开,C语言可以很好地支持并发。C语言编写的程序运行时的效率和C语言的普遍性是一个神话! Linux内核中的C语言代码: int next_pidmap(struct pid_namespace *pid_ns, unsigned int last) { int offset; struct pidmap *map, *end; if (last = PID_MAX_LIMIT) return -1; offset = (last + 1) BITS_PER_PAGE_MASK; map = pid_ns-pidmap ; end = pid_ns-pidmap ; for (; map end; map++, offset = 0) { if (unlikely(!map-page)) continue; offset = find_next_bit((map)-page, BITS_PER_PAGE, offset); if (offset BITS_PER_PAGE) return mk_pid(pid_ns, map, offset); } return -1; }C++ 这是一个奇怪的东西。它是我接触的第一种语言,并且我真的不知道他怎样的限制住了我的生产力并限制了我的技术直到我尝试了其他的语言。c++的坏名声是被一些著名的程序员造成的,我完全同意。C++看起来仿佛是Bjarne Stoustrup把他能想到的所有的功能都加到C中。学习掌握它的负担,使你的编程效率降低80%以上。这样考虑:你的大脑容量是X,容量有限,不管你有多少的能力,你想留下尽可能多的重要的事情。明智的做法是减少用于语言本身的脑力劳动,而是使用大脑和优化的算法。如果语言复杂,无论你有多聪明,你都要用更多的脑力用于解决这语言的语法和语义上的问题,这会使你使用更少的时间用于优化你的代码。 我认为C++是典型的例子,太复杂的事物没什么意义。我同意,用C编写大的程序是困难的(但是有例外,看Linux内核)。通过这些分析,Go,Rust和D语言似乎是更好的,但事实是C++在世界范围内却被广泛地应用。 这是一个很好的C++使用模板,以下面的方式使用C++更容易理解,而不是使用template/classes来定义。 #include #include #include int main( int argc , char** argv ) { int linecount = 0; std::string line; std::ifstream infile( argv ); if( infile ) { while( getline( infile , line ) ) { std::cout linecount : line '\n'; linecount++; } } infile.close(); return 0; } 接下来是一些模板代码,一个很简单的例子,(产生出很糟糕的代码) namespace rosettacode { template class queue { public: queue(); ~queue(); void push(T const t); T pop(); bool empty(); private: void drop(); struct node; node* head; node* tail; }; template struct queue::node { T data; node* next; node(T const t): data(t), next(0) {} }; template queue::queue(): head(0) { } template inline void queue::drop() { node* n = head; head = head-next; delete n; } template queue::~queue() { while (!empty()) drop(); } template void queue::push(T const t) { node* next = head? tail-next : head; next = new node(t); tail = next; } template T queue::pop() { T tmp = head-data; drop(); return tmp; } template bool queue::empty() { return head == 0; } } C# 这种语言旨在减少代码,增加复用性,从而提高程序员的创造性。它是面对对象,具有静态类型,有大量的库函数。你能看出它是微软由控制的。但点我不会担心,它不是一个糟糕的语言。它不是很吸引人,也许微软真正想要的就是准确性吧。相比VB这是一个过于激进的改变吧。我能使用它来做的事: windows编程 游戏开发(大多数是由于微软的强迫而使用它,我认为C/C++更好) 这种语言能做大量的事情:Unity3D, Xamarin, .NET, XNA。 下面是一些代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; class Program { static SortedDictionary GetFrequencies(IEnumerable items) { var dictionary = new SortedDictionary(); foreach (var item in items) { if (dictionary.ContainsKey(item)) { dictionary ++; } else { dictionary = 1; } } return dictionary; } static void Main(string = some data; NSString *string = initWithBytes:bytes length:9 encoding:NSASCIIStringEncoding]; 对于C语言衍生出来的这个漂亮的代码,利用了C语言的所谓的“block”。 #import typedef NSArray *(^SOfN)(id); SOfN s_of_n_creator(int n) { NSMutableArray *sample = initWithCapacity:n]; __block int i = 0; return ^(id item) { i++; if (i = n) { ; } else if (rand() % i n) { sample = item; } return sample; }; } int main(int argc, const char *argv init]; for (int trial = 0; trial 100000; trial++) { SOfN s_of_n = s_of_n_creator(3); NSArray *sample; for (int i = 0; i 10; i++) { sample = s_of_n(@(i)); } ; } NSLog(@%@, bin); } return 0; } Clojure 作为一个Scheme程序员我尊重Clojure:是所谓的现代Lisp,他有一些独特的特性。我想说Clojure在编程方面的长处是和Java语言相同的互操作性和并发实用程序。它与scaling是紧密相关的,但他们的特点是不同的:lisp是面向对象和面向过程的混合,Clojure有过多的括号而使其没有lisp流行。选择这两种语言中的哪一个进行编程取决每个人不同的风格,这是因为没有长期的记录说明哪一个在编程方面更成功一点,就像Java与PHP相比,虽然他们都是运行在虚拟机上的。对于任何基于虚拟机运行的语言,另一件需要考虑的事情是运行时间:这与很小的小程序是不同的。这是一些我用Clojure所要解决的问题: 网络编程。对于网络编程,这是一个很好的选择,在这个领域Clojure看起来是十分流行的。 当你想使用JVM而没有Java技术时。程序员的快乐程度和生产率都将提高。 探索性的编程,编出的代码能修改成产品代码。这一部分Lisp也做的很好,但是Clojure是基于Java的,其有许多代码时开源的。 安卓程序开发?安卓程序开发的GUI模式很大程度是基于类继承。(意味着你不仅仅确切地使用它作为一个插件库,而是迫使你使用某些结构)。这个可以实现,但是这又不像Java继承那样自然。 经典的Clojure代码: (defn divides? (= (rem n k) 0)) (defn prime? (if ( n 2) false (empty? (filter #(divides? % n) (take-while #(= (* % %) n) (range 2 n)))))) Lisp形式的队列的定义代码: (defn make-queue )) (defn enqueue (swap! q conj x)) (defn dequeue (if (seq @q) (let (swap! q subvec 1) x) (throw (IllegalStateException. Can't pop an empty queue.)))) (defn queue-empty? (empty? @q)) D 我以前很喜欢D,D恰好就像C++一样做的很好。D1很像底层的Python。很像pythonized C或者是类似的东西。真是了不起:你感觉到了其发展迅速吧,他专注于算法而不是语言,但当你需要控制底层时,它又没将这一部分去掉。D2带来了C++的一些复杂性,这是由于Andrei Alexandrescu的创新。这使得一部分人不高兴了,虽然其确实在并发性方面做得更好了。D2再也不是一个纯粹的语言了。尽管我喜欢它,但是我还是感觉其不如C++普遍(一旦其复杂起来)。并且我认为现在Go正在吞并D的市场。尽管在语言方面真的能更快一些、更酷一点,但Walter和Andrei不能与google竞争。你可能正如我一样喜欢D,但是我不是很看好它。仅仅是追随C++或者是按照GO语言更加支持本地并发开发呢。我什么时候会使用D语言呢? 从头开发一个项目时,与C有接口或者是与C++有联系时。你需要提前想好接口是什么样子的。对于接口,我不建议使用C++的GUI,因为其要从内部处理C++的继承,这将使得其优势发挥不出来。如果需要,就简单做一个插件库吧。(创建对象,使用其功能,而不是模板或是C++的继承) 底层二进制的编程。就像一个独立的部分,做自己的事情。 如果希望能很好地支持并发。 让我们看一些D2的惯用法,纯函数,不可变的声明。 uint grayEncode(in uint n) pure nothrow { return n ^ (n 1); } uint grayDecode(uint n) pure nothrow { auto p = n; while (n = 1) p ^= n; return p; } void main() { import std.stdio; N N2 enc dec2 dec.writeln; foreach (immutable n; 0 .. 32) { immutable g = n.grayEncode; immutable d = g.grayDecode; writefln(%2d: %5b = %5b = %5b: %2d, n, n, g, d, d); assert(d == n); } } 表的最大元素: .reduce!max.writeln; 截止至今,其是比C++更具有表达性和更清洁的语言。 Erlang 这是一个有目的性的语言。Erlang的web界面是非常清晰的:构建大规模可伸缩软实时的或可用的系统。它使用在电信、银行、电子商务、计算机电话和即时消息等方面。他的实时性也支持并发,分布和容错。其在一些要求很高的应用程序中已经得到证明,例如WhatsApp。其代码很有效,含义清晰,很可读。 看一下简单的并行程序的一个小例子: -module(hw). -export( ). start() - ], wait(2), ok. say(Pid,Str) - io:fwrite(~s~n, ), Pid ! done. wait(N) - receive done - case N of 0 - 0; _N - wait(N-1) end end. Go 我没有亲自使用过它。但很显然的是,这是google做的,其将C与C++好的部分加在一起并且在并发方面比他们都好的语言。它比C++有更好的部分,它形式简单。他没有不安全的指针,拥有包特性、函数和垃圾收集机制。未来Go可能成为服务器端语言。我什么时候要试试Go呢? 对于服务器应用程序,需要非常高的可靠性和性能。这包括web应用程序。 对于控制底层的高效率的代码(然而,我更喜欢Erlang) Go的并行程序代码 package main import ( fmt math/rand time ) func main() { words := readAllBytes(String filename){ Path file = Paths.get(filename); return Files.readAllBytes(file); } } 我才你已经写过Java程序了,因此我不会解说类定义来烦你了。 Javascript 2010年代的通用网络的语言。有趣的是,虽然此前被视为一个有缺陷的和功能有限的语言,但现在大量的程序员对其进行了良好的改造,现在已经成为一种伟大的语言。特别是如果你看了它所有的库,你会发现这些库弥补Javascript的设计的缺陷(比如一个模块系统)。最后要感谢这一点,现在我们甚至把Javascript用在服务器端,这种前后端的对称式编程给我们带来了美好的生活。 有很多研究和努力投入到了改善Javascript的性能、优化Javascript的编译器中。这实际上证明了社区是极其伟大的(如果不是最大的)语言来支持者。有趣的是,你会看到无数的库在做同样的事情,这使得库成为竞争最激烈的领域之一。看Grunt、Gulp等,真是太疯狂了。 下面的代码显示了Javascript基于的原型类和继承机制: function Car(brand, weight) { this.brand = brand; this.weight = weight || 1000; } Car.prototype.getPrice = function() { return this.price; } function Truck(brand, size) { this.constructor(brand, 2000); this.size = size; } Truck.prototype = new Car; var cars = ; for (var i=0; i console.log(cars ); console.log(brand: +cars .brand+. weight: +cars .weight+. + (( cars .hasOwnProperty('size') ) ? size: +cars .size : )); console.log(Car: %s. Truck: %s\n, cars instanceof Car, cars instanceof Truck); } 这显示了使用Lo-dash库的代码: var characters = ; var youngest = _.chain(characters) .sortBy('age') .map(function(chr) { return chr.name + ' is ' + chr.age; }) .first() .value(); 如果你是熟悉Javascript的细节的话(就像例子中一样),你会我发现将两种风格混合在一起很酷。 OCaml 它有几分像Haskell,但更能满足程序员的想法。如果需要的话,一些取舍会使问题更容易解决。面对对象的方法看起来更容易工作。有人使用他,我估计就是他在这一点上超过了Haskell。看下面的代码: let n_arrays_iter ~f = function | ] ] as $s) $result # memoized multipliers = (2, 3, 5) multindeces = # index into _h for multipliers multvalues = for x,i in zip(multipliers, multindeces)] yield h while True: h = min(multvalues) _h.append(h) for (n,(v,x,i)) in enumerate(zip(multvalues, multipliers, multindeces)): if v == h: i += 1 multindeces = i multvalues = x * _h # cap the memoization mini = min(multindeces) if mini = 1000: del _h multindeces = # yield h Ruby Ruby来自Rails。这个简单的原因就可以使它不在这个列表中。当然了,现在可以看到许多其他的程序,但都是来自于Rails。在那以前,Ruby是一种来自日本的很难理解的语言。这是一个对于鼓励快要消失的编程语言成为极其流行的语言的很好的例子。 我以前从许多Ruby程序员那里听到,当然我也是一个很熟练的Ruby的程序员,他们说这是一个令人愉快的语言。换一句话说,这是一个绝不会令人沮丧的语言,我不知道这是来自语言或者是Rail本身。很早以前就被metasploit(一篇文章)指出来了。 这是用Python写过的代码,这里用Ruby再写一遍。风格不同,体现出了Ruby更有“function”风格。 hamming = Enumerator.new do |yielder| next_ham = 1 queues = { 2 = , 5 = .each {|m| queues (next_ham * m)} next_ham = .collect {|m| queues }.min .each {|m| queues .shift if queues == next_ham} end end idx = 1 hamming.each do |ham| case idx when (1..20), 1691 p when 1_000_000 p break end idx += 1 end Scala 似乎是在JVM方面很有优势。我很确信,它突出的原因是与Clojure或其他大的流行的语言相比,它更是语法方面很简单。这种语言也在这个列表中的原因是其可与Java很好地结合在一起。看下面的Hofstadter Q序列问题代码: object HofstadterQseq extends App { val Q: Int = Int = n = { if (n = 2) 1 else Q(n-Q(n-1))+Q(n-Q(n-2)) } (1 to 10).map(i=(i,Q(i))).foreach(t=println(Q(+t._1+) = +t._2)) println(Q(+1000+) = +Q(1000)) } Scheme 这种语言在这个列表中,会有很多人对此有争议,对此有三点理由: 缺乏控制质量的方法 很少有函数库 性能不佳 第一点是确实的,对于解决问题你有许多方法,但是没有哪一个是首选的有效的方法。第二点也是真实的:有函数库,但是都是分散的。语言方面的分散使得需要寻找可供使用的代码是很显然的:你需要用你自己的方法实现。这也许不是十分困难或者是耗时的,如果你要使用带有很好的FFI支持的Scheme实现,例如Gambit或Chicken Scheme,你需要使用C语言的那些函数库。这与你可能想的相反,我是这样做的,并且能很好的工作。但最后,表现不佳。实际上这是完全错误的。像Gambit那样实现是非常快速的,并且你还能优化它。从算法优化,到全局模式编译器声明。当然了,C代码可以很容易地在必要的时候组织代码。 是的,我对于Scheme是狂热的。但是,我承认它有一个致命的弱点:对于共享代码,它太差了,只有一个不太好的社区。它是如此的灵活,以至于每一个程序员都希望自己能对于问题提出完美的解决方案。Java在这方面是完全相反的:Java社区中有杰出的个人或小团队,有试探形式的编程,未经证实的大型团队。但在这种情况下,是非常好的,你可以在一个非常快速和愉快的环境中发展。最后,语言的另一个非常有趣的特性:您可以很容易地用一个Scheme-to-Js编译器编译为Javascript,所以你可以享受在节点在服务器上编程的乐趣。以下是我使用这个语言具体的例子: 需要快速编程且不需要只在像Python或Ruby中提供的库 在C或C++平台的开发的脚本程序。 为了构建一个需要从基础代码扩展出大部分代码的应用程序 对于游戏和OpenGL/ES-based多平台的应用程序。 这是一个Scheme代码示例。虽然有函数库,但你需要自己去实现各部分功能代码,因为没有什么可用的。都要去实现: ;;! Recursive map that applies function to each node (define (map** f l) (cond ((null? l) '()) ((not (pair? l)) (f l)) (else (cons (f (map** f (car l))) (f (map** f (cdr l))))))) ;;! Explicit currying of an arbitrary function (define (curry fun arg1 . args) (if (pair? args) (let ((all-args (cons arg1 args))) (lambda x (apply fun (append all-args x)))) (lambda x (apply fun (cons arg1 x))))) ;;! Implementation of filter, with the match macro (define (filter p lst) (match lst ('() '()) (((? p) . tl) (cons (car lst) (filter/match p tl))) ((hd . tl) (filter/match p tl)))) 再看看 these other interesting examples(一篇文章)吧! Dinosaur languages 这种语言无所谓好坏。似乎我们仅仅是将其忘记了,没有什么特别之处,也没有什么理由吸引我们去使用这种语言。也许我们是错误的。 Assembly 事实上再也没有人用Assembly(汇编)真正编程了,因为编译器已经真的很好了,似乎也不用汇编来优化了。我认为总是有人可以用汇编写出极其优秀的代码,但那样的人必须是足够聪明的。 但是也有一个必须使用汇编的地方:终极编程。用SICP和Lisps对编程有特别好的启发,但是我相信如果从语言的最基本的地方理解也能得到启发:就像处理器指令序列,抽象的语言结构,无论是在声明,逻辑、功能或面向对象方面都有启发。对程序员的大脑有好处。这是一种伟大的语言。什么时候使用呢: 为了学习 系统级编程需要使用的时候 ·当你需要手工实现某些功能时 Common Lisp 我过去使用Autolisp、AutoCAD,但需要在Lisp、Scheme、Clojure中做决定时,我选择Scheme。对于我来说,在前面提到的三种语言中,它排名第三。它感觉起来有些复杂,没有了lisp中的美丽,优雅和简单。我会用它来进行快速建模,但现在已经拥有的库,使我们可以不用它解决问题。并且我认为有拥有更好的库的语言。 Perl 显然是一个具有宗教性质的语言,这种语言拥有自己的宗教团体。有这样一个事实是语言学家Larry Wall将创造性加入到这种语言中。感觉Latin真的是很迷人呀。伙计们,一定是有某些原因才使仍有很多杰出的人在讨论这种语言。这种语言的精髓被Larry写过的话描述了出来:汇编语言可以写出一起东西。 总的来说,我对Perl语言的概念有很深刻的印象。但其有趣的语法也可以导致产生出很多的错误(Lisp中很多地方使用宏)。我认为这种语言的伟大的是在解决小问题时非常方便:它有一个很全面的库(CPAN),提供了几乎任何你想要的方法,这使得解决问题很方便很简单。使用Perl可能出现的最坏情况是,为了改变你的系统,你要学习很多的东西。Ps:我已经被告知Perl的对对象支持是极其可怕的,但我认为这也是一个好处(我可能是偏激的),但我也怀疑这种说法。 看看这两大项目:POE(反应系统的框架、合作多任务处理和网络应用程序),和一个实时web框架Mojolicious。 BASIC, COBOL, Fortran, Pascal, Visual Basic… 如果你需要使用这些语言中的任意一个,上帝都会保佑你的。他们应用在特定的领域(像Fortran应用在在天文学上和HPC应用在社区中),或COBOL(在一些行业中的仍在使用的古老的系统),但它们几乎都被社区的人们一致抨击。但我给你一个很好的理由使用这些语言:当你维护别人代码时按小时收费。对于自己的代码呢?不讨论这些:) Smalltalk 第一个面对对象的语言,但是对于我来说它似乎是被忘记了。 The Unreasonable languages 可能用于生产使用这种语言不太合理,但肯定会促使你让你成为更优秀的程序员(这是完全合理的)。你的选择是有价值的。我能说什么,我喜欢另类的观点。 Array, J 我有许多的语言需要学习,我听说他们是独特的并且学习他们将在除了语言和语法方面扩展你的思维。 Factor, Forth 基于堆栈的语言是非常有能力的并且是非常值得学习的。很能扩展你的思维。所以就在这张列表中了。 F# 这是微软想扮酷的想法。这是一个很好的语言,但是我们中有许多已经学会了远离微软了。我们有足够的其他公司出资的语言了。 Oz 这是一种非常规范的有约束力和可分布式编程的语言。它拥有大部分主要编程语言的特点(懒惰和渴望),命令式和面向对象的。 Prolog/Datalog 声明式逻辑语言大体上是非常具有学术性质的。不过也有一些例外,可以看到在this Stackoverflow question中被看到,并对与Scheme也是如此。 Rust 对于系统编程语言Mozilla的竞争者。它没有像D一样的历史,也没有像google这样的大公司的支持,仅仅像Go一样。不过,我仍然希望看到Rust在未来可作为系统开发的合理的选择。 Shen 它在这个列表中,是因为对其类型相关的东西,我读到了有趣的东西,一些非常基础和有趣的东西是用Shen写的。然而,它的实现是极其具有实验意义的,并且这个语言有一个不可接接受的许可证。这个语言的创造者似乎生活在另一个年代。 TCL 我过去几个月,这时我发现程序与数据由同样的结构存储并且它绑定到一个我需要了解的库,这些是问题(BRL-CAD)。我想说的这是一种像其他很多语言一样被低估的语言。它也没有什么特别好的前途。 结论 我以我选择的语言开始了这个漫长的帖子。编程是一个很美妙的艺术,我真心喜欢它,我承认我偏向于使用自己的经验写这篇文章。由于太多的不确定性,选择一种语言来编程是一个很困难的事情。以我的观点看,有三点很重要: 这个工程的目的是为了创作出一个产品,还是属于一个拥有文化底蕴的组织而偏向于某一种语言吗? 这项任务非常特殊而就是要求某一编程语言吗? 你喜欢或者是想要尽力用这种语言编程吗? 尽管有时打破这个规则,但这就是我解决这类问题的方法。 你有更好的代码片段显示这些语言的特点吗? 英文原文 blog.fourthbit.com 转自: http://ourjs.com/detail/531bfa3bf21aca1267000001
5518 次阅读|5 个评论
科研是有寿命的
热度 2 Enago 2013-10-10 14:29
这里说的是A 君。他高高的个子,平时话不多,说起话来也是细声慢气的,非常有礼貌。他的工作时间非常固定,早上九点掐着点到,下午五点钟一到,一刻也不多留。有次星期五找他放一个会议通知在web 服务器上,他一看时间,刚好五点了,就说,他要回去了,下个星期一再弄。其实放上去也就几分钟的时间,但是这是人家的原则问题。谁叫自己动作慢,非要等到五点才去找他呢。 平时跟A 君的交流不是很多,交流的内容也不多,都是跟电脑硬件、软件相关的事情。A 君在组里面负责的工作也比较奇怪,比如架设、维护服务器,购买硬件、软件等。大部分的时候都是在自己电脑前活动,很少参加实验。他的桌子上总是摆着一些C++ ,Perl ,js 类的编程书籍,操作系统也不是咱们常用的,感觉上编程水平很高。曾经也疑惑过,这也算是做研究吗?但是再一想,这些事情总是要有人来做的,有一个人负责这些事情,其他的人就可以安心做别的事情了。后来有一次,看到组里面这些人的职位,才发现他是三个seniorresearcher 中的一个,登时觉得很不可思议。平时维护电脑、不怎么下实验室的人,职位还比很多人高。好奇之下,就查查他的文章,看他是不是以前做了很了不起的东西,发过很牛的文章。查完之后,还是很失望。最近十来年,他都没有发过第一作者的文章。 直到后来做完了自己的事情,翻到组里很久以前的文档,才发现原来人家也牛过。20 年前,他就跟C 君合写了一份程序。现在boss 做review 报告的时候都会提到。但是俺从来没有用过,也没有见到组里面哪个人在用。做这部分计算用的全部是商业软件。他写过很多计算代码,比如一篇挺不错的文章,他只是第五作者,前面2-3 个作者推导了公式,程序就是他写的。当然在文章里面并不会提到这个代码谁写的。只是在一个PhD 论文的致谢里面,是写清楚的。论文背后还附上了这个程序。看起来很漂亮,标注的非常清楚,15 年前的代码了。 老文档读得越多,越觉得A 君原来是非常强悍的,至少在程序上的造诣是非常高的。但是,为什么这么十年来都没有什么出品呢?我想,这应该是科研的寿命决定的吧,特别是做纯技术的科研。在行业发展初期,由于没有足够的商业支持,做研究是需要自己动手做一些开发,比如写一些程序。但是当行业慢慢发展起来,慢慢就有公司推出产品来做这些事情,以前自己开发的东西就会更加稳定,更加易用,还有不错的售后服务的商品来替代了。这个时候,如果接着做这部分的研究就比较尴尬了。接着开发,凭一个人的力量是无法拼过一个公司的资源的。放弃,就意味着要从头开始。这个时候,要是还是没有给自己重新找到合适的定位,就会慢慢的给淘汰掉了,逐渐淡出研究领域的前沿。 为了让自己能够拥有更加长久的科研寿命,不停的跟踪领域的前沿是非常必要的。不断超越自己,不要把自己给落下了。 本博客内容皆由英论阁资深学术专家团队撰写提供 § 英论阁专业团队提供 英文论文编辑 、 SCI 论文润色 、一站式编辑、出版协助 http://www.enago.cn §
个人分类: 科研感悟|4155 次阅读|3 个评论
[转载]c++编程必备
aaa0 2013-9-22 03:09
C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。 1、 http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 3、 http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --超过万行C和C++免费的源代码 4、 http://freshmeat.net/browse/164/ --超过9000个C编写的项目。 5、 http://www.daniweb.com/code/c.html --DANIWEB提供的实用代码段 。 6、 http://www.programmersheaven.com/tags/C/ --programmersheaven.com上的C编程资源。 7、 http://www.ddj.com/code/ddj.html --Dr. Dobb’s Journal的源代码。 8、 http://www.cprogramming.com/cgi-bin/source/source.cgi --C和C + +编程资源。 9、 http://www.codecogs.com/ --CodeCogs是一项协作的开放源码库,C/C++的数值方面的组件。 10、 http://www.google.com/codesearch?q=programming++lang:ccs_r=lang:c --谷歌代码的C源代码。 11、 http://www.codepedia.com/1/C --CodePedia是一个开放的关于系统编程和其他与电脑有关的议题。 12、 http://www.cis.temple.edu/~ingargio/cis71/code/ --为学生提供的一个简单的C语言程序的列表。 13、 http://www.codeproject.com/?cat=2 --codeproject提供的C/C++资源代码项目。 14、 http://www.thefreecountry.com/sourcecode/cpp.shtml --以下是一些C和C++库的DLL,VCLs,源代码,元件,模块,应用程序框架,类库,源代码片段等,你可以在您的项目中使用而不需要支付费用和版税。 15、 http://people.sc.fsu.edu/~burkardt/cpp_src/cpp_src.html --这是一个全面的关于C++的345个源代码清单。 16、 http://www.cplusplus.com/src/ --C++写的通用控制台程序和Windows程序代码清单。 17、 http://users.cs.fiu.edu/~weiss/dsaa_c++/code/ --C++语言数据结构与算法分析(第二版)的源代码。 18、 http://c.snippets.org/ --C源代码片段。 19、 http://www.bbdsoft.com/downloads.html --C++源代码。 20、 http://www.moshier.net/ 天文学和数值软件源代码 21、 http://cplus.about.com/od/cgames/C_Games_with_Source_Code.htm --游戏有关的C++源代码。 22、 http://cliodhna.cop.uop.edu/~hetrick/c-sources.html --免费的C/C++数值计算源代码。 23、 http://www.mathtools.net/C_C__/Utilities/index.html --C/C++工具。 24、 http://www.programmerworld.net/resources/c_library.htm --免费C++源代码和其它有用的工具。 25、 http://www.cmcrossroads.com/bradapp/links/cplusplus-links.html --布拉德阿普尔顿的C++链接-资源,项目,图书馆,教学和编码。 26、 http://www.robertnz.net/cpp_site.html --这是一个收集了数C/C++网站链接列表的网页。 27、 http://www.josuttis.com/libbook/examples.html --在这里,你可以看到并下载所有的本书的C++标准库例子 。 28、 ftp://66.77.27.238/sourcecode/cuj/ --C/C++用户杂志 29、 ftp://66.77.27.238/sourcecod
1357 次阅读|0 个评论
关于编程,鲜为人知的真相(转载)
热度 2 sheep021 2013-8-12 14:12
原文地址: 关于编程,鲜为人知的真相(转载) 作者: 【】topcoolzai 下面的这些事情可能会让朋友们对软件开发感到惊讶:   1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20% ,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码——不管他的技术水平有多高。好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔盖茨   2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个伟大的程序员的效率会是一个普通程序员的20-100倍。这不是夸张——1960年以来的无数研究都一致的证明了这一点。一个差的程序员不仅仅是没效率——他不仅不能完成任务,写出的大量代码也让别人头痛的没法维护。   3. 伟大的程序员只花很少的时间去写代码——至少指那些最终形成产品的代码。那些要花掉大量时间写代码的程序员都是太懒惰,太自大,太傲慢,不屑用现有的方案去解决老问题。 伟大的程序员的精明之处在于懂得欣赏和重复利用通用模式 。好的程序员并不害怕经常的重构(重写)他们的代码以求达到最好效果。差的程序员写的代码缺乏整体概念,冗余,没有层次,没有模式,导致很难重构。把这些代码扔掉重做也比修改起来容易。   4. 软件遵循熵的定律,跟其它所有东西一样。持续的变更会导致软件腐烂,腐蚀掉对原始设计的完整性概念。软件的腐烂是不可避免的,但程序员在开发软件时没有考虑完整性,将会使软件腐烂的如此之快,以至于软件在还没有完成之前就已经毫无价值了。软件完整性上的熵变可能是软件项目失败最常见的原因。(第二大常见失败原因是做出的不是客户想要的东西。)软件腐烂使开发进度呈指数级速度放缓,大量的软件在失败之前都是面对着突增的时间要求和资金预算。   5. 2004年的一项研究表明大多数的软件项目(51%)会在关键功能上失败,其中15%是完全的失败。这比1994年前有很大的改进,当时是31%。   6. 尽管大多数软件都是团体开发的,但这并不是一项民/主的活动。通常,一个人负责设计,其他人负责实现细节。   7. 编程是个很难的工作。是一种剧烈的脑力劳动。 好的程序员7×24小时的思考他们的工作。他们最重要的程序都是在淋浴时、睡梦中写成的 。因为这最重要的工作都是在远离键盘的情况下完成的,所以软件工程不可能通过增加在办公室的工作时间或增加人手来加快进度。【本博注:天才就是99%的汗水加1%的灵感。】 PS: 台上一分钟,台下十年功。看来各行各业都一样。 据说炒股票能赚钱的人,决不是每天都盯着大盘不放的人。 整天把键盘打得啪啪响,以引起老板注意的程序员未必是一个好程序员。还有一句老话是什么来着:爱叫的狗不咬人?
个人分类: 生活点滴|1747 次阅读|2 个评论
[转载]向量化的ifelse()函数--R
Amyaf 2013-7-22 09:22
​ from: http://book.51cto.com/art/201306/396923.htm 《R语言编程艺术》第2章向量,本章将详细介绍向量。首先考察向量与R语言的其他数据类型之间的关系。与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例。本节为大家介绍向量化的ifelse()函数 2.9 向量化的ifelse()函数 除了多数语言中常见的if-then-else结构,R还有一个向量化的版本:ifelse()函数。它的形式如下: 其中b是一个布尔值向量,而u和v是向量。 该函数返回的值也是向量,如果b 为真,则返回值的第i个元素为u ,如果b 为假,则返回值的第i个元素为v 。 这一概念相当抽象,因此我们看一个例子: 在这里,我们希望产生一个向量,这个向量在x中对应元素为偶数的位置取值是5,且在x中对应元素为奇数的位置取值12。因此,对应到形式参数b的实际参数是(F,T,F,T,F,T,F,T,F,T)。对应到u的第二个实际参数5,通过循环补齐成为(5,5,...)(十个5)。第三个参数12,同样循环补齐为(12,12,...)。 这里有另一个例子: 我们返回的向量由x的元素乘以2或3构成,到底是乘以2还是乘以3,取决于该元素是否大于6。 再次申明,弄明白这里真正发生了什么很重要。表达式x6是一个布尔值向量。如果第i个元素为真,则返回值的第i个元素将被设定为2*x的第i个元素,否则,它将被设定为3*x ,以此类推。 ifelse()相对于标准的if-then-else结构的优点是,它是向量化语句,因此有可能快很多
个人分类: R&statistic|4830 次阅读|0 个评论
[转载]R语言 apply函数家族详解
Amyaf 2013-7-16 13:49
apply Apply Functions Over Array Margins 对阵列行或者列使用函数 apply(X, MARGIN, FUN, ...) lapply Apply a Function over a List or Vector 对列表或者向量使用函数 lapply(X, FUN, ...) sapply Apply a Function over a List or Vector 对列表或者向量使用函数 sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) vapply Apply a Function over a List or Vector 对列表或者向量使用函数 vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE) tapply Apply a Function Over a Ragged Array 对不规则阵列使用函数 tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE) eapply Apply a Function Over Values in an Environment 对环境中的值使用函数 eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE) mapply Apply a Function to Multiple List or Vector Arguments 对多个列表或者向量参数使用函数 mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) rapply Recursively Apply a Function to a List 运用函数递归产生列表 rapply(object, f, classes = "ANY", deflt = NULL,how = c("unlist", "replace", "list"), ...) apply {base} 通过对数组或者矩阵的一个维度使用函数生成值得列表或者数组、向量。 apply(X, MARGIN, FUN, ...) X 阵列,包括矩阵 MARGIN 1 表示矩阵行, 2 表示矩阵列,也可以是 c(1,2) 例: xxx-matrix(1:20,ncol=4) apply(xxx,1,mean) 8.5 9.5 10.5 11.5 12.5 apply(xxx,2,mean) 3 8 13 18 xxx 1 6 11 16 2 7 12 17 3 8 13 18 4 9 14 19 5 10 15 20 lapply {base} 通过对 x 的每一个元素运用函数,生成一个与元素个数相同的值列表 lapply(X, FUN, ...) X 表示一个向量或者表达式对象,其余对象将被通过 as.list 强制转换为 list 例: x - list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE)) x $a 1 2 3 4 5 6 7 8 9 10 $beta 0.04978707 0.13533528 0.36787944 1.00000000 2.71828183 7.38905610 20.08553692 $logic TRUE FALSE FALSE TRUE lapply(x,mean) $a 5.5 $beta 4.535125 $logic 0.5 sapply {base} 这是一个用户友好版本,是 lapply 函数的包装版。该函数返回值为向量、矩阵,如果 simplify=”array” ,且合适的情况下,将会通过 simplify2array() 函数转换为阵列。 sapply(x, f, simplify=FALSE, USE.NAMES=FALSE) 返回的值与 lapply(x,f) 是一致的。 sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) X 表示一个向量或者表达式对象,其余对象将被通过 as.list 强制转换为 list simplify 逻辑值或者字符串,如果可以,结果应该被简化为向量、矩阵或者高维数组。必须是命名的,不能是简写。默认值是 TRUE ,若合适将会返回一个向量或者矩阵。如果 simplify=”array” ,结果将返回一个阵列。 USE.NAMES 逻辑值,如果为 TRUE ,且 x 没有被命名,则对 x 进行命名。 例: sapply(k, paste,USE.NAMES=FALSE,1:5,sep="...") "a...1" "b...1" "c...1" "a...2" "b...2" "c...2" "a...3" "b...3" "c...3" "a...4" "b...4" "c...4" "a...5" "b...5" "c...5" sapply(k, paste,USE.NAMES=TRUE,1:5,sep="...") a b c "a...1" "b...1" "c...1" "a...2" "b...2" "c...2" "a...3" "b...3" "c...3" "a...4" "b...4" "c...4" "a...5" "b...5" "c...5" sapply(k, paste,USE.NAMES=TRUE,1:5,sep="...",simplyfy=TRUE) a b c "a...1...TRUE" "b...1...TRUE" "c...1...TRUE" "a...2...TRUE" "b...2...TRUE" "c...2...TRUE" "a...3...TRUE" "b...3...TRUE" "c...3...TRUE" "a...4...TRUE" "b...4...TRUE" "c...4...TRUE" "a...5...TRUE" "b...5...TRUE" "c...5...TRUE" sapply(k, paste,simplify=TRUE,USE.NAMES=TRUE,1:5,sep="...") a b c "a...1" "b...1" "c...1" "a...2" "b...2" "c...2" "a...3" "b...3" "c...3" "a...4" "b...4" "c...4" "a...5" "b...5" "c...5" sapply(k, paste,simplify=FALSE,USE.NAMES=TRUE,1:5,sep="...") $a "a...1" "a...2" "a...3" "a...4" "a...5" $b "b...1" "b...2" "b...3" "b...4" "b...5" $c "c...1" "c...2" "c...3" "c...4" "c...5" vapply {base} vapply 类似于 sapply 函数,但是它的返回值有预定义类型,所以它使用起来会更加安全,有的时候会更快 在 vapply 函数中总是会进行简化, vapply 会检测 FUN 的所有值是否与 FUN.VALUE 兼容,以使他们具有相同的长度和类型。类型顺序:逻辑 整型 实数 复数 vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE) X 表示一个向量或者表达式对象,其余对象将被通过 as.list 强制转换为 list simplify 逻辑值或者字符串,如果可以,结果应该被简化为向量、矩阵或者高维数组。必须是命名的,不能是简写。默认值是 TRUE ,若合适将会返回一个向量或者矩阵。如果 simplify=”array” ,结果将返回一个阵列。 USE.NAMES 逻辑值,如果为 TRUE ,且 x 没有被命名,则对 x 进行命名。 FUN.VALUE 一个通用型向量, FUN 函数返回值得模板 例: x-data.frame(a=rnorm(4,4,4),b=rnorm(4,5,3),c=rnorm(4,5,3)) vapply(x,mean,c(c=0)) a b c 1.8329043 6.0442858 -0.1437202 k-function(x) + { + list(mean(x),sd(x)) + } vapply(x,k,c(c=0)) 错误于 vapply(x, k, c(c = 0)) : 值的长度必需为 1 , 但 FUN(X ]) 结果的长度却是 2 vapply(x,k,c(c=0,b=0)) 错误于 vapply(x, k, c(c = 0, b = 0)) : 值的种类必需是 'double' , 但 FUN(X ]) 结果的种类却是 'list' vapply(x,k,c(list(c=0,b=0))) a b c c 1.832904 6.044286 -0.1437202 b 1.257834 1.940433 3.649194 tapply {base} 对不规则阵列使用向量,即对一组非空值按照一组确定因子进行相应计算 tapply(X, INDEX, FUN, ..., simplify = TRUE) x 一个原子向量,典型的是一个向量 INDEX 因子列表,和 x 长度一样,元素将被通过 as.factor 强制转换为因子 simplify 若为 FALSE , tapply 将以列表形式返回阵列。若为 TRUE , FUN 则直接返回数值 例: height - c(174, 165, 180, 171, 160) sex-c("F","F","M","F","M") tapply(height, sex, mean) F M 170 170 eapply {base} eapply 函数通过对 environment 中命名值进行 FUN 计算后返回一个列表值,用户可以请求所有使用过的命名对象。 eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE) env 将被使用的环境 all.names 逻辑值,指示是否对所有值使用该函数 USE.NAMES 逻辑值,指示返回的列表结果是否包含命名 例: require(stats) env - new.env(hash = FALSE) # so the order is fixed env$a - 1:10 env$beta - exp(-3:3) env$logic - c(TRUE, FALSE, FALSE, TRUE) # what have we there? utils::ls.str(env) a : int 1 2 3 4 5 6 7 8 9 10 beta : num 0.0498 0.1353 0.3679 1 2.7183 ... logic : logi TRUE FALSE FALSE TRUE # compute the mean for each list element eapply(env, mean) $logic 0.5 $beta 4.535125 $a 5.5 unlist(eapply(env, mean, USE.NAMES = FALSE)) 0.500000 4.535125 5.500000 # median and quartiles for each element (making use of "..." passing): eapply(env, quantile, probs = 1:3/4) $logic 25% 50% 75% 0.0 0.5 1.0 $beta 25% 50% 75% 0.2516074 1.0000000 5.0536690 $a 25% 50% 75% 3.25 5.50 7.75 eapply(env, quantile) $logic 0% 25% 50% 75% 100% 0.0 0.0 0.5 1.0 1.0 $beta 0% 25% 50% 75% 100% 0.04978707 0.25160736 1.00000000 5.05366896 20.08553692 $a 0% 25% 50% 75% 100% 1.00 3.25 5.50 7.75 10.00 mapply {base} mapply 是 sapply 的多变量版本。将对 ... 中的每个参数运行 FUN 函数,如有必要,参数将被循环。 mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) MoreArgs FUN 函数的其他参数列表 SIMPLIFY 逻辑或者字符串,可以减少结果成为一个向量、矩阵或者更高维阵列,详见 sapply 的 simplify 参数 USE.NAMES 逻辑值,如果第一个参数 ... 已被命名,将使用这个字符向量作为名字 例: mapply(rep, 1:4, 4:1) ] 1 1 1 1 ] 2 2 2 ] 3 3 ] 4 rapply {base} rapply 是 lapply 的递归版本 rapply(X, FUN, classes = "ANY", deflt = NULL, how = c("unlist", "replace", "list"), ...) X 一个列表 classes 关于类名的字符向量,或者为 any 时则匹配任何类 deflt 默认结果,如果使用了 how=”replace” ,则不能使用 how 字符串匹配三种可能结果
个人分类: R&statistic|3237 次阅读|0 个评论
[转载]R语言常用函数
Amyaf 2013-7-16 12:12
From: http://www.plob.org/2011/10/03/190.html 基本 一、数据管理 vector:向量 numeric:数值型向量 logical:逻辑型向量character;字符型向量 list:列表 data.frame:数据框c:连接为向量或列表 length:求长度 subset:求子集seq,from:to,sequence:等差序列rep:重复 NA:缺失值 NULL:空对象sort,order,unique,rev:排序unlist:展平列表attr,attributes:对象属性mode,typeof:对象存储模式与类型names:对象的名字属性 二、字符串处理 character:字符型向量 nchar:字符数 substr:取子串format,formatC:把对象用格式转换为字符串paste,strsplit:连接或拆分charmatch,pmatch:字符串匹配grep,sub,gsub:模式匹配与替换 三、复数 complex, R e,Im,Mod,Arg,Conj:复数函数 四、因子 factor:因子 codes:因子的编码 levels:因子的各水平的名字nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子table:交叉频数表 split:按因子分组aggregate:计算各数据子集的概括 统计 量tapply:对“不规则”数组应用函数 数学 一、计算 +, -, *, /, ^, %%, %/%:四则运算ceiling,floor,round,signif,trunc,zapsmall:舍入max,min,pmax,pmin:最大最小值 range:最大值和最小值sum,prod:向量元素和,积cumsum,cumprod,cummax,cummin:累加、累乘sort:排序approx和approx fun:插值diff:差分sign:符号函数 二、数学函数 abs,sqrt:绝对值,平方根log, exp, log10, log2:对数与指数函数sin,cos,tan,asin,acos,atan,atan2:三角函数sinh,cosh,tanh,asinh,acosh,atanh:双曲函数 beta,lbeta,gamma,lgamma,digamma,trigamma,tetragamma,pentagamma,choose ,lchoose:与贝塔函数、伽玛函数、组合数有关的特殊函数 fft,mvfft,convolve:富利叶变换及卷积polyroot:多项式求根poly:正交多项式spline,splinefun:样条差值besselI,besselK,besselJ,besselY,gammaCody:Bessel函数deriv:简单表达式的符号微分或算法微分 三、数组 array:建立数组 matrix:生成矩阵data.matrix:把数据框转换为数值型矩阵lower.tri:矩阵的下三角部分 mat.or.vec:生成矩阵或向量t:矩阵转置 cbind:把列合并为矩阵 rbind:把行合并为矩阵diag:矩阵对角元素向量或生成对角矩阵aperm:数组转置 nrow, ncol:计算数组的行数和列数dim:对象的维向量 dimnames:对象的维名row/colnames:行名或列名 %*%:矩阵乘法crossprod:矩阵交叉乘积(内积) outer:数组外积kronecker:数组的Kronecker积 apply:对数组的某些维应用函数tapply:对“不规则”数组应用函数 sweep:计算数组的概括 统计 量aggregate:计算数据子集的概括 统计 量 scale:矩阵标准化matplot:对矩阵各列绘图 cor:相关阵或协差阵Contrast:对照矩阵 row:矩阵的行下标集col:求列下标集 四、线性代数 solve:解线性方程组或求逆 eigen:矩阵的特征值分解svd:矩阵的奇异值分解 backsolve:解上三角或下三角方程组chol:Choleski分解 qr:矩阵的Q R 分解chol2inv:由Choleski分解求逆 五、逻辑运算 ,=,==,!=:比较运算符!,,,|,||,xor():逻辑运算符logical:生成逻辑向量 all,any:逻辑向量都为真或存在真ifelse():二者择一 match,%in%:查找unique:找出互不相同的元素 which:找到真值下标集合duplicated:找到重复元素 六、优化及求根 optimize,uniroot,polyroot:一维优化与求根 程序设计 一、控制结构 if,else,ifelse,switch:分支for,while,repeat,break,next:循环apply,lapply,sapply,tapply,sweep:替代循环的函数。 二、函数 function:函数定义 source:调用文件 call:函数调用.C,.Fortran:调用C或者Fortran子程序的动态链接库。 R ecall:递归调用browser,debug,trace,traceback:程序调试options:指定系统参数 missing:判断虚参是否有对应实参nargs:参数个数 stop:终止函数执行on.exit:指定退出时执行 eval,expression:表达式计算system.time:表达式计算计时 invisible:使变量不显示menu:选择菜单(字符列表菜单) 其它与函数有关的还有:delay,delete.response,deparse,do.call,dput,environment ,,formals,format.info,interactive,is.finite,is.function,is.language,is.recursive ,match.arg,match.call,match.fun,model.extract,name,parse,substitute,sys.parent ,warning,machine。 三、输入输出 cat,print:显示对象sink:输出转向到指定文件dump,save,dput,write:输出对象scan,read.table,load,dget:读入 四、工作环境 ls,objects:显示对象列表 rm, remove:删除对象q,quit:退出系统 .First,.Last:初始运行函数与退出运行函数。options:系统选项 ?,help,help.start,apropos:帮助功能data:列出数据集 统计 计算 一、 统计 分布 每一种分布有四个函数:d――density(密度函数),p――分布函数,q――分位数 函数,r――随机数函数。比如,正态分布的这四个函数为dnorm,pnorm,qnorm,rnorm。下 面我们列出各分布后缀,前面加前缀d、p、q或r就构成函数名: norm:正态,t:t分布,f:F分布,chisq:卡方(包括非中心)unif:均匀,exp:指数,weibull:威布尔,gamma:伽玛,beta:贝塔lnorm:对数正态,logis:逻辑分布,cauchy:柯西,binom:二项分布,geom:几何分布,hyper:超几何,nbinom:负二项,pois:泊松signrank:符号秩,wilcox:秩和,tukey:学生化极差 二、简单 统计 量 sum, mean, var, sd, min, max, range, median, IQ R (四分位间距)等为 统计 量,sort,order,rank与排序有关,其它还有ave,fivenum,mad,quantile,stem等。 三、 统计 检验 R 中已实现的有chisq.test,prop.test,t.test。 四、多元分析 cor,cov.wt,var:协方差阵及相关阵计算biplot,biplot.princomp:多元数据biplot图cancor:典则相关 princomp:主成分分析hclust:谱系聚类 kmeans:k-均值聚类cmdscale:经典多维标度其它有dist,mahalanobis,cov.rob。 五、时间序列 ts:时间序列对象 diff:计算差分 time:时间序列的采样时间 window:时间窗 六、 统计 模型 lm,glm,aov:线性模型、广义线性模型、方差分析
个人分类: R&statistic|3130 次阅读|0 个评论
脸谱Facebook Hackathon编程大赛之旅
missjia2005 2013-6-12 05:49
上周末在伦敦covent garden的Facebook总部参加了一次别有创意的编程大赛,时间从周六晚上5点到周日晚上5点,共24小时,说是编程大赛,但是参加的选手更乐于把它当成一个文化节,一个Geek计算机疯子聚会的节日,共有来自牛津剑桥,帝国理工等多个名校的50多支队伍参赛,第一名的队伍可以获得免费去加州硅谷脸谱总部比赛的机会。说它是节日,而不是比赛,这是因为整个赛程是开放的,每个队伍可以做任何应用,没有问题限制,鼓励的就是创新。 我有幸和北邮的三位优秀毕业生在一个小组,我们做了一个街头艺人表演比赛的网站,组长吕雪珂,一个计算机才女,在怎么调用Facebook的API上起了灵魂作用;首席技术官庞雨秾,他提出了线上比赛与线下收集钱币的结合,人群投币的情况会同步记录在网站数据库中,他打通了软件到硬件的所有的技术难点;另外他也是个博客达人,按他的思想来说就是,写博客是一个让自己学到的知识理解升华的过程,更是一个思想传播的过程,这点我严重同意(不过我个人因为偷懒,产量并不高)。这是他的博客地址: http://blog.sciencenet.cn/home.php?mod=spaceuid=427701 另外我们的首席工程师罗义腾,他制作和设计了硬币收集装置(光遮挡感应器);这次我打了一点酱油,主要负责做网站。 这是几张官网发的照片,细心的同学就会发现我们的团队在照片上的位置了。虽然最后由于汇报的原因,未能获奖,但是这次经历却是一辈子的,一个小团队一起奋斗,一起思考,一起进步,就像一个节日,一个派对,也许这也就是活动的本意。 最后附上我们的网站(上面的每一个“赞”,都是我们在硬币盒里投硬币加上去的): http://hidden-depths-7198.herokuapp.com/ 以及我们的合照:
1095 次阅读|0 个评论
[转载]C++ STL编程轻松入门
baibing 2013-6-3 16:38
http://tech.163.com/05/0613/10/1M4EA0US00091589.html
个人分类: 编程|1 次阅读|0 个评论
[转载]邓宏魁与汤超研究组在《细胞》(Cell)发表封面论文
biophysicalchem 2013-5-28 15:17
来源: http://cqb.pku.edu.cn/zxxw/tzgg/252371.shtml 邓宏魁与汤超研究组在《细胞》(Cell)发表封面论文报道细胞重编程过程中的创新方法和理论 北京大学生命科学院邓宏魁研究组和北京大学定量生物学中心汤超研究组合作,首次证明小鼠体细胞重编程可由调控分化的基因完成,并在此基础上提出细胞命运转变的“跷跷板模型”。2013年5月23日,该成果研究论文“Induction of pluripotency in mouse somatic cells with lineage specifiers”于《细胞》(Cell)期刊以封面文章形式在线发表。《细胞》同期还配发了希伯来大学Nissim Benvenisty教授对于该工作的评论文章。 “Seesaw模型”的landscape图 细胞命运决定的“跷跷板模型” 2006 年,日本科学家Shinya Yamanaka发现向小鼠体细胞转入胚胎干细胞特异因子(OCT4, SOX2, KLF4, c-MYC)可以完成体细胞的重编程。在此之后,细胞重编程领域普遍认为向目标细胞状态的转变需要靠在目标状态中特异高表达的因子的诱导。因此目前发现的能够在细胞重编程中发挥作用的因子均在胚胎干细胞中高表达并且与细胞干性维持紧密相关。 传统观点认为分化因子与干性因子是相互拮抗,相互抑制的。干性基因在胚胎干细胞中高表达,抑制分化基因;分化基因在胚胎干细胞中不表达或低表达,高表达这些分化因子将抑制干性因子,破坏胚胎干细胞多能性的状态,导致其分化。 然而邓宏魁研究组通过大规模筛选发现,细胞重编程中至关重要的干性因子OCT4能够被调控中内胚层(ME)发育和分化的因子(如GATA3,GATA6,PAX1)代替;SOX2能够被调控外胚层(ECT)发育和分化的因子(如GMNN)代替。进一步,汤超研究组根据这一发现创新性地建立了“跷跷板模型”,来更好的理解中胚层基因和外胚层基因在重编过程中的相互抑制和相互平衡的关系,这种关系可能决定了细胞命运的维持和改变。这个模型提供了诱导体细胞重编程的其它方法的预测,甚至还有一个出乎意料的模拟结果:如果同时过表达中内胚层和外胚层基因,就可以达到平衡从而同时替代SOX2和OCT4。而我们的实验结果也进一步证实了这个可能,首次实现了用ME分化因子和ECT分化因子同时替代掉了细胞重编程过程中最关键的两个干性因子OCT4和SOX2。这一发现改变了向目标细胞状态的转变需要用在目标细胞状态中高表达的因子的诱导的这一传统观点,为研究细胞命运转变提供了新视角,重新认识了细胞重编程和细胞命运决定的机制。 邓宏魁研究组博士生舒健、吴晨、吴业涛与汤超研究组博士生李志远为共同第一作者,邓宏魁研究组博士后赵扬也在这一工作中发挥了关键作用。邓宏魁、汤超均为北京大学-清华大学生命科学联合中心成员。
个人分类: 药物设计|2549 次阅读|0 个评论
[转载]程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
BleuRever 2013-5-10 20:32
程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结 作者:July--结构之法算法之道blog之博主。 时间:2010年10月-2012年11月。 出处: http://blog.csdn.net/v_JULY_v 。 声明:版权所有,侵犯必究。 前言 开博已过24个月,回首这24个月,发现自己在本blog上着实花费了巨大的时间与精力,写的东西可能也够几本书的内容了。希望我真真正正的为读者提供了实实在在的价值与帮助。 下面,敬请观赏。有任何问题,欢迎随时不吝指正( 同时,若你也能帮助blog内留言的任何朋友的问题,欢迎你随时不吝分享回复,我们一起讨论,互帮互助,谢谢 )。 无私分享,造福天下 以下是本blog内的微软面试100题系列,经典算法研究系列,程序员编程艺术系列,红黑树系列,及数据挖掘十大算法等5大经典原创系列作品与一些重要文章的集锦: 一、 微软面试100题系列 横空出世,席卷Csdn--评微软等数据结构+算法面试100题 (微软面试100题系列原题+ 答案 索引) 微软100题 (微软面试完整第1-100题) 微软面试100题2010年版 全部答案集锦 (含下载地址) 全新整理:微软、谷歌、百度等公司经典面试100题 全新整理:微软、Google等公司的面试题及解答 十道海量数据处理面试题与十个方法大总结 (十道海量数据处理面试题) 海量数据处理面试题集锦与Bit-map详解 (十七道海量数据处理面试题) 教你如何迅速 秒杀 掉 : 99%的 海量数据处理 面试题 ( 解决海量数据处理问题之六把密匙 ) 九月腾讯,创新工场,淘宝等公司最新面试三十题(第171-200题) (2011年度九月最新面试三十题) 十月百度,阿里巴巴,迅雷搜狗最新面试七十题(第201-270题) (2011年度十月最新面试七十题) 十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题) 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题) (2012年度笔试面试八十题) 上述微软面试100题系列( 共计11篇文章,300多道面试题 )的PDF文档近期已经制作出来,其下载地址为: http://download.csdn.net/detail/v_july_v/4583815 。 ( 此外,若无csdn账号的,可以到此处所给的微盘地址下载: http://weibo.com/1580904460/z7oQazXzM ) 二、 十五个经典算法研究与总结、目录+索引 一、A*搜索算法 一(续)、A*,Dijkstra,BFS算法性能比较及A*算法的应用 二、Dijkstra 算法初探 (Dijkstra算法系列4篇文章) 二(续)、彻底理解Dijkstra算法 二(再续)、Dijkstra 算法+fibonacci堆的逐步c实现 二(三续)、Dijkstra 算法+Heap堆的完整c实现源码 三、dynamic programming 四、BFS和DFS优先搜索算法 五、教你透彻了解红黑树 (红黑树系列6篇文章之其中两篇) 五(续)、红黑树算法的实现与剖析 六、教你初步了解KMP算法、updated ( KMP 算法系列三篇文章) 六(续)、从KMP算法一步一步谈到BM算法 六(三续)、KMP算法之总结篇(必懂KMP) 七、遗传算法 透析GA本质 八、再谈启发式搜索算法 九、图像特征提取与匹配之SIFT算法 ( sift 算法系列五篇文章) 九(续)、sift算法的编译与实现 九(再续)、教你一步一步用c语言实现sift算法、上 九(再续)、教你一步一步用c语言实现sift算法、下 九(三续):SIFT算法的应用-- 目标识别 之Bag-of-words模型 九(四续)、SIFT + KD_BBF算法 (此文第3部分) 十、从头到尾彻底理解傅里叶变换算法、上 十、从头到尾彻底理解傅里叶变换算法、下 十一、从头到尾彻底解析Hash表算法 十一(续)、倒排索引关键词Hash不重复编码实践 十二、快速排序算法 (快速排序算法3篇文章) 十二(续)、快速排序算法的深入分析 十二(再续):快速排序算法之所有版本的c/c++实现 十三、通过浙大上机复试试题学SPFA 算法 十四、快速选择SELECT算法的深入分析与实现 十五、多项式乘法与快速傅里叶变换 最新的 十五个 经典算法研究的PDF文档0积分下载地址如下( 1个月5000+人次下载 ) : http://download.csdn.net/detail/v_july_v/4478027 。( 至于新浪微盘下载地址为: http://vdisk.weibo.com/s/cTxGv ) 「 此外 原来的十三个经典算法研究 的PDF文档,Csdn下载地址: http://download.csdn.net/source/3427838 ; 新浪爱问共享下载地址: http://ishare.iask.sina.com.cn/f/16968707.html 」 。 三、 程序员编程艺术第一~二十九章集锦与总结 第一章、左旋转字符串 第二章、字符串是否包含及匹配/查找/转换/拷贝问题 第三章、寻找最小的k个数 第三章续、Top K算法问题的实现 第三章再续:快速选择SELECT算法的深入分析与实现 三之三续、求数组中给定下标区间内的第K小(大)元素 第四章、现场编写类似strstr/strcpy/strpbrk的函数 第五章、寻找满足条件的两个或多个数 第六章、求解500万以内的亲和数 第七章、求连续子数组的最大和 第八章、从头至尾漫谈虚函数 第九章、闲话链表追赶问题 第十章、如何给10^7个数据量的磁盘文件排序 第十一章、最长公共子序列(LCS)问题 第十二~十五章:数的判断,中签概率,IP访问次数,回文问题(初稿) 第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性hash算法 第二十一~二十二章:出现次数超过一半的数字,最短摘要的生成 第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践 第二十五章:Jon Bentley:90%无法正确实现二分查找 第二十六章:基于给定的文档生成倒排索引的编码与实践 第二十七章:不改变正负数之间相对顺序重新排列数组 第二十八~二十九章:最大连续乘积子串、字符串编辑距离 ... 程序员编程艺术 第一~二十七章集锦与总结 (教你如何编程),及 PDF免积分下载 地址如下( 4个月7000+人次下载 ): http://download.csdn.net/detail/v_july_v/4256339 。 ( 此外,编程艺术微盘下载地址为: http://vdisk.weibo.com/s/cTw-x ) 四、红黑树、B树、R树、KD树 教你透彻了解红黑树 (红黑树系列) 红黑树算法的实现与剖析 红黑树的C实现完整源码 一步一图一代码,R-B Tree 红黑树插入和删除结点的全程演示 红黑树的C++完整实现源码 从2-3-4树谈到Red-Black Tree(红黑树) 从B树、B+树、B*树谈到R 树 (B树/R树系列) B树的C 实现 从Trie树(字典树)谈到后缀树 (其余树结构) 从LSM-Tree、COLA-Tree谈到 StackOverflow 、OSQA 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法 (kd树) blog内的上述红黑树、B树/R树/kd树系列 http://weibo.com/1580904460/z6qrXEJft 的PDF,朋友@小龟ComeOn 已经帮忙制作好,将择日通过 微博 免费分享给所有为我个人 投票 ,且转发投票页面微博的朋友: http://weibo.com/1580904460/z8k9S7RRL 。感谢诸位。 五、数学·数据挖掘·机器学习算法系列 数据挖掘十大算法系列: 数据挖掘领域十大经典算法初探 从决策树学习谈到贝叶斯分类算法、EM、HMM 支持向量机通俗导论(理解 SV M 的三层境界) 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法 第4篇将写神经网络 第5篇待定... 10大算法番外篇: 数据挖掘中所需的概率论与数理统计知识、上 ... 六、其它重要文章节选 6.1 、经典数据结构 算法系列 : 精通八大排序算法系列:一之续、快速排序算法的深入分析 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较 6.2 、数据处理/网站架构系列 : 从 Hadhoop 框架与 MapReduce 模式中谈 海量数据处理 MapReduce技术的初步了解与学习 海量数据处理之Bloom Filter详解 从上百幅 架构 图中学大型网站建设经验(上) Chrome源码 剖析、上--多线程模型、进程通信、进程模型 Nginx 源码剖析之内存池,与内存管理 6.4 、推荐 搜索算法系列 : 细数 二十世纪 最伟大的10大算法 当今世界最为经典的 十大算法 --投票进行时 ( 本blog将评选出当今世界最为经典的十大算法 ) 推荐引擎算法学习导论 搜索引擎 技术之概要预览 6.5 、其它 : 重启开源,分享无限--诚邀你加入微软面试187题的解题中 敏捷软件开发模型Scrum通俗讲义 由快速排序引申而来-- 如何学习算法 Machine Learning读书会集锦 (前两期主讲人包括:张栋,张俊林,刘未鹏pongba,项亮) 三五杆枪,可干革命,三五个人,可以 创业 我的大学生涯 结构之法算法之道blog最新博文集锦第6、第 7 期CHM文件0积分下载 .... 后记 世上本无路,走的人多了,也就成了路。世上本无免费的午餐,分享的人多了,也就造就了开源的辉煌。 如果你发现了本blog中的任何一个错误,漏洞,bug,和问题,请一定不吝指正,本人感激不尽并单独赠送程序员编程艺术+十五个经典算法研究的PDF。同时,建议突出或改动较大的话,对应文章附上名字之外,贴出个人微博主页或邮箱或个人博客。请来信索取(注明:“ 提bug,得pdf ”字样),本人邮箱, zhoulei0907@yahoo.cn 。 (你可以永久通过如 Google等工具 搜索本博客名称的前4个字,即:“ 结构之法 ” 这4个关键字,进入本博客) 最后,感谢CSDN,感谢所有一直以来关注本blog的所有朋友。谢谢大家,谢谢。
个人分类: IT|3496 次阅读|0 个评论
20130426编程感悟
china140106 2013-4-26 17:40
前段时间一直在编程,想从基因组参考序列里提取想要的一点东西。折腾了很长时间,终于编程完毕。其中修复了若干错误,每次修复一个错误,虽然很高兴,但也不免担心还有不知多少隐藏的错误没有被发现。 不管如何,到目前仍未找到更多的错误,而且就测试例子来说,运行结果还是满意的。于是将人类参考基因组序列导入进行计算。但计算速度之慢,远超估计。 于是想着改进一下程序,争取能更快地实现目的。需要说明的是,我使用的是perl语言。 在程序中,有一个步骤需要在大范围里找到很多东西,由于考虑到内存限制,第一次使用的正则表达式。于是想到是否散列(hash)会更快?于是改为散列查找,但运行速度不仅没有改善,反而更慢,同时消耗了更多内存。改进失败,于是再次修改为数组查找,实现遍历一遍完成目的。但运行结果显示速度和散列查找差不多,但内存消耗更多。 总结如下: 1、脚本语言主要是为了方便编程,提高运算速度可能不是强项。 2、正则表达式的效率确实值得称赞。
个人分类: 杂谈|3507 次阅读|0 个评论
IDL极简教程
热度 2 qianlivan 2013-4-20 19:37
0. 前言 之前我在博客里记过一些IDL相关的笔记,现在看来依然有用,但是比较零散(比如,处理数组中的NaN值,找到数组中最大值的指标 http://blog.sciencenet.cn/blog-117333-299315.html ,在命令行(shell)中直接运行IDL脚本 http://blog.sciencenet.cn/blog-117333-305128.html ,生成满足某个分布的二维数组 http://blog.sciencenet.cn/blog-117333-377644.html ,画全天的中性氢分布图 http://blog.sciencenet.cn/blog-117333-377237.html ,查看光谱 http://blog.sciencenet.cn/blog-117333-377218.html , http://blog.sciencenet.cn/blog-117333-375080.html , http://blog.sciencenet.cn/blog-117333-373635.html , http://blog.sciencenet.cn/blog-117333-386619.html , 运行简单的IDL脚本 http://blog.sciencenet.cn/blog-117333-381658.html , 读FITS二进制表 http://blog.sciencenet.cn/blog-117333-380421.html , http://blog.sciencenet.cn/blog-117333-441128.html , 写FITS文件 http://blog.sciencenet.cn/blog-117333-389063.html , 处理字符串 http://blog.sciencenet.cn/blog-117333-448458.html , http://blog.sciencenet.cn/blog-117333-479347.html , http://blog.sciencenet.cn/blog-117333-476786.html , 颜色表操作 http://blog.sciencenet.cn/blog-117333-476641.html , http://blog.sciencenet.cn/blog-117333-476433.html , http://blog.sciencenet.cn/blog-117333-637204.html , 画多个子图 http://blog.sciencenet.cn/blog-117333-511583.html , 创建窗口 http://blog.sciencenet.cn/blog-117333-518785.html , 读大数据表 http://blog.sciencenet.cn/blog-117333-609718.html , http://blog.sciencenet.cn/blog-117333-609545.html , http://blog.sciencenet.cn/blog-117333-637204.html , 曲线拟合时限定参数范围 http://blog.sciencenet.cn/blog-117333-670583.html , http://blog.sciencenet.cn/blog-117333-671768.html ,),有必要整理一下。如今,网上有太多的关于IDL的文章、教程,我再写个教程对于大多数人而言应该是没有意义的,但是我仍希望写点东西给自己看,毕竟好记性不如烂笔头。而且,为了避免混乱,关于IDL,我不想再开新贴了。本教程不定期更新,牛人请绕道。 本教程除了告诉可以做什么之外,还告诉不可以做什么。自从听过软件管理的讲座以后,我越来越觉得错误比正确有价值——要不然计算管理体系文件的价值的时候为什么按照失败的次数来算呢? 1. 常用操作 (1) 用sort排序 IDL a= IDL sort(a) 程序将返回排序之后的“数组指标”,即每个数在原来数组中的位置,而不是数字本身。 (2) 用where函数寻找数组中满足某判据的数 IDL a=findgen(10)^2 IDL where(a gt 25) 程序范围的将是数组a中大于5的数的“数组指标”,而不是数字本身!返回数组指标比返回数组本身有用得多,因为从指标得到数比反过来容易。但是这还不是最好的做法,因为返回指标的时候,有些数就被扔掉了。我见过最好的做法是matlab的做法,matlab在进行类似操作的时候返回的是一个和原数组同样大小的逻辑值数组,满足条件的位置为1,其他地方为0。 2. 常见错误 (1) 把整数当作浮点数放到分母里做除法 IDL print,2/4 结果是0,而不是0.5,因为这里是整数除法,得到的也是整数。 (2) 不同变量的变量名重复(注意IDL不区分大小写) 这通常发生在变量名命名不规范的程序中。这一条主要是写给我自己看的。我的程序里会用到光速,我将其叫做c。随后,我从三个FITS文件中读入数据到三个数组,偷懒,我就分别取为a、b、c。然后,就没有然后了。 (3) 在某些字体中,l和1长得一样,O和0长得一样,不注意就会导致错误。 (4) variance(a)计算的是数组a的方差,方差不是均方根! (5) 查看结构体的属性要用 IDL help,a,/str 用 IDL help,a 看不到结构体中的变量名。 示例程序 tut1.pro tut2.pro tut3.pro tut4.pro
个人分类: 知识|18148 次阅读|2 个评论
《编程人生:15位软件先驱访谈录》(2/2)
businessman 2013-4-10 17:46
2013 年 4 月 10 日(Peter Seibel Donald Knuth ) ________________________________________________________________________________________ (28)达特茅斯学院也许是选择了一条正确的道路,或者说更功利的选择。个中滋味,也许只有达特茅斯学院知道。也许学院在计算机科学的没落正是由于人工智能逐渐没落。 (29)斯坦福大学(Stanford University)由铁路大享、前加州州长利兰·斯坦福(LeLand Stanford)和他的妻子简·斯坦福(Jane Stanford)于 1884 年为纪念他们夭折的独子而建立。硅谷的繁荣与斯坦福大学密不可分,很多著名公司比如谷歌、雅虎、惠普、NVIDIA 的创始人都是斯坦福校友,1951 年创建斯坦福研究院区并鼓励学生和教师创业的副校长弗雷德里克·特曼也被誉为“硅谷之父”。从这一意义上说,斯坦福堪称 IT 产业的发源地。 (30)不变式是指这样的断言:执行一系列操作前,该断言为真,而在执行它们后,该断言仍然为真。虽然程序由各种变量组成,但对于程序设计来说,认清哪些条件保持不变也十分重要。这有助于我们理解程序中的逻辑。不变式,就是规定不变条件、对其验证以保持程序逻辑正确的断言,广泛应用于编译优化、契约式设计、形式化验证程序正确性等领域中。 (31)这里的自底向上和自顶向下指的是两种程序设计方法。自底向上的设计是从具体到抽象,从问题域中已确定的具体操作开始,逐级向上构造更高层次、更抽象的操作;自顶向下的设计是从抽象到具体,从最高层次的、整体性的问题描述开始,逐渐向下构造出各种较低层次的具体操作。前者对分析和设计的要求较低,可迅速从局部开始编码,但最后可能会得到一些与整体需求不符的模块模块;后者在分析和设计阶段对问题进行了良好的定义与验证,具有较好的通用性,但最后可能无法完全匹配底层操作。实际设计中,往往把这两种方法结合在一起使用。从更为广义的层面上说,它们代表的是两种不同的思维方式和方法论,可以应用于程序设计之外的各个领域中。 (32)Jon Bentley 是在编程技术和算法设计等领域颇有成就的计算机科学家。他写的《编程珠玑》一书堪称经典之作,该书书名和文章均取自于他在《ACM 通讯》上的同名专栏。Knuth 曾于 1986 年 5 月在该专栏和 Bentley 联名发表过一篇介绍文学编程的文章。值得一提的是,Bentley 在卡内基梅隆大学当助理教授时教过的学生之中,后来也有很多成为知名科学家,“Java之父” James Gosling、Java Collections 框架的实现者以及多本 Java 畅销书作者 Joshua Bloch、Tcl 语言的发明者 John Ousterhout、《算法导论》的合著者之一 Charles Leiserson 均堪称其中翘楚。 (33)布尔决策图(Boolean Decision Diagram),也称二元决策图(binary decision diagram)或分支式程序(branching program),是一种用来表示布尔函数的数据结构。它以有根有向无环图的形式表现出来,由若干代表布尔变量的判定结点和两个代表二元最终结果 0 和 1 的子结点构成,其中每一个判定结点都有两个子结点,代表布尔变量两种不同的选择 0 和 1.使用布尔决策图,我们可以轻松完成各种布尔函数的操作,并且能够压缩布尔决策图,因此布尔决策图也可看作布尔函数的规范形式。实际应用中,布尔决策图常用于电子电路的逻辑合成以及计算机软、硬件的形式验证等方面。
个人分类: 博文备份|125 次阅读|0 个评论
Java Web 编程 --从入门到实践
lifengli 2013-3-28 15:25
第2章搭建JavaWeb开发环境 1、下载安装JDK并配置环境变量 登录Java官方网站,下载JDK; 设置PATH环境变量;设置CLASSPATH环境变量;设置JAVA_HOME环境变量 2、用HelloWorld例子体验java编译和运行 创建HelloWorld.java文件 publicclassHelloWorld{ publicstaticvoidmain(Stringargs[])throwsException{ System.out.println(HelloJAVAworld!); } } 3、下载安装并测试tomcat服务器 tomcat官方网站 http://tomcat.apache.org/ 安装tomcat; 通过一个JSP文件测试Tomcat; 创建一个helloworld.jsp %@pagelanguage=javaimport=java.util.*pageEncoding=ISO-8859-1% !DOCTYPEHTMLPUBLIC-//W3C//DTDHTML4.01Transitional//EN html head titleMyJSP'index.jsp'startingpage/title /head body ThisismyJSPpage.br /body /html 4、安装MySQL数据库 安装数据库;安装数据库的JDBC驱动程序(复制mysql-connector-Java-5.1.1-bin.jar文件到/WEB-INF/lib目录下,这样就可以用它去连接MySQL数据库了); 一个JSP+MySQL的JavaWeb程序: %@pagecontentType=text/html;charset=UTF-8language=javaimport=java.sql.*,java.io.*% html head /head body center往数据库中添加数据:hr % try{ //装载驱动程序 Class.forName(com.sql.jdbc.Driver).newInstance(); //创建连接 Connectioncon=DriverManager.getConnection(jdbc:mysql://127.0.0.1:3306/ch2,root,abcd1234!); //创建执行语句 Statementstmt=con.createStatement(); stmt.execute(insertintouser(username,password)values('liuwei','111111')); //关闭连接、释放资源 stmt.close(); con.close(); out.println(添加数据成功); }catch(Exceptione){//如果出现异常,将错误信息打印到控制台 e.printStackTrace(); } % /center /body /html
1 次阅读|0 个评论
[转载]vc+opengl编程unresolved external symbol 报错处理
meigang 2013-3-27 16:18
做ComputerGraphics课的实验时,编译时总报如下错误: unresolvedexternalsymbol __imp____glutInitWithExit@12 unresolvedexternalsymbol __imp____glutCreateWindowWithExit@8 百度了一下找到了解决方法,方法如下 在#includeglut.h之前加入以上代码: #defineGLUT_DISABLE_ATEXIT_HACK 如: 正确用法 #includestdafx.h #includewindows.h #defineGLUT_DISABLE_ATEXIT_HACK #includeglglut.h 但是,如果更改顺序如下就仍然会报相同的错误: 错误用法 #defineGLUT_DISABLE_ATEXIT_HACK #includestdafx.h #includewindows.h #includeglglut.h
2656 次阅读|0 个评论
使用多核CPU,并行编程超简单。(OpenMP的Windows & Linux 例子)
热度 1 bigdataage 2013-3-19 16:43
使用多核CPU,并行编程超简单! OpenMP提供了对 并行算法 的高层的抽象描述, 程序员 通过在 源代码 中加入专用的pragma来指明自己的意图,由此 编译器 可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非 共享内存 系统(如 计算机集群 )上使用,在这样的系统上,MPI使用较多。 当然,还有一个更简单的方法就是使用Go语言。 Windows 例子( Visual Studio,C语言) 我用的是 Windows系统(Win8)的双核台式机 , 用 C语言写源代码, 以Visual Studio 2012为编译器。打开 Visual Studio 2012, 需要在建立工程后,点击 菜单栏-Project-Properties,弹出菜单里,点击 Configuration Properties-C/C++-Language-OpenMP Support,在下拉菜单里选择Yes。然后才能使用OpenMP。 下面以并行代码为例,只需要把相应的行注释掉,就是串行代码了!下同。 第一个例子(example_1.c): 增加一行代码#pragma omp parallel,然后用花括号把你需要放在并行区内的语句括起来,并行区就创建好了。 默认情况下,并行区内线程数=系统中核的个数。 并行区里每个线程都会去执行并行区中的代码。故对于双核电脑, 并行区中的代码会被执行2次,当然若有输出语句,结果也会被输出2次 。 运行example_1.c, 会发现 并行区里面的语句会被执行2次(我的电脑是2核的 ), 多次运行,会发现各次运行的结果会不一样,打印到屏幕上结果的顺序是不一定的,这个符合多线程程序的特性。 当然, 运行过程中也可以观察到CPU的使用率是100%. 我运行了2次,结果不同,如下所示: 第二个例子(example_2.c): example_1.c中并行区里每个线程执行的代码是一样的,计算机若有N个核,相当于同时重复执行了N次,并没有提高效率、节省时间。我们希望的是把同一工作分配给不同线程来做,每个线程完成一部分,这样运行速率才会快。 #pragma omp for 使用这个语句,就可以把一个for循环的工作量分配给不同线程。这个语句后面必须紧跟一个for循环,它只能对循环的工作量进行划分、分配。 可以把多行openmp pragma合并成一行, #pragma omp parallel, #pragma omp for 合并成一行#pragma omp parallel for , 合并后的程序如下: 并行计算的运行用了16.415秒。 把第11行(#pragma omp parallel for)注释以后, 就成为了传统的串行计算,运行用了29.116秒。 双核运行的时间大约缩短为单核的二分之一,说明OpenMP还是很强大的。运行过程中也可以观察到CPU的使用率是100%. Linux 例子(GCC,C语言) 源代码和Windows 中的 差不多,用 GCC 编译时加上 -fopenmp 就可以了. 未完待续。 2013年6月1号 以后继续纠结这个问题。没办法,又要写英文的期刊论文,又要写硕士毕业论文。 参考: http://www.openmp.org http://baike.baidu.com/view/1687659.htm http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html http://linux.chinaunix.net/techdoc/develop/2006/10/19/942441.shtml http://www.rosoo.net/a/201111/15347.html http://hi.baidu.com/diwulechao/item/bc6d865c411b813c32e0a932 http://baike.baidu.com/view/3674653.htm http://baike.baidu.com/view/1516611.htm Go语言相关网站: http://code.google.com/p/go/ http://go-lang.cat-v.org/ http://code.google.com/p/golang-china/ http://zh.golanger.com/ http://tieba.baidu.com/f?kw=go%D3%EF%D1%D4fr=ala0 http://studygolang.com/
26458 次阅读|1 个评论
[转载]Unix哲学
deliangwang 2013-3-2 01:00
Unix编程艺术 主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。此文大致摘录了Unix的哲学。 web程序员也应该看看此书,软件开发和web开发很多地方都是相通的。看完之后,我甚至觉得Unix哲学对于做人也有很大的参考价值。 模块原则 (使用简洁的接口拼合简单的部件) 计算机编程的本质就是控制复杂度 要编写复杂软件而又不至于一败涂地的唯一方法就是降低其整体复杂度——用清晰的接口把若干简单的模块组合成一个复杂的软件。如此一来,多数问题只会局限于某个局部,那么就还有希望对局部进行改进而不至牵动全身。 清晰原则 (清晰胜于技巧) 维护成本是高昂的,在写程序时,要想到你不是写给执行代码的计算机看的,而是给人——将来阅读维护源码的人,包括你自己看的。 在Unix传统中,这个建议不仅意味着代码注释。良好的Unix实践同样信奉在选择算法和实现时就应该考虑到将来的可扩展性。为了取得程序一丁点性能的提升就大幅增加技术的复杂性和晦涩性,这个买卖做不得——这不仅仅是因为复杂的代码容易滋生bug,也因为它会使日后的阅读和维护工作更加艰难。 组合原则 (设计时考虑拼接组合) 如果程序彼此之间不能有效通信,那么软件就难免会陷入复杂度的泥淖。 在输入方面,Unix传统极力提倡采用简单、文本化、面向流、设备无关的格式。在经典的Unix下,多数程序都尽可能采用简单过滤器的形式,即将一个简单的文本输入流处理为一个简单的文本流输出。 Unix程序员偏爱这种做法并不是因为它们仇视视图界面,而是因为如果程序不采用简单的文本输入输出流,它们就极难衔接。 要想让程序具有组合性,就要使程序彼此独立。在文本流这一端的程序应该尽可能不要考虑到文本流另一端的程序。 分离原则 (策略同机制分离,接口同引擎分离) 把策略同机制揉成一团有两个负面影响:一来会使策略变得死板,难以适应用户需求的改变,二来也意味着任何策略的改变都可能会动摇机制。 可以将应用程序分成可以协作的前端和后端进程,通过socket专用应用协议进行通讯。这种双端设计方法大大降低了整体复杂度,bug有望减少。 简洁原则 (设计要简洁,复杂度能低就低) 来自多方面的压力常常会让程序变得复杂(bug更多),其中一种压力就是来自技术上的虚荣心理。Unix程序员相互比的是谁能够做到"简洁而漂亮"并以此为荣。 更为常见的是,过度的复杂性往往来自于项目的需求,要避免这种状况,就需要鼓励一种软件文化,以简洁为美,人人对庞大复杂的东西群起而攻之。 吝啬原则 (除非确无它法,不要编写庞大的程序) "大"有两重含义:体积大,复杂程度高。程序大了,维护起来就困难。由于人们对花费了大量精力才做出来的东西难以割舍,结果导致在庞大的程序中把投资浪费的注定要失败或者并非最佳的方案上。 透明原则 (设计要可见,以便审查和调试) 软件系统的透明性是指你一眼就能够看出软件是在做什么以及怎样做的。显示性是指程序带有监视和显示内部状态的功能。 设计时如果充分考虑到这些要求会给整个项目全过程都带来好处。至少,调试选项的设置应该尽量不要在事后,而应该在设计之初便考虑进去。这是考虑到程序不但应该能够展示其正确性,也应该能够把原开发者解决问题的思维模型告诉后来者。 程序如果要展示其正确性,应该使用足够简单的输入输出格式,这样才能保证很容易地检验有效输入和正确输出之间的关系是否正确。 出于充分考虑透明性和显见性的目的,还应该提倡接口简洁,以方便其他程序对它进行操作。 健壮原则 (健壮源于透明与简洁) 软件的健壮性指软件不仅能在正常情况下运行良好,而且在超出设计者设想的意外条件下也能够运行良好。 大多数软件禁不起磕碰,毛病很多,就是因为过于复杂,很难通盘考虑。如果不能够正确理解一个程序的逻辑,就不能确信其是否正确,也就不能在出错时修复它。 这也就带来了让程序健壮的方法,就是让程序的内部逻辑更易于理解。要做到这一点主要有两种方法:透明化和简洁化。 上面曾说过,软件的透明性就是指一眼就能够看出是怎么回事,即人们不需要绞尽脑汁就能够推断出所有可能的情况,那么这个程序就是简洁的。程序越简洁,越透明,也就越健壮。 表示原则 (把知识代入数据以求逻辑质朴而健壮) 数据要比程序逻辑更容易驾驭。所以如果要在复杂数据和复杂代码中选择一个,宁愿选择前者。更进一步:在设计中,应该主动将代码的复杂度转移到数据中去。 通俗原则 (接口避免标新立异) 最易用的程序就是用户需要学习新东西最少的程序,换句话说最易用的程序就是最切合用户已有知识的程序。 缄默原则 (无话可说?那就沉默) 行为良好的程序应该默默工作,绝不唠唠叨叨,碍手碍脚。沉默是金。 简洁是Unix程序的核心风格。一旦程序的输出成为另一个程序的输入,就要很容易把需要的数据挑出来。站在人的角度上来说,重要的信息不应该混杂在冗长的程序内部行为信息中。 补救原则 (出现异常时,马上退出并给出足够错误信息) 软件在发生错误时也应该与在正常操作的情况下一样,有透明的逻辑。最理想的情况当然是软件能够适应和应付非正常操作;而如果补救措施明明没有成功,却悄无声息地埋下崩溃的隐患,这就是最坏的情况了。 宽容地收,谨慎地发。就算输入的数据很不规范,一个设计良好的程序也会尽量领会其中的意义,以尽量与别的程序协作。然后要么抛出异常,要么为工作链的下一环程序输出一个严谨干净正确的数据。 经济原则 (宁花机器一分,不花程序员一秒) 随着技术的发展,开发公司和大多数用户都能得到廉价的机器,所以这一准则的合理性就显然不用多说了。 如果我们在软件开发中严格遵循这条原则的话,大多数的应用场合应该使用高级语言,如Perl,Python,Java,Php,甚至Shell——这些语言可以将程序员从自行管理内存的负担中释放出来。 生成原则 (避免手工hack,尽量编写程序去生成程序) 人类很不善于干辛苦的细节工作。因此程序中任何手工hacking都是滋生错误和延误的温床。程序规格越简单越抽象,设计者就越容易做对。 优化原则 (过早优化是万恶之源) 还不知道瓶颈所在就匆忙进行优化,这可能是唯一一个比乱加功能更加损害设计的错误。从畸形的代码到杂乱无章的数据布局,牺牲透明性和简洁性而片面追求速度、内存或者磁盘使用的后果随处可见。 先制作原型,再精雕细琢。优化之前先确保能用。"极限编程"宗师Kent Beck从另一种不同的文化将这点有效地扩展为:先求运行,再求正确,最后求快。 借助原型化找出哪些功能不必实现,有助于对性能进行优化;那些不用写的代码显然无须优化。 多样原则 (绝不相信所谓"不二法门"的断言) Unix传统有一点很好,即从不相信任何所谓的"不二法门"。Unix奉行的是广泛采用多种语言、开放的可扩展系统和用户定制机制。 扩展原则 (设计着眼未来,未来总比预想来得快) 要为数据格式和代码留下扩展的空间,否则就会发现自己常常被原先不明智选择捆住了手脚,因为你无法既要改变它们又要维持对原来的兼容性。 设计协议或是文本格式时,应使其具有充分的自描述性以便可以扩展。要么包含进一个版本号,要么采用独立、自描述的语句、按照可以随时插入新的而不会搞乱格式读取代码的方法组织格式。 Unix哲学一言以蔽之 信息来源:http://blog.leezhong.com/reading/2010/12/21/the-art-of-unix-programming.html
1666 次阅读|0 个评论
VC++ MFC的编程模型
baibing 2013-1-25 17:34
VC++ MFC的编程模型
个人分类: 学习随笔|0 个评论
一得集[II]:《计算机和计算:基于Code::Block的C编程实训》
mLinking 2013-1-1 11:52
尝试围绕搜索引擎来展示编程, 让学生更进一步地理解"所谓编程的规律活动", 并且体验不同层次的变成形式, 激发他们后续学习的欲望. 探讨一下"展示型教学" 内容分作如下几部分: 引言, 搜索引擎简介 之 所以选择搜索引擎作为复杂程序实现的解剖案例, 是因为它的概念并不难理解 (可参照图像处理的复杂度) - 不需要复杂的计算公式, 也不需要反复的架构体系. 这样一来, 就可以专注于如何使用编程技巧来尝试不同层次的实现, 易于学生将精力集中于领会"何为编程". 这一部分是作为《计算机和计算:概述》一书的实训来设计的, 实施的思路我倾向如下的方式. 讲解不同版本的搜索引擎的机制, 给出对应版本的代码框架 围绕如何表达所需要的数据及所需要的操作介绍部分代码的设计与实现 之后提供给学生相关的代码, 然后要求他们使用那些代码填充(Fulfill)入代码框架 凡是完成代码框架的学生即得到基本分数;若想得到满分,则需要完成... 简版搜索引擎的实现 - MemSE 在《计算机和计算:概述》中“字符串中提取单词”, “线性链表及其操作”和“结构体数组及其操作”的基础上, 完成简版搜索引擎, 即返回包含所有给定关键字的文档集合 对应的数据结构采取"哈希链表" 支持排序的搜索引擎的实现 - MemTFIDFSE 显 然人们更熟悉的搜索引擎并非只是包含关键字的文档而已, 而是那些更为"相似"的文档集合. 那么如何测度文档的相似性呢? 在搜索引擎中广泛使用的是VSM (Vector Space Model)模型和TF*IDF (Term Frequency - Inverse Document Frequency)公式. 为了支持 TF*IDF 的计算, 自然要修改前面的"哈希链表"以保存必要的信息 FileSE 前面的两个版本基本上能够帮助学生理解搜索引擎的工作机制, 但是, 更为贴近实际的搜索引擎还应该能够支持文件 - 不仅是应该能够从文件中提炼单词完成文档比对, 而且还应该实现将"哈希链表"以文件的形式永久保存-这样才可以实现大规模数据的存储:内存总是会不够的 必然涉及文件的读写和更新, 而保存"哈希链表"是帮助学生熟悉这些的不错案例 在此基础上, 可引出数据库管理系统的实现思路 支持网络功能的搜索引起的实现 - CSCLISE 如果只是能够搜索本地的文档, 显然不是真正意义的搜索引擎, 因为提供搜索服务的系统是在另外一台机器上, 那么, 就需要网络编程的技巧. 此版本将之前的转换为C/S (Client/Server) 架构, 但是, 客户端是CLI (Command Line Interface) 这一古老风格 CSGUISE 软件开发到现今, GUI (Graphic User Interface) 的操控方式已经成为基本的潮流 - 用户可以通过图标、菜单等来直观地知晓要运行的程序和要进行的操作, 并且通过鼠标来直观地告知程序需要完成的操作指令 本部分是将客户端由CLI变成GUI, 进一步让学生体会复杂编程仍然是那些步骤规律 - 只是很多操作换成了现成函数的调用而已 BSSE 大 家都熟悉的搜索引擎, 如Google, Bing, BaiDu 等等, 操作模式都是通过浏览器来访问搜索引擎服务. 此处就是展示如何通过C语言的CGI (Common Gateway Interface) 技术来将搜索引擎服务转换为可提供浏览器访问, 实现动态网页显示灯功能 可进一步介绍其他的Web 服务器语言 - ASP, JSP, PHP, Python等 distributedSE 有 了网络功能后的搜索引擎, 其实一定意义上就已经具备了分布式特征, 但是此处的分布式指的是服务器端数据的分布 - 因为文档非常多, 整理出来的特征数据也会非常庞大, 都放在一台机器上不太可行 (Google日索引数据量), 那么, 将庞大的数据分布到多态机器上, 并能够提供统一的访问入口, 也就成为必然的思路 这里也就需要将前面的"哈希链表"结构进一步调整 可进而介绍云计算(Clouding Computing)的概念, 和现在火热的MapReduce/Hadoop框架 La V.I.T.A "La Vita", 是法语里生活的意思, 倒也是跟当前搜索引擎的广泛使用贴切 - 确实已进入人们的广泛生活 这 一部分作为汇总和扩展. 首先介绍 La V.I.T.A的意思 - 即现在搜索引擎进一步会扩展至Video, Image, Text, 和 Audio数据; 然后向学生介绍进一步陈述搜索引擎的通用框架 - 特征提取-- 存储+索引 -- 查询处理; 进而以图像搜索引擎为例讲解工作机制 最后, 有一部很值得看的感人的电影, 名字就是 "La Vita est belle", 算是结语.
个人分类: 生活中的计算|2874 次阅读|0 个评论
[转载]基于VS2008和Matlab R2010b版本的混合编程的实现
grapeson 2012-12-26 11:29
众所周知Matlab的强大运算能力让各种工程软件望而却步,而VC程序的友好界面又让人爱不释手,如果能够让两者的优势结合起来的话,势必能让程序员欢欣鼓舞。还好MathWorks已经为我们想到了,基本上现在市面上主流的Matlab版本都可以支持VC和Matlab的混合编程。但是目前网上资料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的实现方法有所不同,因此笔者通过不断的尝试和研究,终于调试通了基于VS2008和Matlab R2010b的混合编程。 为了更加直观的说明如何实现混合编程,笔者写了一个简单的程序作为测试。先在Matlab里面写一个M文件,代码如下: function b = MyFunc(a) b = a.*a; 将M文件保存为MyFunc.m,保存在F:/test文件夹中。然后在Matlab主窗口中将当前文件夹改为F:/test: cd F:/test; 为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码: mbuild –setup 然后出现 Please choose your compiler for building standalone MATLAB applications: Would you like mbuild to locate installed compilers /n? 键入y后回车,出现 Select a compiler: Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2010b\sys\lcc Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0 None Compiler: 由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现 Please verify your choices: Compiler: Microsoft Visual C++ 2008 SP1 Location: D:\Program Files\Microsoft Visual Studio 9.0 Are these correct /n? 确定,键入y后回车,出现 **************************************************************************** Warning: Applications/components generated using Microsoft Visual Studio 2008 require that the Microsoft Visual Studio 2008 run-time libraries be available on the computer used for deployment. To redistribute your applications/components, be sure that the deployment machine has these run-time libraries. **************************************************************************** Trying to update options file: C:\Users\张智宇\AppData\Roaming\MathWorks\MATLAB\R2010b\compopts.bat From template:D:\PROGRA~1\MATLAB\R2010b\bin\win32\mbuildopts\msvc90compp.bat Done . . . 如果出现以上说明,则证明Matlab编译器设置成功了。接下来是生成M文件的DLL文件。 在Matlab主窗口中键入如下代码 mmc –W cpplib:MyDLL –T link:lib MyFunc.m –C 其中cpplib:后面的是需要生成文件的文件名,是自己取的,link:lib后面的MyFunc.m是转换为DLL的M文件的文件名。-W/-T/-C是参数,具体含义可以通过mcc –help命令查看,注意参数的大小写。 Matlab编译后会在Test文件夹下生成9个文件,分别是: mccEcxludedFiles.log MyDLL.cpp MyDLL.ctf MyDLL.dll MyDLL.exp MyDLL.exports MyDLL.h MyDLL.lib readme.txt 其中MyDLL.dll,MyDLL.lib,MyDLL.ctf,MyDLL.h是我们需要的文件,至此,Matlab方面就已经设置妥当了。 打开VC2008,新建一个工程,然后将上述四个文件复制到工程目录下。选择“工具-选项-项目和解决方案-VC++目录”,在“显示以下内容目录”里选择“包含文件”将“D:\Program Files\MATLAB\R2010b\extern\include”添加进去,然后选择“库文件”将“D:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft”添加进去,其中D:\Program Files是Matlab的安装目录,可根据实际情况进行修改。 然后选择“项目-属性-配置属性-链接器-输入”,在右边“附加依赖项”一栏填入“myDLL.lib mclmcrrt.lib”,其中MyDLL.lib就是刚刚用Matlab生成的lib文件。 在编写代码时首先得包含头文件“MyDLL.h”,然后开始编写需要的代码,我为了说明问题编写了一个测试代码如下所示: { MyDLLInitialize();//初始化DLL动态连接文件 double _x = {1,2,3,4,5};//输入数组 double _y ;//输出数组 mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL);//创建1*5矩阵 memcpy(mxGetPr(x), (void*)_x, sizeof(_x));//拷贝输入数据 mxArray *input = {x};//将矩阵x的指针作为输入参数传递进去 mxArray *output ;//定义输出参数指针 mlxMyFunc(1,output,1,input);//调用m函数 mxArray *y;//定义输出结果指针 y = output ;//将输出参数传递给输出结果 memcpy(_y, mxGetPr(y), sizeof(_y));//拷贝输出数据 MyDLLTerminate();//结束DLL库 //显示数组中的数据 CString str; str.Format("%f %f %f %f %f",_y ,_y ,_y ,_y ,_y ); MessageBox(str); } 其中MyDLLInitialize(),mlxMyFunc(),MyDLLTerminate()等函数可以在MyDLL.h中找到函数原型,mlxMyFunc函数原型为: mlxMyFunc(int nlhs, mxArray *plhs ) nlhs代表输出参数个数,plhs 中存放的是输入参数的指针。上例中由于输入输出参数只有一个,因此在plhs 中存放的就是M文件中b的指针,prhs 中存放的就是M文件中a的指针。 编译运行之后就可以在弹出的消息框中得到所要的结果。将项目文件夹下生成的可执行文件复制出来,将MyDLL.dll文件、MyDLL.ctf文件和.exe文件放在同一目录下便可脱离VC++独立运行。如果需要在其他未装Matlab的机器上运行,则还需要将“D:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32”中的MCRInstaller.exe复制出来,在未安装Matlab的电脑上运行此程序,才可使得刚刚生成的可执行文件顺利运行。 以上程序在Windows 7家庭普通版+ Visual Studio 2008专业版SP1 + Matlab R2010b下编译运行通过。
2697 次阅读|0 个评论
多线程编程
grapeson 2012-12-8 22:53
53 次阅读|0 个评论
[转载]OpenGL与MFC编程思想
热度 1 dutren 2012-10-21 20:08
分享 OpenGL与MFC编程思想(转别人的,别误会哦!!!) OpenGL与MFC编程思想 2009-05-02 16:39 花了两天时间终于把MFC与OpenGL的相关技术学会了,现在可以方便的绘制三维图形了,小结一下。 一、资料的选取 网上的资料多如牛毛,但精华较少,错误百出,误人子弟。经过精心挑选选择以下几项足以。 1、 MSDN上的CUBE示例:说明OpenGL应用程序。这个最有研究价值,但就是缺少注释和理论说明,需要自己一点点咀嚼代码。 这个demo虽然比较小,但制作的比较精细,很多细节处理的较好,很多技巧非常值得学习。microsoft bull-man! 2、用Visual C++ 6实现OpenGL编程, http://www.yesky.com/185/1817185.shtml 这个例子说的比较详细,连怎样操作VC都有了,初级的理论也说了一些,适合入门。但后面说3D的好像有点错误,另外屏幕闪烁的解决方法不彻底,没有完全消除(不是openGL的问题,是MFC消息循环的问题没处理好)。 3、OpenGL轻松入门: http://soft.yesky.com/lesson/374/2410874.shtml 一本讲述基本原理的书 看过以上几个资料,再见上MSDN的手册,就可以轻松使用OpenGL绘制三维图形了! 二、使用OpenGL与MFC绘图的基本思路 1、绘图环境的建立(最好放在OnCreate(LPCREATESTRUCT lpCreateStruct)中) WINDOWS的GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")来绘图。GDI中的每一个命令需要传给它一个DC,而OpenGL是使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,所有在此线程中的OpenGL命令都使用相同的当前RC。这样我们要做的工作就是建立OpenGL的RC,并把RC同GDI的DC连接起来,这样OpenGL就可以开始绘图了。步骤如下: A:设置窗口像素格式。(使用PIXELFORMATDESCRIPTOR、ChoosePixelFormat()、DescribePixelFormat()、SetPixelFormat()等完成) B:产生RC。(使用wglCreateContext()完成) C:设置当前的RC,并同DC连接起来。(使用wglMakeCurrent()完成) 产生RC是非常耗费资源和时间的一件事情,因此最好系统启动时产生,关闭时释放。 释放RC的操作如下(最好放在OnDestroy()中): HGLRC hrc=wglGetCurrentContext(); if(hrc!=NULL) { // make the rendering context not current wglMakeCurrent(NULL, NULL) ; wglDeleteContext(hrc); } 至此,绘图环境准备好了,可以开始绘图了! 2、三维图绘制的过程 三维图绘制好后,要在二维的屏幕上显示,因此要经过几次变换才能达到这样的结果。OpenGL多使用矩阵变换来实现。过程如下: A:进行视点变换,选择一个观察点来观察物体。 B:进行模型变换,把要观察的模型(物体)通过平移、旋转、缩放等操作放置到一个合适的观察位置 C:进行投影变换,观察点和物体都设置好后,就可以投影在一个平面上。 D:进行视口变换,对投影的结果进行裁剪,决定显示的大小、位置等。 以上变换都是以矩阵的运算实现的,OpenGL会自己完成,我们只要通过函数把每种变换的参数设置好就可以了。 每种变换都通过哪些函数完成,查阅OpenGL相关资料即可,网上很多。 3、图形的绘制及显示 我们真正要做的工作就是利用OpenGL提供的命令,来绘制各种三维图形,然后选取合适的视角来观察并显示物体即可。 OpenGL绘制图形的命令很多,也非常丰富,只有不断地积累才能绘出适用的三维图形。 4、MFC下屏幕显示的闪烁问题 我们知道,在窗口中拖动一个图形的时候,由于边画边显示,会出现闪烁的现象。在GDI中解决这个问题较为复杂,通过在内存中生成一个内存DC,绘画时让画笔在内存DC中画,画完后一次用Bitblt将内存DC“贴”到显示器上,就可解决闪烁的问题。在OpenGL中,我们是通过双缓存来解决这个问题的。一般来说,双缓存在图形工作软件中是很普遍的。双缓存是两个缓存,一个前台缓存、一个后台缓存。绘图先在后台缓存中画,画完后,交换到前台缓存,这样就不会有闪烁现象了。 A:将像素格式定义成支持双缓存的 pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE; B:在物体绘制完成后加入这样一行代码SwapBuffers(hDC),到此OpenGL绘图已经没有闪烁了,但MFC还会反复的重绘背景产生闪烁 C:处理消息循环OnEraseBkgnd,使其不要重绘背景 BOOL CoglView::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE; //return CView::OnEraseBkgnd(pDC); } 这样就彻底解决了闪烁问题! 至此,OpenGL已经能与MFC一起很好的工作了。接下来就是使用OpenGL的一些高级特性(光照、纹理等)来增强图形的显示效果了! 路漫漫其修远矣! show一个实例看看!
3966 次阅读|1 个评论
[转载]【Fortran】Fortran编程中常用的字符串操作
zhenghui2915 2012-10-14 20:34
转载地址: http://ty217051.blog.163.com/blog/static/1297903201001851158774/ 一位网友用两个连续的除号连接,出现了这样的警告: Warning: Expression does not contribute to result 。 程序为:(根据用户输入的文件数创建文件) programmain implicitnone integer::f,b character(len=80)::c,g,file write(*,*)"请输入总数:" read(*,"(i3)")f do b=1,f write(c,"(i3)")b g=".txt" file=c // g write(*,*)file enddo end 诊断:问题出现在c,g,和file的定义长度都为80,而c//g后长度为160了, 解决办法: 1----------------------------------------------- character(len=80)::c,g character(len=80)::file file=trim(c)//trim(g) 2----------------------------------------------- character(len=80)::c,g character (len=160)::file file=c//g 2-------------------------------------------------- programmain implicitnone integer::f,b character(len=80)::c,file write(*,*)"请输入总数:" read(*,"(i3)")f dob=1,f write(c,'(i3)')b !注意此处的用法,第一个参数c不是实例号,而是变量。 write(file,*) trim(c) ,".TXT" write(*,*)file enddo end 总结: 字符串可以出现在read和write语句中,即可以先将信息读入字符串中,对字符串处理后再读取相关的数据;相反要做一些特定格式的输出时,write语句的格式输出可能心有余而力不足,就可以先将数据write到字符串上,对字符串处理后再将字符串输出。注意fortran对字符串的处理和c不一样,c是以数据0补足字符串的,所以len算出来的就是字符串实际的长度;而fortran是以空格补足字符串的,所以要用len_trim计算字符串实际的长度。 以下是一些fortran处理字符串的函数,利用它们编程会快而简洁一些。 len 字符串的长度 trim 去掉字符串右边的空格 len_trim 不算字符串右边的空格的字符串的长度 lnblnk 字符串最后一个非空格的字符的位置 index/scan 寻找指定字符的在字符串出现的位置 verify 第一个非指定字符在字符串出现的位置 adjustl 移动字符串左对齐,去掉打头的空格 adjustr移动字符串右对齐,去掉尾部的空格 lge/lle 字符串大小对比 repeat 计算字符在字符串中重复出现的次数
个人分类: Fortran|12028 次阅读|0 个评论
有限元前处理编程
baibing 2012-9-11 15:17
1、FINITE ELEMENT MESH GENERATION B.H.V. Topping, J. Muylle, P. Iványi, R. Putanowicz and B. Cheng http://www.saxe-coburg.co.uk/pubs/descrip/mgn.htm source code: http://www.bhvt.org.uk/mgn/ 本教学程序的教学主页: http://perso.uhp-nancy.fr/guenego/cd-mesh/mesh/general/index.html 另一个关于该程序的很好资源页面 http://www.maxwell.sze.hu/~kuczmann/HPC/tutorials/tutorial1/ Professor Barry H.V. Topping 教授主页 http://www.bhvt.org.uk/ 2、Finite Element Mesh Generation http://www.isr.umd.edu/~austin/aladdin.d/fe-mesh.html 3、 Aladdin FEM toolkit http://www.isr.umd.edu/~austin/aladdin.html 4、Mesh Generation Grid Generation on the Web http://www.robertschneiders.de/meshgeneration/meshgeneration.html 5.Finite element mesh generation http://nmag.soton.ac.uk/nmag/0.2/manual/html/finite_element_mesh_generation.html 6、土木系统编程 http://www.isr.umd.edu/~austin
8 次阅读|0 个评论
[转载]Linux BASH编程(二)
热度 1 thismoment 2012-8-25 19:43
Linux BASH编程(二) 分类: Linux 2011-05-04 22:39 242人阅读 评论 (0) 收藏 举报 一个最简单的 helloworld 脚本程序如下: #!/bin/bash echo“Hello,world!” 脚本程序的第一行表示这是一 个 bash 脚本程序。之后是脚本 程序 的主体,包括 一条内建的 echo 命令。 将这个文件保存为 hello_world.sh ,在 BASH 下通过 file 命令可以查看到该文件的类型信息: :~/work/shell$filehello_world.sh hello_world.sh:Bourne-Againshellscripttextexecutable file 程序是如何识别出这是一个 BASH 可执行脚本文件的呢?其奥 秘就在于 hello_world.sh 的第一行。这一行对于 BASH 来说是一个注释行;而对于 Linux 来说却是一个 magic 信息。在 Linux 系统中,文件 /usr/share/misc/magic (不 同系统这个文件的位置可能不一样,可通过 manmagic 来确定)中包含了 file 命令用来检测文件类型信息的所有 magicpattern 。以下是从这个文件中摘取的部分信息: #bashshellmagic,fromPeterTobias(tobias@server.et-inf.fho-emden.de) 0string/b#!//bin/bashBourne-Againshellscripttextexecutable !:mimetext/x-shellscript 0string/b#!//usr/bin/bashBourne-Againshellscripttextexecutable !:mimetext/x-shellscript 0string/b#!//usr/local/bashBourne-Againshellscripttextexecutable !:mimetext/x-shellscript 0string/b#!//usr/local/bin/bashBourne-Againshellscripttextexecutable !:mimetext/x-shellscript 这些信息包括几个部分: l offset :即第一个字段。上面所摘的信息中,偏移都为 0 。表示检测文件类型时,从文件偏移 0 处开始读取的内容作为该文件的类型信息。 l type :即第二个字段。表示文件类型信息内容的 type 。以上所摘的信息中, type 都为 string/b 。 l 测试模板:即第三个字段。从文件中读取指定的类型信息后,用来跟这里的测试模板进行比较。如果相同,则文件类型匹配成功。从上面摘取的 信息可以看出,如果一个文件从偏移 0 开始是如下字符串之一,则该文件就被判定为 BASH 可执行脚本文件: n #!/bin/bash n #!/usr/bin/bash n #!/usr/local/bash n #!/usr/local/bin/bash 修改 hello_world.sh ,在第一行的开头加入 1 个空格。再用 file 命令查看,就会发现 file 命令不能将这个文件匹配为 BASH 脚本了。 :~/work/shell$cathello_world.sh #!/bin/bash echo"Hello,world!" exit0 :~/work/shell$filehello_world.sh hello_world.sh:ASCIItext 执行 hello_world.sh 的方法有以下几种: l 指定 shell ,并将脚本程序文件名作为 shell 的输入参数: :~/work/shell$bashhello_world.sh Hello,world! 采用这种方式时,其实是在当前 BASH 下执行一条带参数的 bash 命令。因此,会在当前 shell 下先启动一个子 shell 进程,并且这个子进程的参数为脚本程 序文件名。这个子进程以此执行外脚本程序中的命令后自动退出并返回父 shell 。 l 用 .(source) 命令在当前 shell 下执行: :~/work/shell$.hello_world.sh Hello,world! 采用这种方式时,脚本程序在当前 shell 下执行,不会启动子进程。 l 直接执行。为脚本程序文件增加可执行权限后直接执行: :~/work/shell$chmod+x./hello_world.sh :~/work/shell$./hello_world.sh Hello,world! 采用这种方式时,脚本程序中的第一行又起作用了。系统读 取第一行, #! 后面的部分被认为是该脚本所需要的解释器(即 Shell )。然后会启动这个解释器子进程,本例中就是 /bin/bash 子进程,并在这个子进程中执行脚本程序。 因此,对于第三种执行方式, shell 脚本中的第一行有着很大的作用,它表明了运行该脚本所需要的解释器。而对于第一中方式和第二种方式, 由于解释器已经明确地制定了,第一行仅仅是个注释行。下面再举两个例子。 输入如下脚本程序: :~/work/shell$catrmself.sh #!/bin/rm echoThiswillnotbeprinted 然后执行: :~/work/shell$chmod+x./rmself.sh :~/work/shell$./rmself.sh :~/work/shell$lsrmself.sh ls:cannotaccessrmself.sh:Nosuchfileordirectory 可见,执行完成后这个脚本自己被删除了。当敲入 ./rmself.sh 命令时,系统分析 rmself.sh 的第一行,发现它所需要的解 释器是 /bin/rm ,因此就会创建一个子进程 /bin/rm ,并且这个子进程的 第一个参数就是脚本程序名。因此其实就相当于执行了 /bin/rm./rmself.sh 所以就删除了脚本程序自己。 另外一个例子是打印自己的源代码: #!/bin/more echodummy exit0 执行结果: :~/work/shell$./showself.sh #!/bin/more echodummy exit0 但如果换种方式执行,则结果截然不同,原因前面已经分 析: :~/work/shell$bashshowself.sh dummy 分享到: 上一篇: Linux BASH编程(一)
6055 次阅读|1 个评论
皮肤细胞转化为血管 细胞编程领域向前迈进一步
oryzameng 2012-8-21 20:03
在体内外均可生成人造功能性血管 中国科学院上海生命科学研究院与英国伦敦帝国学院的研究人员采用源于人体皮肤细胞的干细胞首次在体外成功培育出人造功能性血管,并且还首次观察到将获得的干细胞植入动物体内能形成血管。未来这项新技术有望切实治疗人类最大的杀手之一——心脏病。该研究结果刊登在最新一期的美国《国家科学院学报》上。 研究人员将人体皮肤细胞的基因在实验室中进行“重新编程”,形成部分干细胞,并最终培育出功能性血管。英国心脏基金会教授徐庆博(音译)和该大学主席约翰•帕克都表示,这是个非常令人兴奋的研究,采用源于人体皮肤细胞的干细胞首次可以在人体外制成人造血管。 利用基因编程手段既可以将培育出的人造血管植入体内,以取代堵塞或损坏的血管,又可将“重新编程”的细胞注入人的腿部或心脏恢复血液流动。这种方法也可用于血液循环不畅通的糖尿病患者,以防止截肢。 在临床中,通过采用骨髓干细胞疗法治疗心脏病已经实现,然而,其长期有效性是比较低的,并且某些干细胞在被引入人体之后,有可能会形成肿瘤。新的研究表明,来源于皮肤细胞的部分干细胞在进入人体之前,可“重新编程”为血管细胞,且没有形成肿瘤的风险。 在动物实验中,他们把这些“重新编程”后获得的细胞注射到缺血的小腿(一条限制血流量的腿)中,结果腿部功能明显得到改善。研究人员说,新研究将带来患者自身的皮肤细胞转化成血管细胞来治疗血管堵塞类疾病的疗法,下一步将会把这种疗法用于测试治疗其他血管疾病。 由于心脏疾病正威胁着很多人的身心健康,这种疗法在个性化治疗方面将是一个重大进步。现在这还是一个早期的研究,但未来能够将“重新编程”的细胞注入受限血液流动的区域,或者将体外获得的全新血管移植入病人体内治疗严重的心血管疾病。此项研究合作者之一、英国心脏基金会研究顾问埃莱娜•威尔逊博士说:“这一突破是再生医学领域向前迈出的重要一步,但在将其用于临床之前,还需要进一步的研究和安全评估。” 该研究团队表示,从人体皮肤细胞中获得“部分多能干细胞”后,只需在短短4天就能直接将其转换成可以形成血管的一类细胞。而采用骨髓干细胞的方法需要较长时间,还会增加新的细胞形成肿瘤的几率。在未来,这一发现可能有助于心脏受损后的修复治疗;这些细胞也可用于药物筛选,以寻找治疗遗传性疾病的新疗法。 相关阅读: 皮肤细胞转化心肌细胞获验证 以色列科学家宣布,日前他们成功将取自老年心脏衰竭患者的皮肤细胞转化成了健康的心肌细胞。这些细胞已被证明能够发育成健康的心肌组织,并通过了大鼠移植实验的验证,类似疗法有望10年内在临床上获得应用。 负责该研究的以色列技术研究所研究员利奥尔•格普斯顿说,实验表明完全可以将采自心脏衰竭老年患者的皮肤细胞培育成健康的心肌细胞,而这种新培育出的心肌细胞几乎和患者刚出生时的心肌细胞无异,该疗法未来有望成为拯救心脏病患者的重要手段。 首次将鼠皮肤细胞直接转化为神经细胞 美国斯坦福大学医学院研究人员声称,他们在实验中绕过诱导性多能干细胞(iPSC)这一步骤,首次直接将实验鼠皮肤细胞转化为神经细胞。 研究人员首先选择了19个与细胞重组或神经发展有关的基因,然后利用慢病毒将这些基因植入来自实验鼠胚胎的皮肤细胞中。32天后,其中一些皮肤细胞开始向神经细胞转化。研究人员随后筛选出3个基因,并再次利用慢病毒将其植入来自成年实验鼠尾部的皮肤细胞。一周内,约20%的实验鼠皮肤细胞转化为神经细胞。这些神经细胞不但可以表达神经蛋白,而且可与实验室中的其他神经细胞形成突触。 人体皮肤细胞可直接转换成血液 加拿大研究人员宣称,他们绕过诱导多功能干细胞(iPS细胞)这一中间环节,直接将成人体皮肤细胞变为血液细胞,新方法对于理解细胞分化及再生医学研究均有重要意义。 加拿大麦克马斯特大学干细胞和癌症研究所主任米克•哈蒂亚领导的研究小组表示,临床试验可能于2012年展开,新方法或许意味着在可见的未来,那些因为手术或者贫血治疗等而需要血液的患者将能够使用自己的皮肤供血。 PNAS-2012-Margariti-1205526109.pdf
1645 次阅读|0 个评论
[转载]使用MATLAB引擎方式实现VC与MATLAB混合编程
thomaschoo2011 2012-7-22 17:50
(转)使用MATLAB引擎方式实现VC与MATLAB混合编程 2011-03-25 19:03 转自:http://www.ymlib.net/article/sort010/info-1631.html 使用MATLAB引擎方式实现VC与MATLAB混合编程的步骤如下: 1. 对于所有的使用MATLAB引擎方式实现VC与MATLAB混合编程的项目都得对VS2008当且仅进行一次如下设置: a. 打开VS2008—“工具”--“选项”--“项目和解决方案”--“VC++目录”à右边的“显示以下内容的目录”中选“包含文件”,在下面新建“D:\Program Files\MATLAB71\extern\include”。 b. 选“库文件”,在下面新建“D:\Program Files\MATLAB71\extern\lib\win32\microsoft”。 注:D:\Program Files\MATLAB71\为MATLAB的安装目录。 2. 新建Win32控制台程序,选“空项目”,项目名称为:“Exp_13_3_1”。 3. 配置项目属性(每一个项目都要配置),引入相应的MATLAB引擎链接库。右击“项目Exp_13_3_1”选“属性”--“配置属性”--“连接器”--“输入”的附加项中添加:“libmx.h libmat.h libeng.h”,各个文件之间以空格隔开。 4. 新建源文件。此例子的源文件名为:“EngineMain.cpp”,在里面添加代码。 a. 首先要添加#include engine.h头文件。 b. 然后定义引擎指针ep,mxArray变量指针。 c. 打开MATLAB引擎:ep=engOpen(NULL); d. 创建矩阵变量A,B,并将矩阵变量A写入到MATLAB引擎空间:engPutVariable(). e. 执行引擎命令:engEvalString(). f. 从引擎空间中读取执行结果:engGetVariable(). g. 释放矩阵空间:mxDestroyArray(A); h. 关闭MATLAB引擎:engClose(ep); 5. 运行程序便可。 EngineMain.cpp中的代码如下: //1 本实例是通过VC调用MATLAB引擎实现矩阵求逆运算的例子。 #include iostream #include iomanip using namespace std; #include engine.h //1 使用VC++和Matlab引擎混合编程就必须加这个头文件,它里面包含了matrix.h #include string.h void main() { // 定义循环变量 int i = 0, j = 0; // 状态变量 int nStatus = 0; // 定义MATLAB引擎指针 Engine *ep; // 定义mxArray变量指针 mxArray *A, *B; // 定义矩阵数组 // 注意:VC中矩阵的行列次序与MATLAB正好时相反,需要转置。 double arData = {{7.5,16.3,9.6},{13.2,8.9,12.3},{9.6,5.4,13.7}}; double arResData ; // 输出原矩阵 cout"原矩阵为:"endl; for(i = 0; i 3; i++) { for(j = 0; j 3; j++) { coutsetw(10)arData " "; } coutendl; } // 打开MATLAB引擎 ep = engOpen(NULL); //1 在Windows系统中该函数的参数都为“NULL”。 if(ep == NULL) { cout"无法打开MATLAB引擎。"endl; exit(EXIT_FAILURE); } // 是否显示MATLAB窗口:true-显示;false-隐藏。 //1 nStatus = engSetVisible(ep, true); //1 设为ture运行时也只是一闪而过 nStatus = engSetVisible(ep, true); if(nStatus != 0) { cout"设置MATLAB显示属性失败。"endl; exit(EXIT_FAILURE); } // 为mxArray变量分配空间 A = mxCreateDoubleMatrix(3,3,mxREAL); B = mxCreateDoubleMatrix(3,3,mxREAL); if(A == NULL || B == NULL) { cout"为mxArray变量分配空间失败。"endl; exit(EXIT_FAILURE); } // 将数组中的数据写入到mxArray空间中 memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData)); //1 使用内存数据复制函数memcpy进行复制 // 将矩阵变量A写入到MATLAB引擎空间 nStatus = engPutVariable(ep,"A",A); if(nStatus != 0) { cout"矩阵变量写入MATLAB引擎空间失败。"endl; exit(EXIT_FAILURE); } // 执行引擎命令求矩阵A的逆矩阵 nStatus = engEvalString(ep,"B=inv(A)"); //1 B=inv(A)为要在MATLAB中运行的命令参数 if(nStatus != 0) { cout"执行MATLAB引擎命令失败。"endl; exit(EXIT_FAILURE); } // 从MATLAB引擎空间中读取执行结果 B = engGetVariable(ep,"B"); // 将矩阵变量B复制到数组arResData中 memcpy((void*)arResData,(void*)mxGetPr(B),sizeof(arResData)); // 释放矩阵变量空间 mxDestroyArray(A); mxDestroyArray(B); // 关闭MATLAB引擎 engClose(ep); // 输出计算结果 cout"逆矩阵为:"endl; for(i = 0; i 3; i++) { for(j = 0; j 3; j++) { coutsetw(10)arResData " "; } coutendl; } // 暂停程序,查看结果 system("pause"); }
个人分类: 编程语言|3166 次阅读|0 个评论
简报:已完成《S7-200PLC编程及应用》(电力社)版前校
hncszwj 2012-6-15 11:29
版前校是指在出版社定稿审核和作者定稿校完成以后,由出版社发送清样,再由作者方面进行的出版前的校核。 目前,由中国电力出版社即将出版的《S7-200PLC编程及应用》工作进程大致如下: 一、主体内容已完成作者清样版前校(待书出版之后,将在这里“科研笔记”栏发布清样版前校的全部内容),已经进入版社版前一校,不久将进入版社版前二校; 二、封面使用高科技图片,估计是一立体感的控制器; 三、封底采用映山红素描并配上我的一首《江城子●可编程序控制器》,落款为 。 《江城子●可编程序控制器》 新型工业可编程,左牵轮,右擎门。 指令精髓,雕绘好征程。 为使国基添锦绣,亲设计,构长城。 高科铁电忆深盟,喜节能,许分层。 映像存取,恰似意根尘。 驾驭流程心浩荡,横四海,戮力增。 注解:①轮:指机轮;②门:指阀门;③长城:比喻能驱动机器按要求运转的一串指令而构成的程序;④铁电:指铁电存储器(FRAM),它将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结合在一起。⑤分层:指分层分布式计算机监控系统;⑥映像:指可编程序控制器的输入输出映像区和输入输出映像寄存器;⑦意根尘:借用佛教“六识(意)、六根、六尘”“十八界”词汇,六识发动六根而接触六尘,六尘映入六根而由六识判别及记忆保存,这里是说:可编程序控制器I/O映像区、映像寄存器相当于“六识”,I/O物理端子相当于“六根”,外围传感器输入信号的通道及所连被控设备相当于“六尘”;⑧戮力:合力、并力,这里指综合国力。
2631 次阅读|0 个评论
[转载]转载:matlab与C语言混合编程-----利用Mex函数
热度 1 liuzy2011 2012-6-8 10:27
部分转载自: http://www.ilovematlab.cn/thread-5576-1-1.html , http://hi.baidu.com/hyyly520/item/688b194be4be9509c11613a8 和 http://blog.csdn.net/raocong2010/article/details/6295859 mex程序就是根据一定的接口规范(mtlab提出的)编写的一个dll,Mex文件既可以用c,也可以用fortran来编。本文介绍的是用C编写的。 设置编译器路径 在Matlab 命令窗口键入 mex -setup,下面只要根据提示一步步设置就可以了。 为了测试你的路径设置正确与否,把下面的程序存为hello.c。 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs ) { mexPrintf("hello,world!\n"); } 假设你把hello.c放在了C:\TEST\下,在Matlab里用CD C:\TEST\ 将当前目录改为C:\TEST\(注意,仅将C:\TEST\加入搜索路径是没有用的)。现在敲: mex hello.c 如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:\TEST\加入了搜索路径,现在键入hello,程序会在屏幕上打出一行:hello,world! 看看C\TEST\目录下,你会发现多了一个文件:HELLO.DLL。说明Mex函数已经完成,编译成功 接口函数规范mexFunction介绍 voidmexFunction(intnlhs,mxArray*plhs ) nlhs:输出参数数目 plhs:指向输出参数的指针 nrhs:输入参数数目 例如,使用 =test(c,d,e) 调用mex函数test时,传给test的这三个参数分别是prhs =c,prhs =d,prhs =e 当函数返回时,将会把你放在plhs ,plhs 里的地址赋给a和b,达到返回数据的目的。 细心的你也许已经注意到,prhs 和plhs 都是指向类型mxArray类型数据的指针。这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在。当然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。 为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输 入参数的变化给出不同的屏幕输出: //hello.c2.0 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { inti; i=mxGetScalar(prhs ); if(i==1) mexPrintf("hello,world!\n"); else mexPrintf("大家好!\n"); } 将这个程序编译通过后,执行hello(1),屏幕上会打出: hello,world! 而hello(0)将会得到: 大家好! 现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除了用到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一个函数:mxGetScalar,调用方式如下: i=mxGetScalar(prhs ); "Scalar"就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的作用就是把通过prhs 传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序: //hello.c2.1 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { int*i; i=mxGetPr(prhs ); if(i ==1) mexPrintf("hello,world!\n"); else mexPrintf("大家好!\n"); } 这样,就通过mxGetPr函数从指向mxArray类型数据的prhs 获得了指向double类型的指针。 但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就没法对它进行计算。 为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行数和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来: //show.c1.0 #include"mex.h" #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { double*data; intM,N; inti,j; data=mxGetPr(prhs );//获得指向矩阵的指针 M=mxGetM(prhs );//获得矩阵的行数 N=mxGetN(prhs );//获得矩阵的列数 for(i=0;iM;i++) {for(j=0;jN;j++) mexPrintf("%4.3f",data ); mexPrintf("\n"); } } 编译完成后,用下面的命令测试一下: a=1:10; b= ; show(a) show(b) 需要注意的是, 在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组data后对应于data 。输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同一个地址空间,因而在prhs 中传递出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请,函数原型如下: mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag) m:待申请矩阵的行数 n:待申请矩阵的列数 为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs , intnrhs,constmxArray*prhs ); M=mxGetM(prhs ); N=mxGetN(prhs ); plhs =mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs ); for(i=0;iM;i++) for(j=0;jN;j++) outData =inData ; } 当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到的一些函数,其余的详细情况清参考Apiref.pdf。 通过前面两部分的介绍,大家对参数的输入和输出方法应该有了基本的了解。具备了这些知识,就能够满足一般的编程需要了。但这些程序还有些小的缺陷,以前面介绍的re由于前面的例程中没有对输入、输出参数的数目及类型进行检查,导致程序的容错性很差,以下程序则容错性较好 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { double*inData; double*outData; intM,N; //异常处理 //异常处理 if(nrhs!=1) mexErrMsgTxt("USAGE:b=reverse(a)\n"); if(!mxIsDouble(prhs )) mexErrMsgTxt("theInputMatrixmustbedouble!\n"); inData=mxGetPr(prhs ); M=mxGetM(prhs ); N=mxGetN(prhs ); plhs =mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs ); for(i=0;iM;i++) for(j=0;jN;j++) outData =inData ; } 在上面的异常处理中,使用了两个新的函数:mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在给出出错提示的同时退出当前程序的运行。MxIsDouble则用于判断mxArray中的数据是否double类型。当然Matlab还提供了许多用于判断其他数据类型的函数,这里不加详述。 需要说明的是,Matlab提供的API中,函数前缀有mex-和mx-两种。带mx-前缀的大多是对mxArray数据进行操作的函数,如mxIsDouble,mxCreateDoubleMatrix等等。而带mx前缀的则大多是与Matlab环境进行交互的函数,如mexPrintf,mxErrMsgTxt等等。了解了这一点,对在Apiref.pdf中查找所需的函数很有帮助。 至此为止,使用C编写mex函数的基本过程已经介绍完了。
个人分类: 转载技术博文|11960 次阅读|1 个评论
[转载]转载:VC与Matlab混合编程---VC调用Matlab函数
liuzy2011 2012-6-8 09:12
部分摘抄自: http://blog.csdn.net/hahalxp/article/details/5415257 ,介绍的很好,在此记下来,本文主要是介绍如何在VC中调用Matlab的程序 一、结合的方法 MATLAB 与 Visual C++ 结合的方法有多种,但其实用程度与范围不同。目前主要有以下三种方式。 1. 通过 Matlab 引擎 (Engine) 采用客户机 / 服务器 (Client/Service) 的计算模式 , 通过 windows 的 ActiveX 通道和 MATLAB 进行结合。 MATLAB 引擎采用客户机和服务器计算方式,提供了一组 Matlab API 函数,用户不必关心 Matlab 引擎是如何实现的,只要调用这些函数即可。正是通过这些 API 函数实现应用程序进程之间的传递函数,从而实现 Matlab 与 VC 的混合编程。具体应用中,往往在 VC 中设计程序框架 , VC 的 C 语言或 C++ 语言的程序作为前端客户机,它向 Matlab 引擎传递命令和数据信息,通过调用 MATLAB 引擎在后台与 MATLAB 服务器建立连接 , 实现动态通信。这种处理方法不要求链接整个 Matlab, 只需嵌入必要的 Matlab 引擎库,节省了大量的系统资源,使应用程序整体性能更好,处理效率更高,但这种混合编程的方法需要 MATLAB 在后台适时运行不能脱离 Matlab 环境,否则影响了程序的通用性,因此这种方法在实际开发过程中很少采用。 2. 通过 DLL 实现混合编程 DLL 是动态链接库的英文缩写,是一个可执行的二进制文件。把很多通用的功能放在 DLL 中,可供多个应用程序调用,而不是每个应用程序在连接时都要增加一个库中目标代码的拷贝。 通过 Matlab 自带的 Compiler 编译器,可以把由 Matlab 编写的 m 函数文件编译成动态链接库 (dl1) 。或者通过 Matlab 提供的组件功能,运用 VC+ 十向导自动生成 m 文件的动态链接库。在 VC 程序中调用封装的函数,实现数值算法的运用。这种方法只需在开发和发布中包含其生成的动态库就可以了,可以使程序脱离 Matlab 可以整体减少文件外部存储空间的占有量,并实现了代码共享。 3. 使用 COM 技术实现混合编程 COM 技术是一种应用广泛、方便灵活的方法,是利用 MATLAB 提供的 Deploy Tool 工具实现 MATLAB 与 C/C++ 的混合编程。 COM 给软件开发人员提供了一种共享二进制代码的方法,这种共享并不局限于某种编程语言。 二、具体的实现方法 1、 MATLAB 编译环境的设置 为了能够使用 MATLAB 的 Complier 将 *.m 函数文件编译为动态链接库 DLL ,必须对 MATLAB 的环境做出相应的设置。具体做法如下: 在 MATLAB 的 Command Window 下输入命令 mbuild –setup, 并根据 MATLAB 的提示选择合适的编译器,笔者使用的是 Microsoft Visual C++6.0, 进行对 C++ 连接环境的设置。过程如下: mbuild -setup 按照提示选择操作,选择Visual C++6.0编译器 然后, 在 MATLAB 的 Command Window 下输入命令 mex –setup, 进行对编译环境的设置。过程如下: mex -setup 按照提示选择操作,选择Visual C++6.0编译器 2、创建动态链接 DLL 这里用的方法就是使用 MATLAB 的 mcc 命令将 *.m 文件编译为动态链接库( *.dll )。 关于 mcc 有很多参数可以使用,而且有多种用法,具体的可以参见 MATLAB 的帮助。 其中 MATLAB 提供了三种使用 MATLAB 编译器的方式: (1) 在 MATLAB 环境中使用 mcc 命令; (2) 在系统命令环境中使用 mcc.exe( 在 Windows 上 ) ; (3) 在 MATLAB 环境中使用 Deployment Tool. 前两种方式所需要的命令行参数是一样的。 假设要把 file1.m 和 file2.m 编译成可执行文件: mcc –m file1 file2 假设要把 file1.m 和 file2.m 编译成 C 语言动态链接库文件: mcc –w lib:mylib –T link:lib file1.m file2.m 假设要把 file1.m 和 file2.m 编译成 C++ 语言动态链接库文件: mcc –w cpplib:mycpplib –T link file1.m file2.m 3、使用 MATLAB 编译器和 VC6.0 实现混合编程(通过例子说明) (1)、 MATLAB 中的操作 创建 mccdemol.m 文件,内容如下: 在 MATLAB 命令行下,将 mccdemol.m 编译成 C++ 动态链接库文件。可以执行如下命令:(带图形的和不带图形的有区别,这里主要是带图形的编译) mcc -W cpplib:libmccdemol -T link:lib mccdemol.m 命令执行完成后,将在工作目录产生使用 MATLAB 编译生成库文件所需的相关文件。 (2) 、建立 VC 对话框工程 创建一个基于 MFC 对话框的工程,工程名称为 MccDemol, 如下图所示: 设计对话框界面如图: 在文件 MccDemolDlg.cpp : implementation file 中包含头文件,如下所示: #include "libmccdemol.h" 修改对话框的初始函数如下: BOOL CMccDemolDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu-AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here bool res = false; res = mclInitializeApplication(NULL,0); if (!res) { MessageBox(" 初始化 Application 错误! "); } res = libmccdemolInitialize(); if (!res) { MessageBox(" 初始化 Lib 错误! "); } return TRUE; // return TRUE unless you set the focus to a control } 为对话框添加 WM_DESTROY 消息,使用快捷键“ Ctrl+W ” , 调出 MFC Class Wizard 对画框,如下图所示: 添加如下消息响应函数: void CMccDemolDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here bool res; res = mclTerminateApplication(); if (!res) { MessageBox(" 结束程序错误 !"); } libmccdemolTerminate(); } 为确定按钮添加消息响应函数 void CMccDemolDlg::OnButtonRun() { // TODO: Add your control notification handler code here mccdemol(); mclWaitForFiguresToDie(NULL); } 本例中用到了 MATLAB 图形功能,所示使函数“ mclWaitForFiguresToDie(NULL) ”,在没有用到 MATLAB 的图形功能的库文件时,不需要此函数。 (3) 、 VC 中的设置 将在 MATLAB 环境下编译后的生成文件 “libmccdemol.h” 、 “libmccdemol.dll” 、 “libmccdemol.lib” 和 “libmccdemol.ctf” (这个文件在有的编译器下生成后瞬间消失,如本例中,所以建议如果生成有的话,就将其添加,如没有就不用了。 CTF 文件见后面注释)复制到当前工程目录。 为工程添加库文件 “libmccdemol.lib” 和 “mclmcrrt.lib” ,如下图所示。 编译运行工程,可以看到运行结果,单击确定按钮,弹出 Figure 窗口。这与 MATLAB 环境下直接运行的结果相同。
个人分类: 转载技术博文|7798 次阅读|0 个评论
[转载]Shell脚本编程的常识
ywmucn 2012-6-7 09:11
Shell脚本编程的常识 文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/shell/shelljs/20111214/564330.html 七种文件类型 d 目录 l 符号链接 s 套接字文件 b 块设备文件 c 字符设备文件 p 命名管道文件 - 普通文件 正则表达式 从一个文件或命令输出中抽取或过滤文本时。可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。 基本的元字符集: ^ 只匹配行首。 $ 只匹配行尾。 * 一个单字符后紧跟*,匹配0个或多个此单字符。 内字符,可以是一个单字符,也可以是字符序列。可以使 用-来表示 等价于 。 \ 屏蔽一个元字符的特殊含义,如\$表示字符$,而不表示匹配行 尾。 . 匹配任意单字符。 pattern\{n\} 匹配pattern出现的次数n pattern\{n,\}m匹配pattern出现的次数,但表示次数最少为n pattern\{n,m\} 匹配pattern出现的次数在n与m之间(n,m为0-255) 几个常见的例子: 显示可执行的文件:ls –l | grep …x...x..x 只显示文件夹:ls –l | grep ^d 匹配所有的空行:^$ 匹配所有的单词: * 匹配任一非字母型字符: 包含八个字符的行:^……..$(8个.) 字符类描述 以下是可用字符类的相当完整的列表: 字母数字 字母 空格或制表键 任何控制字符 数字 任何可视字符(无空格) 小写 非控制字符 标点字符 空格 大写 十六进制数字 尽可能使用字符类是很有利的,因为它们可以更好地适应非英语 locale(包括某些必需的重音字符等等). shell的引号类型 shell共有四种引用类型: “ ” 双引号 ‘ ’ 单引号 ` ` 反引号 \ 反斜线 l “ ” 可引用除$、` 、\ 、外的任意字符或字符串,“ ”中的变量能够正常显示变量值。 l ‘ ’与“ ”类似,不同在于shell会忽略任何的引用值。 例如: GIRL=‘girl’ echo “The ‘$GIRL’ did well” 则打印:The ‘girl’ did well l ` `用于设置系统命令的输出到变量,shell会将` `中的内容作为一个系统命令并执行质。 例如:echo `date` 则打印当前的系统时间。 l \ 用来屏蔽特殊含义的字符: * + ^ $ ` “ | ? 例如:expr 12 \* 12 将输出144 变量设置时的不同模式: valiable_name=value 设置实际值到 variable_name中 valiable_name+value 如果设置了variable_name,则重设其值 valiable_name:?value 如果未设置variable_name,则先显示未定义用户错误信息 valiable_name?value 如果未设置variable_name,则显示系统错误信息 valiable_name:=value 如果未设置variable_name,则设置其值 valiable_name-value 同上,但取值并不设置到variable_name 条件测试 test命令用于测试字符串、文件状态和数字,expr测试和执行数值输出。 Test格式:test condition 或 (需要特别注意的是condition的两边都要有一个空格,否则会报错),test命令返回0表示成功。 l 下面将分别描述test的三种测试: n 文件状态测试(常用的) -d 测试是否文件夹 -f 测试是否一般文件 -L 测试是否链接文件 -r 测试文件是否可读 -w 测试文件是否可写 -x 测试文件是否可执行 -s 测试文件是否非空 n 字符串测试 五种格式: test “string” test string_operator “string” test “string” string_operator “string” 其中string_operator可以为: = 两字符串相等 != 两字符串不等 -z 空串 -n 非空串 n 数值测试 两种格式: “number” number_operator “number” 其中:number_operator 可以为:-eq 、-ne、-gt、-lt、-ge 例如: NUMBER=130 (其中-a表示前后结果相“与”) l expr命令一般用于整数值,但也可以用于字符串。 n 格式: expr srgument operator operator argument 例如: expr 10 + 10 expr 10 ^ 2 (10的平方) expr $value + 10 n 增量计数――expr在循环中最基本的用法 例如: LOOP=0 LOOP=`expr $LOOP + 1` n 模式匹配:通过指定的冒号选项计算字符串中的字符数 例如: value=account.doc expr $value : `\(.*\).doc` 输出 account 命令执行顺序 成功执行一个命令后再执行下一个 || 一个命令执行失败后再执行另一个命令 ( ) 在当前shell中执行一组命令(格式:(命令1;命令2; ……)) { } 同( ) 例如: comet mouth_end || ( echo “hello” | mail dave ;exit ) 如果没有( ),则shell将直接执行最后一个命令(exit) 脚本调试 最有用的调试脚本的工具是echo命令,可以随时打印有关变量或操作的信息,以帮助定位错误。也可使用打印最后状态($?) 命令来判断命令是否成功,这时要注意的是要在执行完要测试的命令后立即输出$?,否则$?将会改变。 Set命令也可以用来辅助脚本测试: Set –n 读命令但是不执行 Set –v 显示读取的所有的行 Set –x 显示所有的命令及其参数 (要关闭set选项,只要把-换成+就可以了,这里有点特殊,要注意一下) 一些常用的小trick 打印一些头信息 command dilimiter …… …… dilimiter 以分界符号dilimiter中的内容作为命令的标准输入 常用在echo命令中,这样就避免了没输出一行就要使用一个echo命令,同时,输出格式的调整也相应变得简单了。 例如: echo something_message ************************************************ hello, welcome to use my shell script ************************************************ something_message 将在屏幕上输出: ************************************************ hello, welcome to use my shell script ************************************************ 一、利用的分解符号性质还可以自动选择菜单或实现自动的ftp传输 也就是利用分解符号的性质自动选择菜单。 例如: ./menu_choose output_file 21 Choose 2 3 Y Choose 则自动在执行脚本的过程中一步步作出选择:2,3,Y 这种性质决定了它是理想的访问数据库的有用工具,可以用它来输入面对数据库提示时所作的各种选择。 创建一个长度为0的空文件 执行 file_name 命令或 touch file_name 命令。 一些常用的shell变量 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数(可大于9个) $$ 脚本运行的当前进程的ID号 $! 后台运行的最后一个进程的ID号 $@ 与$#相同,但使用时加引号,并在引号中返回每个参数 $- 显示shell使用的当前选项 $? 显示最后命令的退出状态,0表示无错误(这个变量也常常用来打印输出,在脚本调试时标记某个shell命令或某个函数是否正确执行,但是要注意,$?记载的是最近的函数或命令的退出状态,因此打印时应该立即打印以获得正确的信息) $0的使用 在变量中有一种位置变量$n,用来存放函数调用或脚本执行时传入的参数,其中$0表示函数名或脚本名,需要注意的是,这时的脚本名传递的是包含全路径的脚本名。从$1-$9表示传入的第一到第九个参数,这样的参数表示不能多于九个,如果多于九个,可以使用下面将要提到的shift指令来读取。 因为$0存放函数名或脚本名,因此我们可以通过echo $0来输出调用信息,但是,由于存放的是全路径名,我们可以利用一个shell命令来得到脚本名,basename $0 将得到$0中名字的部分,而与之相反的,dirname $0将得到$0中路径的部分。 Shift的运用 用head或tail指令指定查阅的行数 例如:查阅文件前20行: head –20 file_name 查阅文件后10行: tail –10 file_name awk使用规则 awk 是一种很棒的语言。awk 适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行需要特殊技巧程序设计。与某些语言不同,awk 的语法较为常见。它借鉴了某些语言的一些精华部分,如 C 语言、python 和 bash(虽然在技术上,awk 比 python 和 bash 早创建)。awk 是那种一旦学会了就会成为您战略编码库的主要部分的语言。 第一个 awk 让我们继续,开始使用 awk,以了解其工作原理。在命令行中输入以下命令: $ awk '{ print }' /etc/passwd 您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。 现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。 这里是另一个 awk 示例,它的作用与上例完全相同: $ awk '{ print $0 }' /etc/passwd 在 awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。 如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个示例: $ awk '{ print "" }' /etc/passwd 只要将 "" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于 /etc/passwd 文件中的每一行,awk 都输出一个空白行。再次说明, awk 对输入文件中的每一行都执行这个脚本。以下是另一个示例: $ awk '{ print "hiya" }' /etc/passwd 运行这个脚本将在您的屏幕上写满 hiya。:) 多个字段 awk 非常善于处理分成多个逻辑字段的文本,而且让您可以毫不费力地引用 awk 脚本中每个独立的字段。以下脚本将打印出您的系统上所有用户帐户的列表: $ awk -F":" '{ print $1 }' /etc/passwd 上例中,在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。以下是另一个示例: $ awk -F":" '{ print $1 $3 }' /etc/passwd 以下是该脚本输出的摘录: halt7 operator11 root0 shutdown6 sync5 bin1 ....etc. 如您所见,awk 打印出 /etc/passwd 文件的第一和第三个字段,它们正好分别是用户名和用户标识字段。现在,当脚本运行时,它并不理想 -- 在两个输出字段之间没有空格!如果习惯于使用 bash 或 python 进行编程,那么您会指望 print $1 $3 命令在两个字段之间插入空格。然而,当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格: $ awk -F":" '{ print $1 " " $3 }' /etc/passwd 以这种方式调用 print 时,它将连接 $1、" " 和 $3,创建可读的输出。当然,如果需要的话,我们还可以插入一些文本标签: $ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd 这将产生以下输出: username: halt uid:7 username: operator uid:11 username: root uid:0 username: shutdown uid:6 username: sync uid:5 username: bin uid:1 ....etc. 外部脚本 将脚本作为命令行自变量传递给 awk 对于小的单行程序来说是非常简单的,而对于多行程序,它就比较复杂。您肯定想要在外部文件中撰写脚本。然后可以向 awk 传递 -f 选项,以向它提供此脚本文件: $ awk -f myscript.awk myfile.in 将脚本放入文本文件还可以让您使用附加 awk 功能。例如,这个多行脚本与前面的单行脚本的作用相同,它们都打印出 /etc/passwd 中每一行的第一个字段: BEGIN { FS=":" } { print $1 } 这两个方法的差别在于如何设置字段分隔符。在这个脚本中,字段分隔符在代码自身中指定(通过设置 FS 变量),而在前一个示例中,通过在命令行上向 awk 传递 -F":" 选项来设置 FS。通常,最好在脚本自身中设置字段分隔符,只是因为这表示您可以少输入一个命令行自变量。我们将在本文的后面详细讨论 FS 变量。 BEGIN 和 END 块 通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。 awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。 规则表达式和块 awk 允许使用规则表达式,根据规则表达式是否匹配当前行来选择执行独立代码块。以下示例脚本只输出包含字符序列 foo 的那些行: /foo/ { print } 当然,可以使用更复杂的规则表达式。以下脚本将只打印包含浮点数的行: / +\. */ { print } 还有许多其它方法可以选择执行代码块。我们可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时,awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 fred 的所有行中的第三个字段。如果当前行的第一个字段不等于 fred,awk 将继续处理文件而不对当前行执行 print 语句: $1 == "fred" { print $3 } awk 提供了完整的比较运算符集合,包括 "=="、""、""、"="、"=" 和 "!="。另外,awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定规则表达式。如果某一行的第五个字段包含字符序列 root,那么以下示例将只打印这一行中的第三个字段: $5 ~ /root/ { print $3 } 条件语句 awk 还提供了非常好的类似于 C 语言的 if 语句。如果您愿意,可以使用 if 语句重写前一个脚本: { if ( $5 ~ /root/ ) { print $3 } } 这两个脚本的功能完全一样。第一个示例中,布尔表达式放在代码块外面。而在第二个示例中,将对每一个输入行执行代码块,而且我们使用 if 语句来选择执行 print 命令。这两个方法都可以使用,可以选择最适合脚本其它部分的一种方法。 以下是更复杂的 awk if 语句示例。可以看到,尽管使用了复杂、嵌套的条件语句,if 语句看上去仍与相应的 C 语言 if 语句一样: { if ( $1 == "foo" ) { if ( $2 == "foo" ) { print "uno" } else { print "one" } } else if ($1 == "bar" ) { print "two" } else { print "three" } } 使用 if 语句还可以将代码: ! /matchme/ { print $1 $3 $4 } 转换成: { if ( $0 !~ /matchme/ ) { print $1 $3 $4 } } 这两个脚本都只输出不包含 matchme 字符序列的那些行。此外,还可以选择最适合您的代码的方法。它们的功能完全相同。 awk 还允许使用布尔运算符 "||"(逻辑与)和 ""(逻辑或),以便创建更复杂的布尔表达式: ( $1 == "foo" ) ( $2 == "bar" ) { print } 这个示例只打印第一个字段等于 foo 且第二个字段等于 bar 的那些行。 数值变量 至今,我们不是打印字符串、整行就是特定字段。然而,awk 还允许我们执行整数和浮点运算。通过使用数学表达式,可以很方便地编写计算文件中空白行数量的脚本。以下就是这样一个脚本: BEGIN { x=0 } /^$/ { x=x+1 } END { print "I found " x " blank lines. :}" } 在 BEGIN 块中,将整数变量 x 初始化成零。然后,awk 每次遇到空白行时,awk 将执行 x=x+1 语句,递增 x。处理完所有行之后,执行 END 块,awk 将打印出最终摘要,指出它找到的空白行数量。 字符串化变量 awk 的优点之一就是“简单和字符串化”。我认为 awk 变量“字符串化”是因为所有 awk 变量在内部都是按字符串形式存储的。同时,awk 变量是“简单的”,因为可以对它执行数学操作,且只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。要理解我的观点,请研究以下这个示例: x="1.01" # We just set x to contain the *string* "1.01" x=x+1 # We just added one to a *string* print x # Incidentally, these are comments :) awk 将输出: 2.01 有趣吧!虽然将字符串值 1.01 赋值给变量 x,我们仍然可以对它加一。但在 bash 和 python 中却不能这样做。首先,bash 不支持浮点运算。而且,如果 bash 有“字符串化”变量,它们并不“简单”;要执行任何数学操作,bash 要求我们将数字放到丑陋的 $( ) ) 结构中。如果使用 python,则必须在对 1.01 字符串执行任何数学运算之前,将它转换成浮点值。虽然这并不困难,但它仍是附加的步骤。如果使用 awk,它是全自动的,而那会使我们的代码又好又整洁。如果想要对每个输入行的第一个字段乘方并加一,可以使用以下脚本: { print ($1^2)+1 } 如果做一个小实验,就可以发现如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。 众多运算符 awk 的另一个优点是它有完整的数学运算符集合。除了标准的加、减、乘、除,awk 还允许使用前面演示过的指数运算符 "^"、模(余数)运算符 "%" 和其它许多从 C 语言中借入的易于使用的赋值操作符。 这些运算符包括前后加减(i++、--foo)、加/减/乘/除赋值运算符( a+=3、b*=2、c/=2.2、d-=6.2)。不仅如此 -- 我们还有易于使用的模/指数赋值运算符(a^=2、b%=4)。 字段分隔符 awk 有它自己的特殊变量集合。其中一些允许调整 awk 的运行方式,而其它变量可以被读取以收集关于输入的有用信息。我们已经接触过这些特殊变量中的一个,FS。前面已经提到过,这个变量让您可以设置 awk 要查找的字段之间的字符序列。我们使用 /etc/passwd 作为输入时,将 FS 设置成 ":"。当这样做有问题时,我们还可以更灵活地使用 FS。 FS 值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式。如果正在处理由一个或多个 tab 分隔的字段,您可能希望按以下方式设置 FS: FS="\t+" 以上示例中,我们使用特殊 "+" 规则表达式字符,它表示“一个或多个前一字符”。 如果字段由空格分隔(一个或多个空格或 tab),您可能想要将 FS 设置成以下规则表达式: FS=" +]" 这个赋值表达式也有问题,它并非必要。为什么?因为缺省情况下,FS 设置成单一空格字符,awk 将这解释成表示“一个或多个空格或 tab”。在这个特殊示例中,缺省 FS 设置恰恰是您最想要的! 复杂的规则表达式也不成问题。即使您的记录由单词 "foo" 分隔,后面跟着三个数字,以下规则表达式仍允许对数据进行正确的分析: FS="foo " 字段数量 接着我们要讨论的两个变量通常并不是需要赋值的,而是用来读取以获取关于输入的有用信息。第一个是 NF 变量,也叫做“字段数量”变量。awk 会自动将该变量设置成当前记录中的字段数量。可以使用 NF 变量来只显示某些输入行: NF == 3 { print "this particular record has three fields: " $0 } 当然,也可以在条件语句中使用 NF 变量,如下: { if ( NF 2 ) { print $1 " " $2 ":" $3 } } 记录号 记录号 (NR) 是另一个方便的变量。它始终包含当前记录的编号(awk 将第一个记录算作记录号 1)。迄今为止,我们已经处理了每一行包含一个记录的输入文件。对于这些情况,NR 还会告诉您当前行号。然而,当我们在本系列以后部分中开始处理多行记录时,就不会再有这种情况,所以要注意!可以象使用 NF 变量一样使用 NR 来只打印某些输入行: (NR 10 ) || (NR 100) { print "We are on record number 1-9 or 101+" } 另一个示例: { #skip header if ( NR 10 ) { print "ok, now for the real information!" } } awk 提供了适合各种用途的附加变量。我们将在以后的文章中讨论这些变量。 多行记录 awk 是一种用于读取和处理结构化数据(如系统的 /etc/passwd 文件)的极佳工具。/etc/passwd 是 UNIX 用户数据库,并且是用冒号定界的文本文件,它包含许多重要信息,包括所有现有用户帐户和用户标识,以及其它信息。在我的前一篇文章中,我演示了 awk 如何轻松地分析这个文件。我们只须将 FS(字段分隔符)变量设置成 ":"。 正确设置了 FS 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录。然而,如果要分析占据多行的记录,仅仅依靠设置 FS 是不够的。在这些情况下,我们还需要修改 RS 记录分隔符变量。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始。 譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务: Jimmy the Weasel 100 Pleasant Drive San Francisco, CA 12345 Big Tony 200 Incognito Ave. Suburbia, WA 67890 理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录。如果 awk 将地址的第一行看作是第一个字段 ($1),街道地址看作是第二个字段 ($2),城市、州和邮政编码看作是第三个字段 $3,那么这个代码就会变得很简单。以下就是我们想要得到的代码: BEGIN { FS="\n" RS="" } 在上面这段代码中,将 FS 设置成 "\n" 告诉 awk 每个字段都占据一行。通过将 RS 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔。一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单。让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段。 address.awk BEGIN { FS="\n" RS="" } { print $1 ", " $2 ", " $3 } 如果这个脚本保存为 address.awk,地址数据存储在文件 address.txt 中,可以通过输入 "awk -f address.awk address.txt" 来执行这个脚本。此代码将产生以下输出: Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345 Big Tony, 200 Incognito Ave., Suburbia, WA 67890 OFS 和 ORS 在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串。我们使用此功能在同一行上的三个字段之间插入一个逗号和空格 (", ")。这个方法虽然有用,但比较难看。与其在字段间插入 ", " 字符串,倒不如让通过设置一个特殊 awk 变量 OFS,让 awk 完成这件事。请参考下面这个代码片断。 print "Hello", "there", "Jim!" 这行代码中的逗号并不是实际文字字符串的一部分。事实上,它们告诉 awk "Hello"、"there" 和 "Jim!" 是单独的字段,并且应该在每个字符串之间打印 OFS 变量。缺省情况下,awk 产生以下输出: Hello there Jim! 这是缺省情况下的输出结果,OFS 被设置成 " ",单个空格。不过,我们可以方便地重新定义 OFS,这样 awk 将插入我们中意的字段分隔符。以下是原始 address.awk 程序的修订版,它使用 OFS 来输出那些中间的 ", " 字符串: address.awk 的修订版 BEGIN { FS="\n" RS="" OFS=", " } { print $1, $2, $3 } awk 还有一个特殊变量 ORS,全称是“输出记录分隔符”。通过设置缺省为换行 ("\n") 的 OFS,我们可以控制在 print 语句结尾自动打印的字符。缺省 ORS 值会使 awk 在新行中输出每个新的 print 语句。如果想使输出的间隔翻倍,可以将 ORS 设置成 "\n\n"。或者,如果想要用单个空格分隔记录(而不换行),将 ORS 设置成 " "。 将多行转换成用 tab 分隔的格式 假设我们编写了一个脚本,它将地址列表转换成每个记录一行,且用 tab 定界的格式,以便导入电子表格。使用稍加修改的 address.awk 之后,就可以清楚地看到这个程序只适合于三行的地址。如果 awk 遇到以下地址,将丢掉第四行,并且不打印该行: Cousin Vinnie Vinnie's Auto Shop 300 City Alley Sosueme, OR 76543 要处理这种情况,代码最好考虑每个字段的记录数量,并依次打印每个记录。现在,代码只打印地址的前三个字段。以下就是我们想要的一些代码: 适合具有任意多字段的地址的 address.awk 版本 BEGIN { FS="\n" RS="" ORS="" } { x=1 while ( xNF ) { print $x "\t" x++ } print $NF "\n" } 首先,将字段分隔符 FS 设置成 "\n",将记录分隔符 RS 设置成 "",这样 awk 可以象以前一样正确分析多行地址。然后,将输出记录分隔符 ORS 设置成 "",它将使 print 语句在每个调用结尾不输出新行。这意味着如果希望任何文本从新的一行开始,那么需要明确写入 print "\n"。 在主代码块中,创建了一个变量 x 来存储正在处理的当前字段的编号。起初,它被设置成 1。然后,我们使用 while 循环(一种 awk 循环结构,等同于 C 语言中的 while 循环),对于所有记录(最后一个记录除外)重复打印记录和 tab 字符。最后,打印最后一个记录和换行;此外,由于将 ORS 设置成 "",print 将不输出换行。程序输出如下,这正是我们所期望的(不算漂亮,但用 tab 定界,以便于导入电子表格): Jimmy the Weasel 100 Pleasant Drive San Francisco, CA 12345 Big Tony 200 Incognito Ave. Suburbia, WA 67890 Cousin Vinnie Vinnie's Auto Shop 300 City Alley Sosueme, OR 76543 循环结构 我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。它类似于其它语言中的 "repeat...until" 循环。以下是一个示例: do...while 示例 { count=1 do { print "I get printed at least once no matter what" } while ( count != 1 ) } 与一般的 while 循环不同,由于在代码块之后对条件求值,"do...while" 循环永远都至少执行一次。换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。 for 循环 awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环: for ( initial assignment; comparison; increment ) { code block } 以下是一个简短示例: for ( x = 1; x = 4; x++ ) { print "iteration",x } 此段代码将打印: iteration 1 iteration 2 iteration 3 iteration 4 break 和 continue 此外,如同 C 语言一样,awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断: while 死循环 while (1) { print "forever and ever..." } 因为 1 永远代表是真,这个 while 循环将永远运行下去。以下是一个只执行十次的循环: break 语句示例 x=1 while(1) { print "iteration",x if ( x == 10 ) { break } x++ } 这里,break 语句用于“逃出”最深层的循环。"break" 使循环立即终止,并继续执行循环代码块后面的语句。 continue 语句补充了 break,其作用如下: x=1 while (1) { if ( x == 4 ) { x++ continue } print "iteration",x if ( x 20 ) { break } x++ } 这段代码打印 "iteration 1" 到 "iteration 21","iteration 4" 除外。如果迭代等于 4,则增加 x 并调用 continue 语句,该语句立即使 awk 开始执行下一个循环迭代,而不执行代码块的其余部分。如同 break 一样,continue 语句适合各种 awk 迭代循环。在 for 循环主体中使用时,continue 将使循环控制变量自动增加。以下是一个等价循环: for ( x=1; x=21; x++ ) { if ( x == 4 ) { continue } print "iteration",x } 在 while 循环中时,在调用 continue 之前没有必要增加 x,因为 for 循环会自动增加 x。 数组 如果您知道 awk 可以使用数组,您一定会感到高兴。然而,在 awk 中,数组下标通常从 1 开始,而不是 0: myarray ="jim" myarray =456 awk 遇到第一个赋值语句时,它将创建 myarray,并将元素 myarray 设置成 "jim"。执行了第二个赋值语句后,数组就有两个元素了。 数组迭代 定义之后,awk 有一个便利的机制来迭代数组元素,如下所示: for ( x in myarray ) { print myarray } 这段代码将打印数组 myarray 中的每一个元素。当对于 for 使用这种特殊的 "in" 形式时,awk 将 myarray 的每个现有下标依次赋值给 x(循环控制变量),每次赋值以后都循环一次循环代码。虽然这是一个非常方便的 awk 功能,但它有一个缺点 -- 当 awk 在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是: jim 456 还是: 456 jim 套用 Forrest Gump 的话来说,迭代数组内容就像一盒巧克力 -- 您永远不知道将会得到什么。因此有必要使 awk 数组“字符串化”,我们现在就来研究这个问题。 数组下标字符串化 在我的前一篇文章中,我演示了 awk 实际上以字符串格式来存储数字值。虽然 awk 要执行必要的转换来完成这项工作,但它却可以使用某些看起来很奇怪的代码: a="1" b="2" c=a+b+3 执行了这段代码后,c 等于 6。由于 awk 是“字符串化”的,添加字符串 "1" 和 "2" 在功能上并不比添加数字 1 和 2 难。这两种情况下,awk 都可以成功执行运算。awk 的“字符串化”性质非常可爱 -- 您可能想要知道如果使用数组的字符串下标会发生什么情况。例如,使用以下代码: myarr ="Mr. Whipple" print myarr 可以预料,这段代码将打印 "Mr. Whipple"。但如果去掉第二个 "1" 下标中的引号,情况又会怎样呢? myarr ="Mr. Whipple" print myarr 猜想这个代码片断的结果比较难。awk 将 myarr 和 myarr 看作数组的两个独立元素,还是它们是指同一个元素?答案是它们指的是同一个元素,awk 将打印 "Mr. Whipple",如同第一个代码片断一样。虽然看上去可能有点怪,但 awk 在幕后却一直使用数组的字符串下标! 了解了这个奇怪的真相之后,我们中的一些人可能想要执行类似于以下的古怪代码: myarr ="Mr. Whipple" print myarr 这段代码不仅不会产生错误,而且它的功能与前面的示例完全相同,也将打印 "Mr. Whipple"!可以看到,awk 并没有限制我们使用纯整数下标;如果我们愿意,可以使用字符串下标,而且不会产生任何问题。只要我们使用非整数数组下标,如 myarr ,那么我们就在使用关联数组。从技术上讲,如果我们使用字符串下标,awk 的后台操作并没有什么不同(因为即便使用“整数”下标,awk 还是会将它看作是字符串)。但是,应该将它们称作关联数组 -- 它听起来很酷,而且会给您的上司留下印象。字符串化下标是我们的小秘密。;) 数组工具 谈到数组时,awk 给予我们许多灵活性。可以使用字符串下标,而且不需要连续的数字序列下标(例如,可以定义 myarr 和 myarr ,但不定义其它所有元素)。虽然这些都很有用,但在某些情况下,会产生混淆。幸好,awk 提供了一些实用功能有助于使数组变得更易于管理。 首先,可以删除数组元素。如果想要删除数组 fooarray 的元素 1,输入: delete fooarray 而且,如果想要查看是否存在某个特定数组元素,可以使用特殊的 "in" 布尔运算符,如下所示: if ( 1 in fooarray ) { print "Ayep! It's there." } else { print "Nope! Can't find it." } 格式化输出 虽然大多数情况下 awk 的 print 语句可以完成任务,但有时我们还需要更多。在那些情况下,awk 提供了两个我们熟知的老朋友 printf() 和 sprintf()。是的,如同其它许多 awk 部件一样,这些函数等同于相应的 C 语言函数。printf() 会将格式化字符串打印到 stdout,而 sprintf() 则返回可以赋值给变量的格式化字符串。如果不熟悉 printf() 和 sprintf(),介绍 C 语言的文章可以让您迅速了解这两个基本打印函数。在 Linux 系统上,可以输入 "man 3 printf" 来查看 printf() 帮助页面。 以下是一些 awk sprintf() 和 printf() 的样本代码。可以看到,它们几乎与 C 语言完全相同。 x=1 b="foo" printf("%s got a %d on the last test\n","Jim",83) myout=("%s-%d",b,x) print myout 此代码将打印: Jim got a 83 on the last test foo-1 字符串函数 awk 有许多字符串函数,这是件好事。在 awk 中,确实需要字符串函数,因为不能象在其它语言(如 C、C++ 和 Python)中那样将字符串看作是字符数组。例如,如果执行以下代码: mystring="How are you doing today?" print mystring 将会接收到一个错误,如下所示: awk: string.gawk:59: fatal: attempt to use scalar as array 噢,好吧。虽然不象 Python 的序列类型那样方便,但 awk 的字符串函数还是可以完成任务。让我们来看一下。 首先,有一个基本 length() 函数,它返回字符串的长度。以下是它的使用方法: print length(mystring) 此代码将打印值: 24 好,继续。下一个字符串函数叫作 index,它将返回子字符串在另一个字符串中出现的位置,如果没有找到该字符串则返回 0。使用 mystring,可以按以下方法调用它: print index(mystring,"you") awk 会打印: 9 让我们继续讨论另外两个简单的函数,tolower() 和 toupper()。与您猜想的一样,这两个函数将返回字符串并且将所有字符分别转换成小写或大写。请注意,tolower() 和 toupper() 返回新的字符串,不会修改原来的字符串。这段代码: print tolower(mystring) print toupper(mystring) print mystring ……将产生以下输出: how are you doing today? HOW ARE YOU DOING TODAY? How are you doing today? 到现在为止一切不错,但我们究竟如何从字符串中选择子串,甚至单个字符?那就是使用 substr() 的原因。以下是 substr() 的调用方法: mysub=substr(mystring,startpos,maxlen) mystring 应该是要从中抽取子串的字符串变量或文字字符串。startpos 应该设置成起始字符位置,maxlen 应该包含要抽取的字符串的最大长度。请注意,我说的是最大长度;如果 length(mystring) 比 startpos+maxlen 短,那么得到的结果就会被截断。substr() 不会修改原始字符串,而是返回子串。以下是一个示例: print substr(mystring,9,3) awk 将打印: you 如果您通常用于编程的语言使用数组下标访问部分字符串(以及不使用这种语言的人),请记住 substr() 是 awk 代替方法。需要使用它来抽取单个字符和子串;因为 awk 是基于字符串的语言,所以会经常用到它。 一些更耐人寻味的函数 首先是 match()。match() 与 index() 非常相似,它与 index() 的区别在于它并不搜索子串,它搜索的是规则表达式。match() 函数将返回匹配的起始位置,如果没有找到匹配,则返回 0。此外,match() 还将设置两个变量,叫作 RSTART 和 RLENGTH。RSTART 包含返回值(第一个匹配的位置),RLENGTH 指定它占据的字符跨度(如果没有找到匹配,则返回 -1)。通过使用 RSTART、RLENGTH、substr() 和一个小循环,可以轻松地迭代字符串中的每个匹配。以下是一个 match() 调用示例: print match(mystring,/you/), RSTART, RLENGTH awk 将打印: 9 9 3 字符串替换 现在,我们将研究两个字符串替换函数,sub() 和 gsub()。这些函数与目前已经讨论过的函数略有不同,因为它们确实修改原始字符串。以下是一个模板,显示了如何调用 sub(): sub(regexp,replstring,mystring) 调用 sub() 时,它将在 mystring 中匹配 regexp 的第一个字符序列,并且用 replstring 替换该序列。sub() 和 gsub() 用相同的自变量;唯一的区别是 sub() 将替换第一个 regexp 匹配(如果有的话),gsub() 将执行全局替换,换出字符串中的所有匹配。以下是一个 sub() 和 gsub() 调用示例: sub(/o/,"O",mystring) print mystring mystring="How are you doing today?" gsub(/o/,"O",mystring) print mystring 必须将 mystring 复位成其初始值,因为第一个 sub() 调用直接修改了 mystring。在执行时,此代码将使 awk 输出: HOw are you doing today? HOw are yOu dOing tOday? 当然,也可以是更复杂的规则表达式。我把测试一些复杂规则表达式的任务留给您来完成。 通过介绍函数 split(),我们来汇总一下已讨论过的函数。split() 的任务是“切开”字符串,并将各部分放到使用整数下标的数组中。以下是一个 split() 调用示例: numelements=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mymonths,",") 调用 split() 时,第一个自变量包含要切开文字字符串或字符串变量。在第二个自变量中,应该指定 split() 将填入片段部分的数组名称。在第三个元素中,指定用于切开字符串的分隔符。split() 返回时,它将返回分割的字符串元素的数量。split() 将每一个片段赋值给下标从 1 开始的数组,因此以下代码: print mymonths ,mymonths ……将打印: Jan Dec 特殊字符串形式 简短注释 -- 调用 length()、sub() 或 gsub() 时,可以去掉最后一个自变量,这样 awk 将对 $0(整个当前行)应用函数调用。要打印文件中每一行的长度,使用以下 awk 脚本: { print length() } sed使用规则 sed 是很有用(但常被遗忘)的 UNIX 流编辑器。sed是十分强大和小巧的文本流编辑器。使用sed 可以执行字符串替换、创建更大的 sed 脚本以及使用 sed 的附加、插入和更改行命令。在以批处理方式编辑文件或以有效方式创建 shell 脚本来修改现有文件方面,它是十分理想的工具。 sed 示例 sed 通过对输入数据执行任意数量用户指定的编辑操作(“命令”)来工作。sed 是基于行的,因此按顺序对每一行执行命令。然后,sed 将其结果写入标准输出 (stdout),它不修改任何输入文件。 让我们看一些示例。头几个会有些奇怪,因为我要用它们演示 sed 如何工作,而不是执行任何有用的任务。然而,如果您是 sed 新手,那么理解它们是十分重要的。下面是第一个示例: $ sed -e 'd' /etc/services 如果输入该命令,将得不到任何输出。那么,发生了什么?在该例中,用一个编辑命令 'd' 调用 sed。sed 打开 /etc/services 文件,将一行读入其模式缓冲区,执行编辑命令(“删除行”),然后打印模式缓冲区(缓冲区已为空)。然后,它对后面的每一行重复这些步骤。这不会产生输出,因为 "d" 命令除去了模式缓冲区中的每一行! 在该例中,还有几件事要注意。首先,根本没有修改 /etc/services。这还是因为 sed 只读取在命令行指定的文件,将其用作输入 -- 它不试图修改该文件。第二件要注意的事是 sed 是面向行的。'd' 命令不是简单地告诉 sed 一下子删除所有输入数据。相反,sed 逐行将 /etc/services 的每一行读入其称为模式缓冲区的内部缓冲区。一旦将一行读入模式缓冲区,它就执行 'd' 命令,然后打印模式缓冲区的内容(在本例中没有内容)。我将在后面为您演示如何使用地址范围来控制将命令应用到哪些行 -- 但是,如果不使用地址,命令将应用到所有行。第三件要注意的事是括起 'd' 命令的单引号的用法。养成使用单引号来括起 sed 命令的习惯是个好注意,这样可以禁用 shell 扩展。 另一个 sed 示例 下面是使用 sed 从输出流除去 /etc/services 文件第一行的示例: $ sed -e '1d' /etc/services | more 如您所见,除了前面有 '1' 之外,该命令与第一个 'd' 命令十分类似。如果您猜到 '1' 指的是第一行,那您就猜对了。与第一个示例中只使用 'd' 不同的是,这一次使用的 'd' 前面有一个可选的数字地址。通过使用地址,可以告诉 sed 只对某一或某些特定行进行编辑。 地址范围 现在,让我们看一下如何指定地址范围。在本例中,sed 将删除输出的第 1 到 10 行: $ sed -e '1,10d' /etc/services | more 当用逗号将两个地址分开时,sed 将把后面的命令应用到从第一个地址开始、到第二个地址结束的范围。在本例中,将 'd' 命令应用到第 1 到 10 行(包括这两行)。所有其它行都被忽略。 带规则表达式的地址 现在演示一个更有用的示例。假设要查看 /etc/services 文件的内容,但是对查看其中包括的注释部分不感兴趣。如您所知,可以通过以 '#' 字符开头的行在 /etc/services 文件中放置注释。为了避免注释,我们希望 sed 删除以 '#' 开始的行。以下是具体做法: $ sed -e '/^#/d' /etc/services | more 试一下该例,看看发生了什么。您将注意到,sed 成功完成了预期任务。现在,让我们分析发生的情况: 要理解 '/^#/d' 命令,首先需要对其剖析。首先,让我们除去 'd' -- 这是我们前面所使用的同一个删除行命令。新增加的是 '/^#/' 部分,它是一种新的规则表达式地址。规则表达式地址总是由斜杠括起。它们指定一种 模式,紧跟在规则表达式地址之后的命令将仅适用于正好与该特定模式匹配的行。因此,'/^#/' 是一个规则表达式。(规则表达式的有关规定可以参见本文前面的内容) 例如: $ sed -e '/regexp/d' /path/to/my/test/file | more 这将导致 sed 删除任何匹配的行。 对比如下的命令: $ sed -n -e '/regexp/p' /path/to/my/test/file | more 请注意新的 '-n' 选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做。您还会注意到,我们用 'p' 命令替换了 'd' 命令,如您所猜想的那样,这明确要求 sed 打印模式空间。就这样,将只打印匹配部分。 有关地址的更多内容 目前为止,我们已经看到了行地址、行范围地址和 regexp 地址。但是,还有更多的可能。我们可以指定两个用逗号分开的规则表达式,sed 将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。 例如,以下命令将打印从包含 "BEGIN" 的行开始,并且以包含 "END" 的行结束的文本块: $ sed -n -e '/BEGIN/,/END/p' /my/test/file | more 如果没发现 "BEGIN",那么将不打印数据。如果发现了 "BEGIN",但是在这之后的所有行中都没发现 "END",那么将打印所有后续行。发生这种情况是因为 sed 面向流的特性 -- 它不知道是否会出现 "END"。 C 源代码示例 如果只要打印 C 源文件中的 main() 函数,可输入: $ sed -n -e '/main ]*(/,/^)/p' sourcefile.c | more 该命令有两个规则表达式 '/main ]*(/' 和 '/^}/',以及一个命令 'p'。第一个规则表达式将与后面依次跟有任意数量的空格或制表键以及开始圆括号的字符串 "main" 匹配。这应该与一般 ANSI C main() 声明的开始匹配。 在这个特别的规则表达式中,出现了 ' ]' 字符类。这只是一个特殊的关键字,它告诉 sed 与 TAB 或空格匹配。如果愿意的话,可以不输入 ' ]',而输入 ' ' -- Control-V 告诉 bash 要插入“真正”的制表键,而不是执行命令扩展。使用 ' ]' 命令类(特别是在脚本中)会更清楚。 现在看一下第二个 regexp。'/^}' 将与任何出现在新行行首的 '}' 字符匹配。如果代码的格式很好,那么这将与 main() 函数的结束花括号匹配。如果格式不好,则不会正确匹配 -- 这是执行模式匹配任务的一件棘手之事。因为是处于 '-n' 安静方式,所以 'p' 命令还是完成其惯有任务,即明确告诉 sed 打印该行。试着对 C 源文件运行该命令 -- 它应该输出整个 main() { } 块,包括开始的 "main()" 和结束的 '}'。 替换 让我们看一下 sed 最有用的命令之一,替换命令。使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换。 下面是该命令最基本用法的示例: $ sed -e 's/foo/bar/' myfile.txt 上面的命令将 myfile.txt 中每行第一次出现的 'foo'(如果有的话)用字符串 'bar' 替换,然后将该文件内容输出到标准输出。请注意,我说的是每行第一次出现,尽管这通常不是您想要的。在进行字符串替换时,通常想执行全局替换。也就是说,要替换每行中的所有出现,如下所示: $ sed -e 's/foo/bar/g' myfile.txt 在最后一个斜杠之后附加的 'g' 选项告诉 sed 执行全局替换。 关于 's///' 替换命令,还有其它几件要了解的事。首先,它是一个命令,并且只是一个命令,在所有上例中都没有指定地址。这意味着,'s///' 还可以与地址一起使用来控制要将命令应用到哪些行,如下所示: $ sed -e '1,10s/enchantment/entrapment/g' myfile2.txt 上例将导致用短语 'entrapment' 替换所有出现的短语 'enchantment',但是只在第一到第十行(包括这两行)上这样做。 $ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt 该例将用 'mountains' 替换 'hills',但是,只从空行开始,到以三个字符 'END' 开始的行结束(包括这两行)的文本块上这样做。 关于 's///' 命令的另一个妙处是 '/' 分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 's' 之后指定一个不同的字符来更改分隔符。例如,下例将把所有出现的 /usr/local 替换成 /usr: $ sed -e 's:/usr/local:/usr:g' mylist.txt 在该例中,使用冒号作为分隔符。如果需要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠。 规则表达式混乱 目前为止,我们只执行了简单的字符串替换。虽然这很方便,但是我们还可以匹配规则表达式。例如,以下 sed 命令将匹配从 '' 开始、到 '' 结束、并且在其中包含任意数量字符的短语。下例将删除该短语(用空字符串替换): $ sed -e 's/.*//g' myfile.html 这是要从文件除去 HTML 标记的第一个很好的 sed 脚本尝试,但是由于规则表达式的特有规则,它不会很好地工作。原因何在?当 sed 试图在行中匹配规则表达式时,它要在行中查找最长的匹配。在我的前一篇 sed 文章中,这不成问题,因为我们使用的是 'd' 和 'p' 命令,这些命令总要删除或打印整行。但是,在使用 's///' 命令时,确实有很大不同,因为规则表达式匹配的整个部分将被目标字符串替换,或者,在本例中,被删除。这意味着,上例将把下行: bThis/b is what bI/b meant. 变成:meant. 我们要的不是这个,而是:This is what I meant. 幸运的是,有一种简便方法来纠正该问题。我们不输入“'' 字符后面跟有一些字符并以 '' 字符结束”的规则表达式,而只需输入一个“'' 字符后面跟有任意数量非 '' 字符并以 '' 字符结束”的规则表达式。这将与最短、而不是最长的可能性匹配。新命令如下: $ sed -e 's/ *//g' myfile.html 在上例中,' ' 指定“非 ''”字符,其后的 '*' 完成该表达式以表示“零或多个非 '' 字符”。对几个 html 文件测试该命令,将它们管道输出到 "more",然后仔细查看其结果。 更多字符匹配 ' ' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示: ' *' 这将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 ' ' 字符类来匹配空格(字符类的相关信息可以参见本文前面部分内容)。 高级替换功能 我们已经看到如何执行简单甚至有些复杂的直接替换,但是 sed 还可以做更多的事。实际上可以引用匹配规则表达式的部分或全部,并使用这些部分来构造替换字符串。作为示例,假设您正在回复一条消息。下例将在每一行前面加上短语 "ralph said: ": $ sed -e 's/.*/ralph said: /' origmsg.txt 输出如下: ralph said: Hiya Jim, ralph said: ralph said: I sure like this sed stuff! ralph said: 该例的替换字符串中使用了 '' 字符,该字符告诉 sed 插入整个匹配的规则表达式。因此,可以将与 '.*' 匹配的任何内容(行中的零或多个字符的最大组或整行)插入到替换字符串中的任何位置,甚至多次插入。这非常好,但 sed 甚至更强大。 那些极好的带反斜杠的圆括号 's///' 命令甚至比 '' 更好,它允许我们在规则表达式中定义区域,然后可以在替换字符串中引用这些特定区域。作为示例,假设有一个包含以下文本的文件: bar oni eeny meeny miny larry curly moe jimmy the weasel 现在假设要编写一个 sed 脚本,该脚本将把 "eeny meeny miny" 替换成 "Victor eeny-meeny Von miny" 等等。要这样做,首先要编写一个由空格分隔并与三个字符串匹配的规则表达式: '.* .* .*' 现在,将在其中每个感兴趣的区域两边插入带反斜杠的圆括号来定义区域: '\(.*\) \(.*\) \(.*\)' 除了要定义三个可在替换字符串中引用的逻辑区域以外,该规则表达式的工作原理将与第一个规则表达式相同。下面是最终脚本: $ sed -e 's/\(.*\) \(.*\) \(.*\)/Victor \1-\2 Von \3/' myfile.txt 如您所见,通过输入 '\x'(其中,x 是从 1 开始的区域号)来引用每个由圆括号定界的区域。输入如下: Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel 随着对 sed 越来越熟悉,您可以花最小力气来进行相当强大的文本处理。您可能想如何使用熟悉的脚本语言来处理这种问题 -- 能用一行代码轻易实现这样的解决方案吗? 组合使用 在开始创建更复杂的 sed 脚本时,需要有输入多个命令的能力。有几种方法这样做。首先,可以在命令之间使用分号。例如,以下命令系列使用 '=' 命令和 'p' 命令,'=' 命令告诉 sed 打印行号,'p' 命令明确告诉 sed 打印该行(因为处于 '-n' 模式)。 $ sed -n -e '=;p' myfile.txt 无论什么时候指定了两个或更多命令,都按顺序将每个命令应用到文件的每一行。在上例中,首先将 '=' 命令应用到第 1 行,然后应用 'p' 命令。接着,sed 继续处理第 2 行,并重复该过程。虽然分号很方便,但是在某些场合下,它不能正常工作。另一种替换方法是使用两个 -e 选项来指定两个不同的命令: $ sed -n -e '=' -e 'p' myfile.txt 然而,在使用更为复杂的附加和插入命令时,甚至多个 '-e' 选项也不能帮我们的忙。对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后,用 -f 选项引用该脚本文件: $ sed -n -f mycommands.sed myfile.txt 这种方法虽然可能不太方便,但总是管用。 一个地址的多个命令 有时,可能要指定应用到一个地址的多个命令。这在执行许多 's///' 以变换源文件中的字和语法时特别方便。要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组,如下所示: 1,20{ s/ inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g } 上例将把三个替换命令应用到第 1 行到第 20 行(包括这两行)。还可以使用规则表达式地址或者二者的组合: 1,/^END/{ s/ inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g p } 该例将把 '{ }' 之间的所有命令应用到从第 1 行开始,到以字母 "END" 开始的行结束(如果在源文件中没发现 "END",则到文件结束)的所有行。 附加、插入和更改行 既然在单独的文件中编写 sed 脚本,我们可以利用附加、插入和更改行命令。这些命令将在当前行之后插入一行,在当前行之前插入一行,或者替换模式空间中的当前行。它们也可以用来将多行插入到输出。插入行命令用法如下: i\ This line will be inserted before each line 如果不为该命令指定地址,那么它将应用到每一行,并产生如下的输出: This line will be inserted before each line line 1 here This line will be inserted before each line line 2 here This line will be inserted before each line line 3 here This line will be inserted before each line line 4 here 如果要在当前行之前插入多行,可以通过在前一行之后附加一个反斜杠来添加附加行,如下所示: i\ insert this line\ and this one\ and this one\ and, uh, this one too. 附加命令的用法与之类似,但是它将把一行或多行插入到模式空间中的当前行之后。其用法如下: a\ insert this line after each line. Thanks! :) 另一方面,“更改行”命令将实际替换模式空间中的当前行,其用法如下: c\ You're history, original line! Muhahaha! 因为附加、插入和更改行命令需要在多行输入,所以将把它们输入到一个文本 sed 脚本中,然后通过使用 '-f' 选项告诉 sed 执行它们。使用其它方法将命令传递给 sed 会出现问题。 使用 sed 的几个示例 这些示例不仅演示 sed 的能力,而且还做一些真正巧妙(和方便)的事。例如,在本文的后半部,将为您演示如何设计一个 sed 脚本来将 .QIF 文件从 Intuit 的 Quicken 金融程序转换成具有良好格式的文本文件。在那样做之前,我们将看一下不怎么复杂但却很有用的 sed 脚本。 l 文本转换 第一个实际脚本将 UNIX 风格的文本转换成 DOS/Windows 格式。您可能知道,基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行。有时可能需要将某些 UNIX 文本移至 Windows 系统,该脚本将为您执行必需的格式转换。 $ sed -e 's/$/\r/' myunix.txt mydos.txt 在该脚本中,'$' 规则表达式将与行的末尾匹配,而 '\r' 告诉 sed 在其之前插入一个回车。在换行之前插入回车,立即,每一行就以 CR/LF 结束。请注意,仅当使用 GNU sed 3.02.80 或以后的版本时,才会用 CR 替换 '\r'。如果还没有安装 GNU sed 3.02.80,请在我的第一篇 sed 文章中查看如何这样做的说明。 我已记不清有多少次在下载一些示例脚本或 C 代码之后,却发现它是 DOS/Windows 格式。虽然很多程序不在乎 DOS/Windows 格式的 CR/LF 文本文件,但是有几个程序却在乎 -- 最著名的是 bash,只要一遇到回车,它就会出问题。以下 sed 调用将把 DOS/Windows 格式的文本转换成可信赖的 UNIX 格式: $ sed -e 's/.$//' mydos.txt myunix.txt 该脚本的工作原理很简单:替代规则表达式与一行的最末字符匹配,而该字符恰好就是回车。我们用空字符替换它,从而将其从输出中彻底删除。如果使用该脚本并注意到已经删除了输出中每行的最末字符,那么,您就指定了已经是 UNIX 格式的文本文件。也就没必要那样做了! l 反转行 下面是另一个方便的小脚本。与大多数 Linux 发行版中包括的 "tac" 命令一样,该脚本将反转文件中行的次序。"tac" 这个名称可能会给人以误导,因为 "tac" 不反转行中字符的位置(左和右),而是反转文件中行的位置(上和下)。用 "tac" 处理以下文件: foo bar oni ....将产生以下输出: oni bar foo 可以用以下 sed 脚本达到相同目的: $ sed -e '1!G;h;$!d' forward.txt backward.txt 如果登录到恰巧没有 "tac" 命令的 FreeBSD 系统,将发现该 sed 脚本很有用。虽然方便,但最好还是知道该脚本为什么那样做。让我们对它进行讨论。 反转解释:首先,该脚本包含三个由分号隔开的单独 sed 命令:'1!G'、'h' 和 '$!d'。现在,需要好好理解用于第一个和第三个命令的地址。如果第一个命令是 '1G',则 'G' 命令将只应用第一行。然而,还有一个 '!' 字符 -- 该 '!' 字符忽略该地址,即,'G' 命令将应用到除第一行之外的所有行。'$!d' 命令与之类似。如果命令是 '$d',则将只把 'd' 命令应用到文件中的最后一行('$' 地址是指定最后一行的简单方式)。然而,有了 '!' 之后,'$!d' 将把 'd' 命令应用到除最后一行之外的所有行。现在,我们所要理解的是这些命令本身做什么。 当对上面的文本文件执行反转脚本时,首先执行的命令是 'h'。该命令告诉 sed 将模式空间(保存正在处理的当前行的缓冲区)的内容复制到保留空间(临时缓冲区)。然后,执行 'd' 命令,该命令从模式空间中删除 "foo",以便在对这一行执行完所有命令之后不打印它。 现在,第二行。在将 "bar" 读入模式空间之后,执行 'G' 命令,该命令将保留空间的内容 ("foo\n") 附加到模式空间 ("bar\n"),使模式空间的内容为 "bar\n\foo\n"。'h' 命令将该内容放回保留空间保护起来,然后,'d' 从模式空间删除该行,以便不打印它。 对于最后的 "oni" 行,除了不删除模式空间的内容(由于 'd' 之前的 '$!')以及将模式空间的内容(三行)打印到标准输出之外,重复同样的步骤。 linux常用脚本和函数 l #查找当前目录中是否存在指定目录,若不存在,则创建之 function mkdir_1 { if test ! -d $1 then mkdir $1 fi } l #将指定文件中的"prefix = .*"串替换为"prefix=\/home\/gnome-unicore-install2\/usr/" #可以用来作为sed用法的参考 function modify_prefix { chmod +w $1 cp $1 $1.bak sed 's/prefix = .*/prefix=\/home\/gnome-unicore-install2\/usr/g' $1.bak $1 rm $1.bak } l #将指定文件中的"^LDFLAGS =.*"串替换为"LDFLAGS = -rdynamic -lgdk_pixbuf -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm" #change_gnome-config FILENAME function change_gnome-config { cp $1 $1.bak sed 's/^LDFLAGS =.*/LDFLAGS = -rdynamic -lgdk_pixbuf -lgtk -lgdk -lgmodule -lglib -ldl -lXext -lX11 -lm /g' $1.bak $1 rm $1.bak } l #删除指定文件的含有指定字符的行 #格式:delete_line filename "word_contain" function delete_line { chmod +w $1 cp $1 $1.bak cat $1.bak | grep -v -e "$2" $1 } l #用途:删除文件中包含line1或(和?)line2的行 #格式:delete_line filename line1 line2 function delete_line_no { chmod +w $1 cp $1 $1.bak sed $2,$3'd' $1.bak$1 rm $1.bak } l #用途:在LINE_NO指定的行插入字符串CONTENT #可以用来作为sed用法的参考 #格式: add_line FILENAME LINE_NO CONTENT function add_line { chmod +w $1 cp $1 $1.bak sed -e $2 'i\' "$3" '' $1.bak $1 rm $1.bak } l #用途:检查含有"PC24"代码的程序并打印出来 #格式: check_PC24 //after installation function check_PC24 { echo "now comes the PC24 checking..." . $COMMAND_UNICORE/shell/shell_PC24 /dev/null if test -s $COMMAND_UNICORE/PC24_result then : echo "The following file contains PC24 problems: $COMMAND_UNICORE/PC24_result " else echo "No PC24 problem found" fi } l #打印标题 displayheader() { echo " *****************************************" echo " * IeeeCC754 testing tool *" echo " *****************************************" echo " " } l #打印一个菜单的做法 displayplatformmenu() { #clear the screen clear displayheader echo " a) SunSparc " echo " b) IntelPentium " echo " c) AMD " echo " d) Unicore32 " echo " e) Unicore32(with FP2001) " echo " " echo -n " select a Platform " } l #接收一个菜单输入 displayplatformmenu read answer case ${answer} in a) TARGET="BasicOp";; b) TARGET="Conversion";; *) badchoice;; esac l #查找当前目录下是否存在file_name文件 #可以用来作为if用法的参考 detectfile_name() { if then echo "Error: file_name does not exist. Please check" exit 1; else echo "OK,the directy is exist" fi } l #将参数指定的一个或多个目录项以及其下的多级子目录下的所有文件名和目录名转换为小写。 cvitem() { echo "mv $1 `dirname $1`/`basename $1 | tr \ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`" } { echo "Usage: lcdir item1 item2 ..."; exit; } for item in $* #可以用来作为for用法的参考 do { { for subitem in `ls $item` do cvlc $item/$subitem done } cvitem $item } done l #一个login的例子 if ($?path) then set path=($HOME/bin $path) else set path=($HOME/bin /usr/bin .) endif if ( ! $ {?DT} ); then stty dec new tset -I -Q endif set mail=/usr/spool/mail/$USER l #关于if使用的几个例子 n #执行一个命令或程序之前,先检查该命令是否存在,然後才执行 if ; then echo "Turning on Quota for root filesystem" /sbin/quotaon / fi n #得到Hostname #!/bin/sh if ; then HOSTNAME=`cat /etc/HOSTNAME` else HOSTNAME=localhost fi n #如果某个设定档允许有好几个位置的话,例如crontab,可利用if then elif fi来找寻 if ; then # 等价于test -f /etc/crontab CRONTAB="/etc/crontab" elif ; then CRONTAB="/var/spool/cron/crontabs/root" elif ; then CRONTAB="/var/cron/tabs/root" fi export CRONTAB n #利用uname来判断目前系统,并分别做各系统状况不同的事。 SYSTEM=`uname -s` if ; then echo "Linux" elif ; then echo "FreeBSD" elif ; then echo "Solaris" else echo "What?" fi l #关于while使用的几个例子 n #无条件循环 while : ; do echo "do something forever here" sleep 5 done linux常用命令 以下只说明各指令的基本用法, 若需详细说明, 请用 man 去读详细的 manual. 关于文件/目录处理的指令: 1. ls 这是最基本的文件指令。 ls 的意义为 "list",也就是将某一个目录或是某一个文件的内容显示出来。 如果你在下 ls 指令后面没有跟任何的文件名,它将会显示出目前目录中所有文件。 也可以在 ls 后面加上所要察看的目录名称或文件的名称,如: % ls /home2/X11R5 % ls first ls 有一些特别的参数,可以给予使用者更多有关的信息,如下: -a : 在 UNIX 中若一个目录或文件名字的第一个字符为 "." , 则使用 ls 将不会显示出这个文件的名字,我们称此类文件为隐藏文件。如果我们要察看这类文件,则必须加上参数 -a 。 -l : 这个参数代表使用 ls 的长( long )格式,可以显示更多的信息,如文件存取权,文件拥有者( owner ),文件大小,文件最后更新日期,甚而 symbolic link 的文件是 link 到那一个文件等等。例如: % ls -l drwx--x--x 2 jjtseng 512 Aug 8 05:08 18 drwx--x--x 2 jjtseng 512 Aug 8 22:00 19 -rw------- 1 jjtseng 566 Aug 8 05:28 makefile 2. cp cp 这个指令的意义是复制("COPY") , 也就是将一个或多个文件复制成另一个文件或者是将其复制到另一个目录去。 cp 的用法如下: cp f1 f2 : 将文件名为 f1 的文件复制一份为文件名为 f2 的文件。 cp f1 f2 f3 ... dir : 将文件 f1 f2 f3 ... 都以相同的文件名复制一份放到目录 dir 里面。 cp -r dir1 dir2 : 将 dir1 的全部内容全部复制到 dir2 里面。 cp 也有一些参数,如下: -i : 此参数是当已经有文件名为 f2 的文件时,若迳自使用 cp 将会将原来 f2的内容覆盖,因此在要覆盖之前先询问使用者。如使用者的回答是y(yes)才执行复制的动作。 -r : 此参数是用来做递回复制用,可递归的将整个目录都复制到另一个目录中。 3. mv mv 的意义为 move , 主要是将一文件改名或移动到另一个目录。与cp类似,它也有三种格式: mv f1 f2 : 将文件名为 f1 的文件变更成文件名为 f2 的文件。 mv dir1 dir2 : 将文件名为 dir1 的目录变更成文件名为 dir2 的目录。 mv f1 f2 f3 ... dir : 将文件 f1 f2 f3 ... 都移至目录 dir 里面。 mv 的参数有两个,-f 和 -i , 其中 -i 的意义与 cp 中的相同,均是 interactive的意思。而 -f 为强迫( force ) , 就是不管有没有同名的文件,反正就是要执行,所有其他的参数遇到 -f 均会失效。 4. rm rm 的意义是 remove ,也就是用来删除一个文件的指令。需要注意的是,在 UNIX 中一个被删除的文件除非是系统恰好做了备份,否则是无法像 DOS 里面一样还能够恢复的。所以在做 rm 动作的时候使用者应该要特别小心。 rm 的格式如下: rm f1 f2 f3 ..... rm 的参数比较常用的有几个: -f , -i , 与 -r -f : 将会使得系统在删除时,不提出任何警告讯息。 -i : 在删除文件之前均会询问是否真要删除。 -r : 递归的删除,可用于删除目录。 5. mkdir mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用 mkdir 建立一个子目录,使用的方法如下: mkdir dirname1 8. pwd pwd 会将当前目录的路径( path )显示出来 9. cat/more/less 以上三个指令均为察看文件内容的指令。cat 的意义是concatenate,实际就是把文件的内容显示出来的意思。 cat 有许多奇怪的参数,较常为人所使用的是 -n 参数,也就是把显示出来的内容加上行号。 cat 的用法如下: cat :自标准输入读取内容,可以用 pipe 将别的指令的输出转向给 cat 。 cat filename : 将 filename 的内容读进来,显示在标准输出上。 问题在於 cat 它是不会停下来的,因此并不好用( 试想如果一个萤幕二十四行,而一个文件四百行,cat 一出来将会噼里啪啦不断的卷上去,使用者很难据此得到他们所需的信息。) 所以常常么使用 more 和less来帮助。 more 可以让文件根据控制台的模式一页页的显示出来,再根据使用者的要求换页或者换行。如果使用者要在某一个文件中搜寻一个特定的字符串,则按 / 然后跟着打所要搜寻的单字即可进行搜寻。 more 的使用法如下: more filename 如果你在使用中觉得已经看到了所要看的部份,可以按'q'离开 more 的使用。 less 的用法与 more 极类似,原先它就是为了弥补 more 只能往前方卷页的缺点而设计。 Less 的用法如下: less filename 它与 more 不同的是它可以按 y 来往上卷一行,并且可以用"?"来往回搜寻你所要找的字符。 10. chmod chmod用来改变文件存取模式( change mode ) 。在linux中,一个文件有可读(r)可写(w)可执行(x)三种模式,分别针对该文件的拥有者( onwer )、同组用户( group member )(可以 ls -lg来观看某一文件的所属的 group ),以及其他人( other )。 一个文件如果改成可执行模式则系统就将其视为一个可执行文件,而一个目录的可执行模式代表使用者有进入该目录之权利。 chmod使用方式如下: chmod mode filename ... 其参数的意义如下: -f Force. chmod 不会理会失败的动作。 -R Recurive. 会将目录下所有子目录及文件改为你所要改成的模式。 关于 Process 处理的指令: 1. ps ps 是用来显示目前你的 process 或系统 processes 的状况。 其选项说明如下: -a 列出包括其他 users 的 process 状况。 -u 显示 user - oriented 的 process 状况 。 -x 显示包括没有 terminal 控制的 process 状况 。 -w 使用较宽的显示模式来显示 process 状况 。 我们可以经由 ps 取得目前 processes 的状况,如 pid , running state 等。 2. kill kill 指令的用途是送一个 signal 给某一个 process 。因为大部份送的都是用来杀掉 process 的 SIGKILL 或 SIGHUP,因此称为kill 。 kill 的用法为: kill pid ... kill -l SIGNAL 为一个 singal 的数字,从 0 到 31 ,其中 9 是 SIGKILL ,也就是一般用来杀掉一些无法正常 terminate 的信号。 也可以用 kill -l 来察看可代替 signal 号码的数字。 关于字符串处理的指令: 1. echo echo 是用来显示一字符串在标准输出上。echo -n 则表示当显示完之后不执行换行操作。 2. grep grep 为一过滤器,它可自一个或多个文件中过滤出具有某个字符串的行,或是从标准输入过滤出具有某个字符串的行。 grep的用法如下: grep match_pattern file1 file2 .... -n 把所找到的行在行前加上行号列出 -v 把不包含 match_pattern 的行列出 match_pattern 所要搜寻的字符串 -f 以 pattern_file 存放所要搜寻的字符串 联机查询的指令: 1. man man 是手册 ( manual ) 的意思。 UNIX 提供线上辅助( on-line help )的功能,man 就是用来让使用者在使用时查询指令、系统调用、标准库函数、各种表格等的使用所用的。 man 的用法如下: man title ] ..... man -k keyword ... -M path man 所需要的 manual database 的路径。我们也可以用设定环境变数 MANPATH 的方式来取代 -M 选项。 title 这是所要查询的目标。 section 用一个数字表示 manual 的分类,通常 1 代表可执行指令,2 代表系统调用( system call ) ,3 代表标准库函数,等等。 man 在 UNIX 上是一项非常重要的指令,我们在这里所描述的用法仅仅只是一个大家比较常用的用法以及简单的说明,真正详细的用法与说明还是要通过使用 man 来得到。 2. who who 指令是用来查询目前有那些人在线上。 3. info info的查询与man类似。 网络运用指令: 1. telnet telnet 是一个提供 user 通过网络连到 remote host。 telnet 的 格式如下: telnet hostname 为一个像 ccsun1 或是 ccsun1.cc.nctu.edu.tw 的 name address,ip-address 则为一个由四个小于 255 的数字组成的 ip address , 2. ftp ftp 的意义是 File Transfer Program ,是一个很常用的在网路文件传输的软件。 ftp 的格式如下: ftp 其中 hostname | ip-address 的意义跟 telnet 中的相同。 在进入 ftp 之后,如果与 remote host 连接上了,它将会询问你 username 与密码,如果输入对了就可以开始进行文件传输。 在 ftp 中有许多的命令,这里仅列出较常用的 cd , lcd , mkdir , put , mput , get , mget , binary , ascii , prompt , help 与 quit 的使用方式。 ascii 将传输模式设为 ascii 模式。通常用於传送文字文件。 binary 将传输模式设为 binary 模式,通常用于传送执行文件,压缩文件与影像文件等。 cd remote-directory 将 remote host 上的工作目录改变。 lcd 更改 local host 的工作目录。 ls 列出 remote host 上的文件。 get remote-file 取得登陆机的文件。 mget remote-files 可使用通用字符一次取得多个文件。 put local-file 将 local host 的文件送到 remote host。 mput local-files 可使用通用字符一次将多个文件放到 remote host 上。 help 线上辅助指令。 mkdir directory-name 在 remote host 新建一个目录。 prompt 更改交谈模式,若为 on 则在 mput 与 mget 时每做一个文件传输时均会询问。 Exit/quit离开ftp 3.rlogin命令 rlogin 是“remote login”(远程登录)的缩写。该命令与telnet命令很相似,允许用户启动远程系统上的交互命令会话。 rlogin 的一般格式是: rlogin host 一般最常用的格式是: rlogin host 该命令中各选项的含义为: -8 此选项始终允许8位输入数据通道。该选项允许发送格式化的ANSI字符和其他的特殊代码。如果不用这个选项,除非远端的终止和启动字符不是或,否则就去掉奇偶校验位。 -E 停止把任何字符当作转义字符。当和-8选项一起使用时,它提供一个完全的透明连接。 -K 关闭所有的Kerberos确认。只有与使用Kerberos 确认协议的主机连接时才使用这个选项。 -L 允许rlogin会话在litout模式中运行。要了解更多信息,请查阅tty联机帮助。 -d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多信息,请查阅setsockopt的联机帮助。 -e 为rlogin会话设置转义字符,默认的转义字符是“~”,用户可以指定一个文字字符或一个\\nnn形式的八进制数。 -k 请求rlogin获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_realmofhost(3)确定的远程主机区域内的远程主机的Kerberos 许可。 -x 为所有通过rlogin会话传送的数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。 4.rsh命令 rsh是“remote shell”(远程 shell)的缩写。 该命令在指定的远程主机上启动一个shell并执行用户在rsh命令行中指定的命令。如果用户没有给出要执行的命令,rsh就用rlogin命令使用户登录到远程机上。 rsh命令的一般格式是: rsh host 一般常用的格式是: rsh host command可以是从shell提示符下键人的任何Linux命令。 rsh命令中各选项的含义如下: -K 关闭所有的Kerbero确认。该选项只在与使用Kerbero确认的主机连接时才使用。 -d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多的信息,请查阅setsockopt的联机帮助。 -k 请求rsh获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。 -l 缺省情况下,远程用户名与本地用户名相同。本选项允许指定远程用户名,如果指定了远程用户名,则使用Kerberos 确认,与在rlogin命令中一样。 -n 重定向来自特殊设备/dev/null的输入。 -x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。 Linux把标准输入放入rsh命令中,并把它拷贝到要远程执行的命令的标准输入中。它把远程命令的标准输出拷贝到rsh的标准输出中。它还把远程标准错误拷贝到本地标准错误文件中。任何退出、中止和中断信号都被送到远程命令中。当远程命令终止了,rsh也就终止了。 5.rcp命令 rcp代表“remote file copy”(远程文件拷贝)。该命令用于在计算机之间拷贝文件。 rcp命令有两种格式。第一种格式用于文件到文件的拷贝;第二种格式用于把文件或目录拷贝到另一个目录中。 rcp命令的一般格式是: rcp file1 file2 rcp file directory 每个文件或目录参数既可以是远程文件名也可以是本地文件名。远程文件名具有如下形式:rname@rhost:path,其中rname是远程用户名,rhost是远程计算机名,path是这个文件的路径。 rcp命令的各选项含义如下: -r 递归地把源目录中的所有内容拷贝到目的目录中。要使用这个选项,目的必须是一个目录。 -p 试图保留源文件的修改时间和模式,忽略umask。 -k 请求rcp获得在指定区域内的远程主机的Kerberos 许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。 -x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。 如果在文件名中指定的路径不是完整的路径名,那么这个路径被解释为相对远程机上同名用户的主目录。如果没有给出远程用户名,就使用当前用户名。如果远程机上的路径包含特殊shell字符,需要用反斜线(\\)、双引号(”)或单引号(’)括起来,使所有的shell元字符都能被远程地解释。 需要说明的是,rcp不提示输入口令,它通过rsh命令来执行拷贝。 Vi常用技巧 l 取消命令 在vi中,只要没有把修改结果存入磁盘文件中,那么就可以通过“取消”来撤销最近的操作或对缓冲区的修改。 假设你无意删除了一行文本、改变了一些你不应该改变的内容或增加了一些不正确的文本,可以按Esc改变到命令模式中,然后按u,则文件内容恢复到修改前的样子。 l 保存到文件名为filename的文件中 发出写命令格式: :w filename l 不使用小键盘来定位光标 vi用h、j、k、l键来定位光标。其中h、l键表示光标的左右移动,j、k键表示光标的上下移动,在某些没有或不能使用小键盘的情况下这四个键是很有用的。 下面是其他一些用于移动光标的键: n 按空格键或l向右移动光标一个位置 n 按Return将光标移动到下一行的行首 n 使用j键将光标移动到下一行的当前位置或行末 n 按-将光标移动到上一行行首 n 使用k键将光标移动到上一行的当前位置或行末 n 按h将光标向左移动一个字符 n 按0(零)将光标移动到一行的行首 n 按$将光标移动到一行的行末 l 大范围移动键 可快速定位光标到屏幕的顶部、中部和底部: n 按Shift-h将光标移到屏幕的第一行,有时称为home位置 n 按Shift-m将光标移到现在屏幕显示的各行的中间一行 n 按Shift-l将光标移到屏幕的最后一行 n 按Ctrl-f向前移动一屏 n 按Ctrl-b向后移动一屏 n 要移动到缓冲区中指定的行中,在按Shift-g前键入行号(注意,这里的行号不是当前屏幕中的相对行号,而是绝对行号) l 删除文本 n x删除光标处的字符 n d w 删除从当前字的光标处到下一个字的开始处之间的内容 n d $ 删除从光标处到行尾之间的内容 n Shift-d 同d $,删除当前行的剩余部分 n d d 删除整行,不管光标在该行的位置 n 通过在上述命令之前键入一个整数,可将这些命令应用到几个对象中,例如:4 x删除4个字符;8 d d 删除8行 l 添加文本 n 使用i在光标位置前插入文本 n 使用Shift-i使你进入输入模式并且在当前行行首插入文本 n 使用a在光标位置后插入文本 n 使用Shift-a使你进入输入模式并且在当前行末尾插入文本 n 使用o在当前行的下面打开一行以添加文本 n 使用Shift-o在当前行的上面打开一行以添加文本 l 使vi显示行号 按Esc键以确保你在命令模式中,然后输入:se number。要关闭行号,输入:se nonumber l 查找 n /string 在缓冲区中向前查找字符串string n ?string 在缓冲区中向后查找字符串string n n 以当前的方向再次查找 n Shift-n以相反的方向再次查找 n 注意,查找的字符串中若含有特殊字符的,要使用\来进行转意 l 修改和替换文本 n r 替换单个字符 n Shift-r替换一个字符序列 n c w修改当前字,从光标处到这个字的字尾 n c e修改当前字,从光标处到这个字的字尾(与c w相同) n c b修改当前字,从该字的字头到光标以前的那些字符 n c $修改一行,从光标处到该行的行尾 n Shift-c修改一行,从光标处到该行的行尾(与c $相同) n c c修改整行 n 注意,这些命令的每个命令都使之进入了输入模式。除使用r来替换单个字符外,必须按Esc键来完成所作的修改并返回命令模式 n 要修改几个字,在按c w之前使用一个整数 l 拷贝、剪切和粘贴 n y w拷贝从当前字的光标处到下一个字的开始处之间的内容 n y $拷贝从光标处到行尾之间的内容 n Shift-y拷贝当前行的剩余部分(与y $相同) n y y拷贝整个当前行 n 通过在这些命令前键入整数,所有这些命令都可以用于多个对象。 n 当删除或剪切或拷贝时,删除或拷贝的对象被保存在通用缓冲区中,可以使用p或Shift-p命令将这个缓冲区中的内容粘贴到光标位置。 n p命令将对象粘贴到光标位置右边或光标位置后面 n Shift-p命令将对象粘贴到光标位置左边或光标位置前面 l 重复命令 可以按 . 来重复改变缓冲区的最后一个命令。 文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/shell/shelljs/20111214/564330.html
个人分类: 脚本|4707 次阅读|0 个评论
编程的困惑与享受——自我反省
热度 5 zhangqifeng0504 2012-6-3 11:04
编程的困惑与享受——自我反省
编程的困惑与享受——自我反省 ——写于清早调完程序后 张启峰 自上周从岳阳回来,一直在写代码,原因是论文中需要配附例子来说明算法的有效性,而这些例子都是建立在大量的数值算例模拟基础之上的。 周三晚上写了个程序,主程序不到三百行,两个小时就写完了。一运行,傻眼了,就是通不过,于是满屏幕的找错误,哎哟,检查到接近晚上十二点,居然一个错误没看出来,那叫一个心灰意冷,心想是不是算法有问题,于是先放那准备第二天继续。可到了第二天我又被一些乱七八糟的事情给占了,算法拖到晚上才去检查,又是很晚,然后又是很失落,没发现程序有任何 Bug ,这下更是痛苦了,心想算了,放弃这个程序得了,回头从新再编。第三天也就是周五,来实验室第一件事把算法重新在纸上写一遍,然后下午对着算法把程序重新写一遍,算法没问题,可找到了原来程序中几个小错误,运行结果和料想的还是出入很大,因为收敛阶达不到,像这样的经典算法是不可能的,接下来继续检查程序,又是很晚,又是失望而归。第四天也就是周六了,上午乘脑袋清醒,把程序打印出来检查,果然又找到几个错误,天呐,多数是低级的,虽然搞到中午还是没搞定,但程序的结果已经很接近了,我对算法和程序更有自信了,想想肯定还有错误。下午找几个同学打了乒乓球,晚上本打算继续检查呢,看了一会就看不下去了,被网友叫去打牌了,很晚才回去,对自己很无语。今早上来实验室,第一件事开电脑,开 Matlab ,然后静下心来,找程序 Bug ,不到俩小时,居然发现五六个错误,可还是有问题,师兄建议我换个例子试试,或者找熟悉的人聊聊,我偏不,觉得这个算法一定可以,不该是例子的问题,就在失落到底的时候,又找到了一丝的错误,点击运行通过了,和想象的一模一样,此时一阵阵的兴奋和激动,不亚于考研复试成功后的那种感觉。 从这几天的编程反省一下自己不足: 首先, 自己是马虎的人 ,做什么事情总想着快点完成,以至于中间低级错误不断重现,本来认真点或许一天就可以完成的事,我偏偏搞了大半个星期; 其次, 克制力太差 ,本来该学习的时间,我偏偏开小差了; 第三, 做事情的时间安排不合理 ,本来晚上脑袋就不清醒,这时候检查程序无异于雪上加霜,弄得自己更是不爽; 第四, 老和自己过不去 ,不知道这叫自信过头还是过于固执,对自己认为对的东西常常是深信不疑,以至于不把错误找出来,就不想放弃这个想法,这点吃了很多亏; 第五, 逃避问题 ,编程是个很死板的活,只要算法对,肯定是程序代码错,可此时我却老想着其他的细节,做事情不够专心踏实; 第六, 对自己认识还不清晰 ,尤其是思想上困惑很多。 欢迎博友们多多批评指正, 你们的建议 是我前进的动力。 图片来自于互联网 无尽的迷茫 你说有几条?困惑呀
个人分类: 科普集锦|5439 次阅读|7 个评论
编程所遇(001)
hncszwj 2012-5-22 11:43
1.编程例题:在X10上升沿时,将30、35、40、……、70九个数据构成的公差为5的等差数列依次送入寄存器D20~D28中。 2.初步设想:先将指针清零、送30至D20中;然后8次循环,每次循环将D20Z0中的数据增加5送入D21Z0,再指针加1。 3.初步编写:输入语句表 LDP X010 RST Z0 MOV K30 D20 FOR K8 ADD D20Z0 K5 D21Z0 INC Z0 NEXT 转换成梯形图后,循环程序部分显示黄色,如图1所示。 图1 4.问题解决:在ADD前增加常ON触点M8000,语句表变为: LDP X010 RST Z0 MOV K30 D20 FOR K8 LD M8000 ADD D20Z0 K5 D21Z0 INC Z0 NEXT 再转换成梯形图,变换,如图2所示,就可以了。 图2 5.结论:ADD和INC都不能直接接在左母线上。
3069 次阅读|0 个评论
统计编程--R语言简介
热度 9 ChinaAbel 2012-5-13 18:28
久闻R语言的大名,但由于专业原因,直到去年暑假一个偶然的机会与一位统计专业的人士聊天,才知道R语言的强大威力!(当然这里没有贬低SPSS, SAS, Stata的意 思)。 R语言是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。它是统计领域广泛使用的诞生于 1980年左右的 S 语言的一个分支。 R是S语言的一种实现。S语言是由 ATT贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。最初S语言的实现版本主要是S-PLUS。S-PLUS是一个商业软件,它基于S语言,并由MathSoft 公司的统计科学部进一步完善。后来Auckland大学的Robert Gentleman 和 Ross Ihaka 及其他志愿人员开发了一个R系统。R的使用与S-PLUS有很多类似之处,两个软件有一定的兼容性。S-PLUS的使用手册,只要经过不多的修改就能成为 R的使用手册。换句话说:R,是S-PLUS的一个“克隆”,但R语言是免费的。 R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输入,可实现分支、循环,用户可自定义功能 。与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。 R内建多种统计学及数字分析功能。 R语言的功能也可以透过安装套件(Packages,用户撰写的功能)增强。增加的功能有特殊的统计技术、绘图功能,以及编程介面和数据输出/输入功能。这些软件包是由R语言、 LaTeX、Java及最常用C语言和Fortran撰写。下载的执行档版本会连同一批核心功能的软件包,而根据 CRAN纪录有过千种不同的软件包。其中有几款较为常用,例如用于经济计量、财经分析、人文科学研究以及人工智能。因为S的血缘,R比其他统计学或数学专用的编程语言有更强的物件导向(面向对象程序设计)功能。此外虽然R语言主要用于统计分析或者开发统计相关的软体,但也有人用作矩阵计算。其分析速度可比美GNU Octave甚至商业软件MATLAB。   该语言的语法表面上类似 C,但在语义上是函数设计语言的(functional programming language)的变种并且和Lisp 以及 APL有很强的兼容性。特别的是,它允许在“语言上计算”(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。   R是一个免费的自由软件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免费下载和使用的。R的主要网站是 http://www.r-project.org 。在那儿可以下载到R的安装程序和源代码、各种外挂程序和文档(点击进入:Windows (95 and later),再点击:base,下载SetupR.exe,约18兆,此便是R FOR WINDOWS的安装程序。双击SetupR.exe,按照提示一步步安装即可)。在R的安装程序中只包含了8个基础模块,其他外在模块可以通过CRAN(Comprehensive R Archive Network(R综合典藏网)的简称)获得( http://cran.r-project.org )。 统计编程R语言的更详细的介绍见: 中文官网: http://www.rproject.cn/ 英文官网: http://www.r-project.org/ http://cran.r-project.org/other-docs.html http://cran.r-project.org/mirrors.html 在这里我也给出一些学习R语言的材料共各位需要了解R语言的博友参考。(均来自网上,无版权,请勿商用!) 1. R for Beginners (中文版).pdf 2. R导论.pdf 3. R语言简介.pdf 4. 153 分钟学会R.pdf 5. 统计编程的框架与R语言统计分析基础.pdf 6. R语言初步_统计绘图与编程.ppt 7. R语言与统计分析.ppt 最近Springer出了一本用R语言解微分方程的书:Solving Differential Equations in R (Series: Use R!Soetaert, Karline, Cash, Jeff, Mazzia, Francesca,pp248, Springer,2012),希望热心的博友能提供一个电子版。谢谢!以下是这本书的前言摘录:Numerous examples help the reader to quickly solve a variety of differential equations in the open source software R. Shows how R can be used as a problem solving environment, using examples from the biological, chemical, physical, mathematical sciences. 我想找的书由热心的博友 bleu1860 提供: 8. Solving Differential Equations in R.pdf R语言资料汇集 R语言 中文网- R语言 论坛-最大的 R语言 中文社区 R语言 学习笔记 R语言 入门教程 R语言 _数据分析_中国统计网 下载R程序, http://www.r-project.org/ 。当然,如果你一定是找不到这个网站中R语言的程序位置,那么请看这里: http://ftp.ctex.org/mirrors/CRAN/ ,在这里,请点击install R for the first time,这样你就可以把这个软件下载下来了。接下来就跟我们平时使用软件一样,安装,安装时请注意一点: 安装路径不要有中文字符 ,以避免一些不必要的麻烦。接下来,我推荐大家一个额外的步骤,事实上你进行了上述步骤就可以真正开始你的R语言的使用了,但是我推荐大家再安装另外一个软件,叫做Rstudio。下载地址为: http://www.rstudio.com/ide/download/ 如果Rstudio提示你不能找到R的位置,你可以自行寻找,这里不再赘述。 R语言教材小结(2014.9) 以下内容转自: 常用统计学相关软件及网络资源 1、统计编程、应用软件 (1)、C语言 C语言计算速度快,但是编程难度大 入门教材: C语言趣味程序百例精解 (2)、Matlab 偏重于矩阵计算 相关教材:(见人大经济论坛) (a)、Applied Econometrics using MATLAB (b)、Computational Statistics Handbook with MATLAB (c)、Applied Statistics Using SPSS, STATISTICA, MATLAB and R (d)、An Introduction to Statistics in Matlab(可作为入门教材之一) 使用Matlab求解最大、小值时的有用工具: (a)、fmincon matlab自带函数,主用用于求解带约束条件时,给定函数的最小值,见相应的matlab help文档。 遗传算法(速度慢) (b)、fminunc Matlab自带函数,求解无约束条件下,某给定函数的最小值。 (c)、遗传算法工具箱 http://www.geatbx.com/ea_matlab.html 主要优点:对目标函数几乎没有要求,主要用于目标函数形式比较复杂情况下的优化问题 主要缺点:计算速度慢。 (3)、R语言 http://www.r-project.org/ R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R的语言风格和matlab及其类似,数据处理时,均采用向量化处理。R是开源软件,因此在 国外的高等院校中较为普及,是统计学、生物学及经济学等相关专业硕士至博士级的学生的必须课程。 但R的主要缺点是,R的内存管理能力较差,运行时会占用较多的内存资源,因此编程过程中,注意及时释放内存。此外,计算速度慢,特别当需要多次循环迭代时,速度极慢。解决的方法是,将需要循环迭代的部分用C或者Fortran语言编写,然后采用相关的接口程序加以调用。 R自带的编辑器较为简单,现在一般都使用开源软件Tinn-R来进行编辑。Tinn-R具有一定的语法检测和高亮显示功能。其下载地址: http://www.sciviews.org/Tinn-R/ 相关教材: (a)、R语言简介(最初级的入门教材,为R软件自带说明书) (b)、Time series analysis and its applications with R examples(结合时间序列分析) (c)、Introductory Statistics with R (d)、Programming with R(侧重于介绍R语言内在的逻辑和思想,较为高级,需要有一定的编程开发基础) (e)、Statistics with R(例子为主,较为全面) (4)、S及S-Plus S-Plus为商业软件。不过由于凡是能在S-Plus环境运行的程序,基本上都可以在R环境运行。 相关教材: (a)、Modelling Financial Time Series with S-PLUS (b)、Applied Smoothing Techniques for Data Analysis The Kernel Approach with S-Plus Illustrations (c)、Modern Applied Statistics with S (R 、S-Plus 等语言方面的经典教程 ) (d)、S Programming (R、S-Plus等语言方面的经典教程,内容更深刻,比Modern Applied Statistics with S难度大) (5)、SPSS、SAS SPSS是社会统计学的应用软件,再开发能力差。但简单易用。在国内较为普及,因此网络上可查找的资源较多 SAS是功能最强大的统计软件,具有优越的大型数据操作能力,为国外统计学专业的必备课程。但入门较难。 相关教程: (a)、The Little SAS Book. 2、文字编辑软件 (1)、CTex http://www.ctex.org/HomePage 中文版的latex。它已经集成了文字编辑和pdf编译为一起,是一款优化的数学论文编辑软件。用其编辑出来的数学公式大方美观。支持中文输入和编辑中文论文。 (2)、MikTex http://www.miktex.org/ 开源软件,功能类似于Ctex,但不支持中文编辑。自带的编辑器功能简单,一般结合软件TeXnicCenter和SummtraPDF(均为开源软件)软件使用。 (3)、TeXnicCenter http://www.texniccenter.org/ 开源软件,功能类似于WinEdt编辑器。某些功能甚至超过了WinEdt。 (4)、SummtraPDF http://blog.kowalczyk.info/software/sumatrapdf/free-pdf-reader.html PDF阅览器,占硬盘空间极小,编译时无需关闭,因此使用特别方便。此外,使用SummtraPDF还可以阅览djvu格式( http://djvu.org/ )的文件,因此功能特别强大。在国外使用非常广泛。 相关教程及论坛地址: (a)、 http://en.wikibooks.org/wiki/LaTeX (b)、 http://bbs.ctex.org/ (5)、UltraEdit和UltraComp 商业软件。具有强大的数据编辑和文字比较功能。可以与上述编程问论文编辑软件结合使用,可极大的提高效率。 3、网络资源 (1)、人大经济论坛 http://bbs.pinggu.org/ 可以下载数学相当可观的统计、经济、统计软件类外文电子书籍 (2)、统计之都 http://cos.name/ (3)、小木虫论坛 http://emuch.net/bbs/ 讨论科研、出国等方面的主要论坛之一 (4)、R语言中文论坛 http://www.biostatistic.net/forum-42-1.html
个人分类: 计算机&大数据|35121 次阅读|16 个评论
[转载]C语言编程指南 网络资源 - 运算符
chnfirst 2012-5-11 16:50
http://msdn.microsoft.com/zh-cn/library/ms173145.aspx 运算符(C# 编程指南) Visual Studio 2010 其他版本 Visual Studio 11 Visual Studio 2008 Visual Studio 2005 SPAN id=mt1 class=sentence data-guid="6e8389ad814e836de3eddc7ec47b9317" data-source='In C#, an operator is a program element that is applied to one or more operands in an expression or statement.' jQuery1710533584943800696="1"在 C# 中,运算符是应用于表达式或语句中一个或多个操作数的程序元素。 SPAN id=mt2 class=sentence data-guid="f60d0d8d3a05e5f251e2e5953f8b70bd" data-source='Operators that take one operand, such as the increment operator ( ++ ) or new , are referred to as unary operators.' jQuery1710533584943800696="2"接受一个操作数的运算符称为“一元”运算符,例如增量运算符 ( ++ ) 或 new 。 SPAN id=mt3 class=sentence data-guid="c8620114fdcc6bb5d8553b429ee95d87" data-source='Operators that take two operands, such as arithmetic operators ( + , - , * , / ), are referred to as binary operators.' jQuery1710533584943800696="3"接受两个操作数的运算符称为“二元”运算符,例如算术运算符 + 、 - 、 * 、 / 。 SPAN id=mt4 class=sentence data-guid="9d0b6da6ec79090b84241165b706f4fb" data-source='One operator, the conditional operator ( ?: ), takes three operands and is the sole ternary operator in C#.' jQuery1710533584943800696="4"条件运算符 ?: 接受三个操作数,是 C# 中唯一的三元运算符。 下面的 C# 语句包含一个一元运算符和一个操作数。 SPAN id=mt6 class=sentence data-guid="aad93e5e8ed1832e3e49adadde9895ee" data-source='The increment operator, ++ , modifies the value of the operand y .' jQuery1710533584943800696="6"增量运算符 ++ 修改操作数 y 的值。 注释:该网站还有很多资源!
个人分类: Linux|0 个评论
MCU编程体会
热度 1 VoyagerBu 2012-5-6 10:59
随着技术的进步,单片机的功能越来越强(价格越来越低),现在已经称之为MCU(微控制单元)。尽管嵌入式系统中的高端器件不断涌现,但在许多需要考虑体积、功耗、性价的应用中,8位MCU依然是主流。 网上有不少MCU的编程经验,这里结合自己的编程经历,分享一些MCU编程体会: 1、编程之前应该画一张程序流程图,设计好程序框架。一个好的流程图可以提高后续的编程效率,能够及时发现MCU硬件资源的限制。通常人机交互的按键扫描程序可以放在主程序中(后台,响应稍慢),其它功能可以用中断实现(前台,响应及时)。 2、MCU选型时,要充分考虑程序的需求。对于消费类产品,节电休眠很重要。有一次,程序编制到一半时才发现,所选的MCU不具备改变引脚电平来唤醒休眠的功能,于是只得重新选型重新编程。 3、对电子电路有必要的理解。比如输入按键的防抖动处理,端口的内置上拉输入,I2C总线协议、扫描键盘等。 4、注意单片机编程与PC编程的区别。在VC环境中,int型变量的取值范围很大;而在单片机中,无符号int型的上限只有255。第一次编写单片机程序时,看似程序的逻辑没有问题,但执行的效果却面目全非,最终发现是整型变量的累加超过255而导致溢出错误。 5、由于硬件资源的限制,很多时候需要共用定时器。有的MCU只有2个定时器,而程序需求中有多个定时要求,这时可以将定时时间(tcc)设短些,通过在程序中设置整型变量(n1、n2、n3等)来实现定时要求(定时要求1=tcc*n1,定时要求2=tcc*n2等)。 6、由于硬件资源的限制,有时需要精简代码。现在PC编程完全不必考虑精简代码的问题,因为硬盘空间足够大了,反而有时需要增添不少代码来提高程序的可读性。然而MCU的程序存储器ROM相对很小,有时只有1k;而程序必须满足用户的多种需求,最终很可能会发现程序存储器的空间不够用了,这时需要费力地精简代码。至少有两次出现了这种情况:编制的MCU程序中,再多加1行代码都不行。 7、能够看明白汇编代码。目前MCU编程一般都采用C语言,这样具有可读性、可维护性,也减少了代码开发量。然而各个MCU公司的C语言编译器并不一定完美无暇。至少遇到过三次,对程序中的bug百思不得其解;最后阅读由C语言编译成的汇编代码,才发现原来是C语言编译器的缺陷导致汇编程序出现小错误;这类错误很难发现问题的根源,要花费大量的时间与精力。 8、不断提高调试能力,这需要耐心与水平。单片机编程与PC编程不同:在VC环境中,可以通过设置断点等方式进行调试;而MCU编译器只提供编译功能,不能直接运行程序。如果需要调试程序,一般要购买MCU公司的专用仿真器。由于多种原因,自己编程时没有仿真器,是通过搭建电路来检查程序功能的,因而只能通过电路的症状来反推程序的问题,这需要耐心。程序调试也是花费成本的,每调试一次,就会报废一只MCU(好在所用MCU的价格较低),因而需要尽量减少调试次数,这需要水平。
个人分类: 学术科普|8497 次阅读|3 个评论
[转载]Windows使用单机版Git来进行版本控制
xiasw 2012-5-4 20:11
前言 不要把这篇文章当做给编程人员的技术文章,即使你对编程一无所知,按照这篇文章的指引一步步学习,仔细模仿,也可以很容易地学会如何去做。更重要的 是,这篇文章将让你介绍如何让git成为你的工作日志,成为你的备份工具,成为你的项目管理软件。没错,git让这一切变得如此简单。 背景 OK,什么是git? Wikipedia( http://en.wikipedia.org/wiki/Git_(software) )告诉我们:“ Git ( / ɡ ɪ t / ) is a distributed revision control system with an emphasis on speed.“ 这是一个分布式版本控制系统。听起来似乎很霸气,那么它是谁开发的呢?这个名字就更霸气了, Linus Torvalds ——Linux之父。 什么叫版本控制系统呢? 我们来举个例子。比如说,你要写个商业策划书,经过几天熬夜,总算在2012-01-01写了一个初稿 proposal.doc。又经过两天的奋战,你对之前的文档做了更深入的细化,于是把之前的文件改名成了proposal- 2012-01-01.doc 作为备份。后来经过你和老板的激烈讨论,并对文档反复修改,终于在2012-01-09把第7版交给了老板,算是完成了这份工作。回头看看当前的工作文件 夹,呵,充满了名为 proposal-2012-01-01.doc,proposal-2012-01-03.doc。。。proposal- 2012-01-09.doc 的文件。你不舍得删了它们,顺手打个包压缩下扔进了自己的归档文件夹里,也许永远都不会看它们了;即使半年后想要来参考一下,你也顶多是看看最新版的文 件,那些历史版本文件之间的关系恐怕永远也记不起来了。 这是个很普遍的例子,任何用电脑写过报告的人都会有这种经历。保存某个修改的文件时我们习惯于给较早的版本加个日期(或者其他你感兴趣 的方式)做为备份,生怕自己对稍后的某个修改不满意好恢复回去;如果有强迫症,估计你恨不得写一行备份一次——如果你学会了git,恐怕这种强迫症会更加 强烈,因为用起来实在是太爽了。这就是一个非常朴素的版本控制系统,你人为的给某个文件加上时间的标记,把编辑的某些里程碑保存下来,方便自己将来查阅、 备份、恢复。 既然我们有这么普遍而强烈的需求,版本控制系统软件自然备受关注,并不断更新升级。从 CVS 到 SVN 再到 GIT,版本控制系统的管理模式从集中向分布演变。git的分布式特点就在于,虽然我们可以有一个最核心的中央服务器来管理所有的文件,你可以在本地生成 一个局部的版本控制系统,你的版本历史都可以先在本地保存,直到获得一个满意的版本后,再提交到服务器中。对于个人来说,甚至完全不用理会中央服务器是否 存在,自己玩单机版的版本控制就足够了——本文的目的也就在于教会你怎样玩转单机版git。 准备 工欲善其事,必先利其器。我们需要的软件很少,只有两个,TortoiseGit( http://code.google.com/p/tortoisegit/downloads/list )和msysgit( http://code.google.com/p/msysgit/downloads/list ),前者是与 windows 的资源管理器(linux和mac用户借过一下)整合的git管理软件,后者是git的功能软件。 安装好TortoiseGit之后,重启电脑,鼠标右键里就会有这几个新的程序,git的相关功能都可以从这里访问到,连开始菜单都不要,是不是很方便? (svn是另一个软件,请无视) 请选择setting,我们需要配置一下git的路径。 在红框里,我们要设置一下 git 的路径,就是你安装 msysgit的bin文件夹,比如说我的是F:\software\develop\svn\git\PortableGit-1.7.8- preview20111206\bin,里面会有 git.exe 这个程序。 如此,我们的环境就配置好了,是不是非常简单? 实战 基础知识 接下来,我们要具体看看git如何成为我们备份的利刃。 先随便创建一个空白文件夹,作为我们实践的平台。 进入这个文件夹,鼠标右键选择 “ Git Create repository here...",弹出的对话框不用管,那个复选框不要选,ok即可。这个文件夹里就会出现一个隐藏的 .git 文件夹。如何显示隐藏文件夹?这个请放狗去搜吧。 ok,一个版本库我们就创建出来了。走到上级目录,你也许会看到,文件加上出现了一个绿色的对勾符号,表示这个文件夹已经受到了版本的控制。(这个图标的出现不一定实时,也许你要多刷新几次,甚至重启电脑才行) 常见的图标有 这个文件(夹)很干净,是最新版本文件 这个文件(夹)发生了修改,需要提交 这个文件(夹)要添加进版本库 这个文件(夹)没有在版本库中,需要添加进来(转为上一个图标的状态),或者忽略(转为下一个图标的状态) 这个文件(夹)被忽略,不受版本控制 这个文件(夹)里的内容发生冲突(这是最危险的情况,但是对于个人用户来说,几乎不会出现,出现的情况是两个人同时对一个文件做修改,后提交的人在更新时无法与前者完美融合时,这个不需要深入理解) 通过这么直观的图标暂时,你就能对自己的工作文件夹了如指掌,那些文件做了修改,当前工作是否需要提交,都一目了然。 版本分支 在进行更进一步操作时,有必要了解一下版本分支(Branch)的概念。版本分支意味着,你从当前的项目中弄出来一个拷贝,按照自己的想法胡乱修 改,你之后的所有版本历史都保存在这个分支里。如果你对这个分支很满意,就可以把这个分支合并到原来的主分支里(Merge),甚至直接让这个分支作为主 分支;或者你感觉到越改越糟糕,就直接回到主分支工作,仿佛什么也没有发生一样(当然这个新的分支要通过某些复杂的操作来删除,你也可以留着,作为自己惨 痛教训的警钟)。也就是说,分支为你提供了一个尝试某些新道路的空间。 作为个人用户来说,有一个主分支和一个工作分支就够了。主分支作为基准一直不变,工作都在工作分支上进行,这样主分支与工作分支之间的变化就记录了你的所有工作历史。 我们来具体实践一下。 首先,git有个不太人性化的“bug“,不能够添加空白文件夹,因此我们需要先添加一个空白文件,比如 test.txt,然后在文件夹上右键选择 “Git commit" 选择添加的那个文件,写点message(git每次提交必须写上一些文字说明这次更新的内容,从而让你知道每个版本有什么变化)提交即可 在刚才的工作文件加上右键,选择 “Create Branch“ 随便取名比如 develop,确定即可。 依然右键选择 “Show log“,出现如下对话框 可以看到,我们已经有了一个版本历史,它详细记录了我们的改变。上面有两个颜色标签,红色的master和绿色的develop,这个代表了我们 的分支。master是我们第一次提交时系统自动生成的分支;develop是我们手动创建的。红色的代表当前的工作分支,绿色的代表存在的历史分支。我 们需要把工作分支切换到 develop。 在文件夹上右键选择 “Switch/Checkout", Branch里选择develop,再查看历史,我们就会发现,develop变成了红色。 开始工作 接下来我们就可以随心所欲的工作了。编辑一下test.txt,新建文件夹,添加word,excel文件,总之,随便工作。你会看到,修改的文件 加了红色的叹号,新加为被版本控制的文件加了蓝色的问号,对于蓝色问号,你可以选择右键里的 “Add“让它变成蓝色的加号(或者有时会一步到位变成绿色的对勾,这个不重要),或者不管他。 然后在根文件上,选择 Commit,再来看看历史,就会发现你的工作记录了 Commit时会有一个让你输入用户名的问题,这个完全不重要,你随便写个用户名和邮箱即可. 可以发现,develop进步了一个版本,master还停留在原处。历史显示,test.txt被修改,一个word和excel被添加;文件夹信息不回被记录。 双击下面的test.txt文件,它甚至会给你展示出这个文件发生了哪些变化。甚至连 excel 和 word 的变化也会给你选择合适的方式进行比较。 令人震惊吧!没错,git会完全忠实的记录的一点一滴,只要你commit,系统就会为你保存下来一个历史记录(不必担心空间,它会采用很先进的方式进行增量保存,远比你每次都复制要节省空间得多) 结束语 差不多已经把如何用git来进行工作的方法介绍完了,还有一个非常重要的功能没有说,怎么样恢复历史版本的文件呢?很简单,在想要恢复的文件上查看历史,选择revert即可! 即使你完全不懂编程,相信上面的讲解也可以教会你怎么样来使用了吧。赶紧来试试吧! 转自: http://www.cnblogs.com/dabaopku/archive/2012/01/09/2316772.html
个人分类: 他山之玉|17000 次阅读|0 个评论
[转载]C/C 是最主要的编程语言,这里列出了50名优秀网站
runningabc 2012-4-22 13:58
C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建 议,以进一步加强这方面的清单。 1、 http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、 http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。 3、 http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --超过万行C和C++免费的源代码 4、 http://freshmeat.net/browse/164/ --超过9000个C编写的项目。 5、 http://www.daniweb.com/code/c.html --DANIWEB提供的实用代码段 。 6、 http://www.programmersheaven.com/tags/C/ --programmersheaven.com上的C编程资源。 7、 http://www.ddj.com/code/ddj.html --Dr. Dobb’s Journal的源代码。 8、 http://www.cprogramming.com/cgi-bin/source/source.cgi --C和C + +编程资源。 9、 http://www.codecogs.com/ --CodeCogs是一项协作的开放源码库,C/C++的数值方面的组件。 10、 http://www.google.com/codesearch?q=programming++lang:ccs_r=lang:c --谷歌代码的C源代码。 11、 http://www.codepedia.com/1/C --CodePedia是一个开放的关于系统编程和其他与电脑有关的议题。 12、 http://www.cis.temple.edu/~ingargio/cis71/code/ --为学生提供的一个简单的C语言程序的列表。 13、 http://www.codeproject.com/?cat=2 --codeproject提供的C/C++资源代码项目。 14、 http://www.thefreecountry.com/sourcecode/cpp.shtml --以下是一些C和C++库的DLL,VCLs,源代码,元件,模块,应用程序框架,类库,源代码片段等,你可以在您的项目中使用而不需要支付费用和版税。 15、 http://people.sc.fsu.edu/~burkardt/cpp_src/cpp_src.html --这是一个全面的关于C++的345个源代码清单。 16、 http://www.cplusplus.com/src/ --C++写的通用控制台程序和Windows程序代码清单。 17、 http://users.cs.fiu.edu/~weiss/dsaa_c++/code/ --C++语言数据结构与算法分析(第二版)的源代码。 18、 http://c.snippets.org/ --C源代码片段。 19、 http://www.bbdsoft.com/downloads.html --C++源代码。 20、 http://www.moshier.net/ 天文学和数值软件源代码 21、 http://cplus.about.com/od/cgames/C_Games_with_Source_Code.htm --游戏有关的C++源代码。 22、 http://cliodhna.cop.uop.edu/~hetrick/c-sources.html --免费的C/C++数值计算源代码。 23、 http://www.mathtools.net/C_C__/Utilities/index.html --C/C++工具。 24、 http://www.programmerworld.net/resources/c_library.htm --免费C++源代码和其它有用的工具。 25、 http://www.cmcrossroads.com/bradapp/links/cplusplus-links.html --布拉德阿普尔顿的C++链接-资源,项目,图书馆,教学和编码。 26、 http://www.robertnz.net/cpp_site.html --这是一个收集了数C/C++网站链接列表的网页。 27、 http://www.josuttis.com/libbook/examples.html --在这里,你可以看到并下载所有的本书的C++标准库例子 。 28、 ftp://66.77.27.238/sourcecode/cuj/ --C/C++用户杂志 29、 ftp://66.77.27.238/sourcecode/wd/ --Windows开发者网络 30、 http://www.einet.net/directory/65892/Developers.htm --C程序 31、 http://www.daniweb.com/code/cplusplus.html --实用代码段。 32、 http://snippets.dzone.com/tag/c --C++源代码 33、 http://www.programmersheaven.com/tags/C --C++编程资源,programmersheaven.com 34、 http://www.google.com/codesearch?hl=enlr=q=programming --谷歌代码搜索-C++编程语言 35、 http://www.codepedia.com/1/Cpp --CodePedia是一个开放的关于系统编程和其他与电脑有关的议题的网站。 36、 http://www.codebeach.com/index.asp?TabID=1CategoryID=3 --C++源代码,Codebeach提供 37、 http://freshmeat.net/browse/165/ --5000项目写的C++编程语言 38、 http://cplus.about.com/od/codelibrary/Code_Library_for_C_C_and_C.htm --代码库C、C + +和C#。 39、 http://www.c.happycodings.com/ --Visual Basic、PHP、ASP技术、C、C++大全。 40、 http://www.blueparrots.com/ --Borland C游戏,图像和声音源代码范例。 41、 http://www.java2s.com/Code/Cpp/CatalogCpp.htm --C++源代码。 42、 http://www.yeohhs.com/modules/mydownloads/ --C与C++电子书和源代码示例。 43、 http://www.brpreiss.com/books/opus4/programs/index.html C++的数学方程和公式源代码。 44、 http://users.cs.fiu.edu/ C++。 45、 http://www.josuttis.com/libbook/examples.html --C++标准库-教程和参考资料。 46、 http://emr.cs.uiuc.edu/~reingold/calendars.shtml Edward M. Reingold's Calendar Book, Papers, and Code。 47、 http://cpp.snippets.org/ --c++源代码档案。 48、 http://ubiety.uwaterloo.ca/~tveldhui/papers/techniques/ --用C和C++的解决科学问题。 49、 http://c.ittoolbox.com/topics/core-c/ --C/C++的IT工具框。 50、 http://www.le.ac.uk/cc/tutorials/c/ccccdbas.html --本文件中包含有大量的C示例程序。 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/happylin9988/archive/2009/09/16/4558533.aspx
2704 次阅读|0 个评论
GDI的窗口坐标,视口坐标及其变换,映射模式
baibing 2012-4-14 16:15
图形坐标系统 http://cret.cnu.edu.cn/clab/lecture/multi-lecture/gis/chapter8/chapter8-2-1.htm Window 编程中涉及到GDI 的一些坐标变换的概念,比较容易混淆。最近用到,归纳了一下。 希望有用。 1、基本思想 Windows GDI要解决的就是用户文档中涉及的数值坐标如何映射到有限的硬件屏幕区域。 这是一个坐标变换的数学问题,严格地讲就是一个二维仿射变换问题(平移、反射加缩放等)。用户数值坐标的单位对于计算机来讲是没有意义的,无论它是什么单位,它只不过是一系列的实数。换句话说,用户的数据对于计算机来说就是一堆没有单位(从而对计算机也就没有物理意义,因为计算机无法识别其物理意义)、只有数值大小的实数,计算机关心的是,你的这些实数在计算机上怎么定量表示(即用多少像素来对应、显示)。归纳起来,GDI要做的其实就是建立在无单位的数值系统同有单位(象素)的数值系统之间的变换关系。计算机的显示硬件相对于用户的数据而言总是有限的。如何在有限的硬件上显示用户的不同 部位的数据是计算机要深入解决的。 为了叙述方便,微软把用户文档的数值坐标系称为逻辑坐标系,或者窗口坐标系(不要再纠缠窗口二字,这二字可能不合理,但已经成为了习惯,窗口坐标系就是逻辑坐标系)。逻辑坐标或者窗口坐标对用户脑袋而言是有单位的,但是对于计算机而言是无所谓单位的。 但是在有限的硬件区域上,可以建立不止一种硬件象素坐标系(以象素作为单位的坐标系),比如,可以建立 “ 整个屏幕的坐标系 ” , 这个坐标系是一个固定不变的坐标系统(当然,我是说你的计算机屏幕不被你移动);也可以建立应用程序的 “ 整窗口坐标系 ” ,由于应用程序的整窗口是可以在屏幕上刚性平移的,所以,这里的 “ 整窗口坐标系 ” 的位置是可变的,但是这个变化是由操作系统负责的,用户不用管;还可以建立 “ 程序窗口客户区的坐标系 ” , 这个坐标系也是可以变动的;这三类坐标系都是以象素为单位的实数坐标系,都是范围有限的硬件坐标系,我们的目的就是如何将用户逻辑的内容坐标(用户数据坐标,逻辑坐标,窗口)变换到这些选定的象素坐标系上。微软把用于绘图的屏幕、整窗口区域、客户区所占的屏幕块都称为 “ 设备 ” , 所以,这三类设备相关的象素坐标系也统称为 设备坐标系 ,用户在GDI绘图时,并不是随随便便就显示,而是要在屏幕上选择一块区域来显示,也就是说用户需要首先选择设备,选择了设备,其实也就选定了使用哪个坐标系。另外,当一个设备所占据的屏幕块恰好被选作数据呈现(显示)区时(也只有这个时机),那么这个屏幕块就称为 “ 视口 ” ,如果一个设备屏幕块暂时没有被选作呈现区域,那么这个区域在这时你就不要称为 “ 视口 ” 。 我们将坐标变换笼统地说成是 “ 用户逻辑坐标同屏幕坐标变换 ”,这个 意义不大,还容易迷惑。具体而言,GDI的坐标变换实质就是在 窗口坐标 (逻辑坐标,用户数据坐标)同选定的某一个 视口坐标系 之间变换。(注意,视口有限,基于象素单位,用户坐标无限,就是一堆实数),并且程序设计语言还提供了坐标变换修改的机会。 ......其余见附件。 视口,窗口,窗口坐标逻辑坐标及其变换、映射模式等的理解 视口,窗口,窗口坐标逻辑坐标及其变换、映射模式等的理解.pdf
1404 次阅读|0 个评论
[转载]UltraEdit、EditPlus、EmEditor、PSPad、SciTE简评
runningabc 2012-4-11 20:41
UltraEdit是我使用时间最长的,写这篇东西以前一直在用10.20和11.20版,感觉常用的功能变化不大,就没注意版本的升级。最近发现其他一些编辑器有很多UE没有而又很有用的功能,于是上UE的网站看他有没有与时俱进,果然新出的版本功能强大了许多,当然体积也成正比增长。 以下比较基于版本:UltraEdit12.10、EditPlus2.21、EmEditorPro6.0、PSPad4.5.2,仅对我常用的功能作比较,说到哪算哪: 共同点:除了一般编辑器都有的功能外,都有语法加亮、正则表达式搜索替换(可能各有一点差别但基本够用)、通过某种方式配置编译器输出编译或运行结果(SciTE和PSPad做得最好)。 UltraEdit 功能齐全,最突出的是它的列块处理功能,无人能及其项背,甚至有专门一项菜单处理列块操作。以前版本没有自动完成、代码块折叠、FTP浏览窗口,12.0以上版本增加了。 EditPlus 个头不大,没有代码折叠,没有代码自动完成,不支持列块,但HTML方面做得很好,可以象Word那样拖动生成表格,插入ActiveX对象,其它编辑器暂未找到这个功能。EditPlus很早就支持FTP浏览窗口了。 EmEditor 有代码折叠,但没有代码自动完成,最致命的是不支持FTP,好像通过插件可以支持,不过没试过。支持列块,但当然没UltraEdit的列块好用。暂未发现特别的亮点。 SciTE 对编程语言的支持最好,是专为程序员订做的的编辑器。个头最小,几百K就搞定,代码的显示非常美观,支持代码折叠、自动完成。UltraEdit会把PHP中的Heredoc识别为代码而不是字符串,显示或代码折叠时会有问题,而SciTE识别得非常好。还能根据编译输出结果跳到出错行,还有很多程序员需要的功能。通过配置文件进行配置非常灵活同时也很复杂,适合专业人士。不过要命的是不支持FTP,也不支持列块。 PSPad 可能是最能与UltraEdit一较高下的了。除了没有代码折叠外各种功能一应俱全。独此一家的是有详细的代码树(显示出每个函数和变量出现的每一行)窗口。也能象SciTE一样根据编译输出结果跳到出错行。与UltraEdit相比最大差距在虽然支持列块,但功能远远不如。略感不足的是HTML标记输入通过Clip(剪辑,预先定义热键与HTML标记的对应,或从列表中选择),没有EditPlus和UltraEdit直观,但更为通用。还有一些细节,如UltraEdit输入“{”后回车会自动缩进,PSPad不会,不过PSPad会自动生成一个对应的“}”,算是各有千秋。 另外,UltraEdit和PSPad支持二进制编辑,其它不行;EditPlus和SciTE可识别出PHP和Perl的Heredoc,其它不行。
7007 次阅读|0 个评论
[转载]BP神经网络的设计实例(MATLAB编程)
linpandr 2012-4-10 14:39
BP神经网络的设计实例(MATLAB编程) 例1 采用动量梯度下降算法训练 BP 网络。 训练样本定义如下: 输入矢量为 p = 目标矢量为 t = 解:本例的 MATLAB 程序如下: close all clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 pause % 敲任意键开始 clc % 定义训练样本 % P 为输入矢量 P= ; % T 为目标矢量 T= ; pause; clc % 创建一个新的前向神经网络 net=newff(minmax(P), ,{'tansig','purelin'},'traingdm') % 当前输入层权值和阈值 inputWeights=net.IW{1,1} inputbias=net.b{1} % 当前网络层权值和阈值 layerWeights=net.LW{2,1} layerbias=net.b{2} pause clc % 设置训练参数 net.trainParam.show = 50; net.trainParam.lr = 0.05; net.trainParam.mc = 0.9; net.trainParam.epochs = 1000; net.trainParam.goal = 1e-3; pause clc % 调用 TRAINGDM 算法训练 BP 网络 =train(net,P,T); pause clc % 对 BP 网络进行仿真 A = sim(net,P) % 计算仿真误差 E = T - A MSE=mse(E) pause clc echo off 例2 采用贝叶斯正则化算法提高 BP 网络的推广能力。在本例中,我们采用两种训练方法,即 L-M 优化算法(trainlm)和贝叶斯正则化算法(trainbr),用以训练 BP 网络,使其能够拟合某一附加有白噪声的正弦样本数据。其中,样本数据可以采用如下MATLAB 语句生成: 输入矢量:P = ; 目标矢量:randn(’seed’,78341223); T = sin(2*pi*P)+0.1*randn(size(P)); 解:本例的 MATLAB 程序如下: close all clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 pause % 敲任意键开始 clc % 定义训练样本矢量 % P 为输入矢量 P = ; % T 为目标矢量 randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P)); % 绘制样本数据点 plot(P,T,'+'); echo off hold on; plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线 echo on clc pause clc % 创建一个新的前向神经网络 net=newff(minmax(P), ,{'tansig','purelin'}); pause clc echo off clc disp('1. L-M 优化算法 TRAINLM'); disp('2. 贝叶斯正则化算法 TRAINBR'); choice=input('请选择训练算法(1,2):'); figure(gcf); if(choice==1) echo on clc % 采用 L-M 优化算法 TRAINLM net.trainFcn='trainlm'; pause clc % 设置训练参数 net.trainParam.epochs = 500; net.trainParam.goal = 1e-6; net=init(net); % 重新初始化 pause clc elseif(choice==2) echo on clc % 采用贝叶斯正则化算法 TRAINBR net.trainFcn='trainbr'; pause clc % 设置训练参数 net.trainParam.epochs = 500; randn('seed',192736547); net = init(net); % 重新初始化 pause clc end % 调用相应算法训练 BP 网络 =train(net,P,T); pause clc % 对 BP 网络进行仿真 A = sim(net,P); % 计算仿真误差 E = T - A; MSE=mse(E) pause clc % 绘制匹配结果曲线 close all; plot(P,A,P,T,'+',P,sin(2*pi*P),':'); pause; clc echo off 通过采用两种不同的训练算法,我们可以得到如图 1和图 2所示的两种拟合结果。图中的实线表示拟合曲线,虚线代表不含白噪声的正弦曲线,“+”点为含有白噪声的正弦样本数据点。显然,经 trainlm 函数训练后的神经网络对样本数据点实现了“过度匹配”,而经 trainbr 函数训练的神经网络对噪声不敏感,具有较好的推广能力。 值得指出的是,在利用 trainbr 函数训练 BP 网络时,若训练结果收敛,通常会给出提示信息“Maximum MU reached”。此外,用户还可以根据 SSE 和 SSW 的大小变化情况来判断训练是否收敛:当 SSE 和 SSW 的值在经过若干步迭代后处于恒值时,则通常说明网络训练收敛,此时可以停止训练。观察trainbr 函数训练 BP 网络的误差变化曲线,可见,当训练迭代至 320 步时,网络训练收敛,此时 SSE 和 SSW 均为恒值,当前有效网络的参数(有效权值和阈值)个数为 11.7973。 例3 采用“提前停止”方法提高 BP 网络的推广能力。对于和例 2相同的问题,在本例中我们将采用训练函数 traingdx 和“提前停止”相结合的方法来训练 BP 网络,以提高 BP 网络的推广能力。 解:在利用“提前停止”方法时,首先应分别定义训练样本、验证样本或测试样本,其中,验证样本是必不可少的。在本例中,我们只定义并使用验证样本,即有 验证样本输入矢量:val.P = 验证样本目标矢量:val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)) 值得注意的是,尽管“提前停止”方法可以和任何一种 BP 网络训练函数一起使用,但是不适合同训练速度过快的算法联合使用,比如 trainlm 函数,所以本例中我们采用训练速度相对较慢的变学习速率算法 traingdx 函数作为训练函数。 本例的 MATLAB 程序如下: close all clear echo on clc % NEWFF——生成一个新的前向神经网络 % TRAIN——对 BP 神经网络进行训练 % SIM——对 BP 神经网络进行仿真 pause % 敲任意键开始 clc % 定义训练样本矢量 % P 为输入矢量 P = ; % T 为目标矢量 randn('seed',78341223); T = sin(2*pi*P)+0.1*randn(size(P)); % 绘制训练样本数据点 plot(P,T,'+'); echo off hold on; plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线 echo on clc pause clc % 定义验证样本 val.P = ; % 验证样本的输入矢量 val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量 pause clc % 创建一个新的前向神经网络 net=newff(minmax(P), ,{'tansig','purelin'},'traingdx'); pause clc % 设置训练参数 net.trainParam.epochs = 500; net = init(net); pause clc % 训练 BP 网络 =train(net,P,T, ,val); pause clc % 对 BP 网络进行仿真 A = sim(net,P); % 计算仿真误差 E = T - A; MSE=mse(E) pause clc % 绘制仿真拟合结果曲线 close all; plot(P,A,P,T,'+',P,sin(2*pi*P),':'); pause; clc echo off 下面给出了网络的某次训练结果,可见,当训练至第 136 步时,训练提前停止,此时的网络误差为 0.0102565。给出了训练后的仿真数据拟合曲线,效果是相当满意的。 =train(net,P,T, ,val); TRAINGDX, Epoch 0/500, MSE 0.504647/0, Gradient 2.1201/1e-006 TRAINGDX, Epoch 25/500, MSE 0.163593/0, Gradient 0.384793/1e-006 TRAINGDX, Epoch 50/500, MSE 0.130259/0, Gradient 0.158209/1e-006 TRAINGDX, Epoch 75/500, MSE 0.086869/0, Gradient 0.0883479/1e-006 TRAINGDX, Epoch 100/500, MSE 0.0492511/0, Gradient 0.0387894/1e-006 TRAINGDX, Epoch 125/500, MSE 0.0110016/0, Gradient 0.017242/1e-006 TRAINGDX, Epoch 136/500, MSE 0.0102565/0, Gradient 0.01203/1e-006 TRAINGDX, Validation stop. 例3 用BP网络估计胆固醇含量 这是一个将神经网络用于医疗应用的例子。我们设计一个器械,用于从血样的光谱组成的测量中得到血清的 胆固醇含量级别,我们有261个病人的血样值,包括21种波长的谱线的数据,对于这些病人,我们得到了基于 光谱分类的胆固醇含量级别hdl,ldl,vldl。 (1) 样本数据的定义与预处理。 choles_all.mat 文件中存储了网络训练所需要的全部样本数据。 利用 load 函数可以在工作空间中自动载入网络训练所需的输入数据 p 和目标数据 t,即 load choles_all sizeofp = size (p) sizeofp = 21 264 sizeoft = size (t) sizeoft = 3 264 可见,样本集的大小为 264。为了提高神经网络的训练效率,通常要对样本数据作适当的预处理。首先,利用 prestd 函数对样本数据作归一化处理,使得归一化后的输入和目标数据均服从正态分布,即 = prestd(p,t); 然后,利用 prepca 函数对归一化后的样本数据进行主元分析,从而消除样本数据中的冗余成份,起到数据降维的目的。 = prepca(pn,0.001); = size(ptrans) R = 4 Q = 264 可见,主元分析之后的样本数据维数被大大降低,输入数据的维数由 21 变为 4。 (2) 对训练样本、验证样本和测试样本进行划分。 为了提高网络的推广能力和识别能力,训练中采用“提前停止”的方法,因此,在训练之前,需要将上面处理后的样本数据适当划分为训练样本集、验证样本集和测试样本集。 (3) 网络生成与训练。 选用两层 BP 网络,其中网络输入维数为 4,输出维数为 3,输出值即为血清胆固醇的三个指标值大小。网络中间层神经元数目预选为 5,传递函数类型选为 tansig 函数,输出层传递函数选为线性函数 purelin,训练函数设为 trainlm。网络的生成语句如下: net = newff(minmax(ptr), ,{'tansig' 'purelin'},'trainlm'); 利用 train 函数对所生成的神经网络进行训练,训练结果如下: =train(net,ptr,ttr, ,val,test); 见,网络训练迭代至第 20 步时提前停止,这是由于验证误差已经开始变大。利用下面语句可以绘制出训练误差、验证误差和测试误差的变化曲线,如图 4.50 所示。由图可见,验证误差和测试误差的变化趋势基本一致,说明样本集的划分基本合理。由训练误差曲线可见,训练误差结果也是比较满意的。 (4) 网络仿真。 为了进一步检验训练后网络的性能,下面对训练结果作进一步仿真分析。利用 postreg函数可以对网络仿真的输出结果和目标输出作线性回归分析,并得到两者的相关系数,从而可以作为网络训练结果优劣的判别依据。仿真与线性回归分析如下: an = sim(net,ptrans); a = poststd(an,meant,stdt); for i=1:3 figure(i) = postreg(a(i,:) ,t(i,:) ); end %导入原始测量数据 load choles_all; %对原始数据进行规范化处理,prestd是对输入数据和输出数据进行规范化处理, %prepca可以删除一些数据,适当地保留了变化不小于0.01的数据 =prestd(p,t); =prepca(pn,0.001); =size(ptrans) %将原始数据分成几个部分作为不同用途四分已用于确证,四分一用于测试,二分一用于训练网络 iitst=2:4:Q; iival=4:4:Q; iitr= ; %vv是确证向量,.P是输入,.T是输出,vt是测试向量 vv.P=ptrans(:,iival); vv.T=tn(:,iival); vt.P=ptrans(:,iitst); vt.T=tn(:,iitst); ptr=ptrans(:,iitr); ttr=tn(:,iitr); %建立网络,隐层中设计5个神经元,由于需要得到的是3个目标,所以网络需要有3个输出 net=newff(minmax(ptr), ,{'tansig' 'purelin'},'trainlm'); %训练网络 net.trainParam.show=5; =train(net,ptr,ttr, ,vv,vt); %绘出训练过程中各误差的变化曲线 plot(tr.epoch,tr.perf,'r',tr.epoch,tr.vperf,':g',tr.epoch,tr.tperf,'-.b'); legend('训练','确证','测试',-1); ylabel('平方误差'); xlabel('时间'); pause; %将所有数据通过网络(包括训练,确证,测试),然后得到网络输出和相应目标进行线性回归, %对网络输出进行反规范化变换,并绘出个各级别的线性回归结果曲线 an=sim(net,ptrans); a=poststd(an,meant,stdt); %得到3组输出,所以进行3次线性回归 for i=1:3 figure(i) = postreg(a(i,:) ,t(i,:) ); end 网络输出数据和目标数据作线性回归后,前面两个输出对目标的跟踪比较好,相应的R值接近0.9。而第三个输出却并不理想,我们很可能需要在这点上做更多工作。可能需要使用其它的网络结构(使用更多的隐层神经元),或者是在训练技术上使用贝页斯规范华而不实使用早停的方法。 把隐层数目改为20个时,网络训练的3种误差非常接近,得到的结果R也相应提高。但不代表神经元越多就越精确。 多层神经网络能够对任意的线性或者非线性函数进行逼近,其精度也是任意的。但是BP网络不一定能找到解。训练时,学习速率太快可能引起不稳定,太慢则要花费太多时间,不同的训练算法也对网络的性能有很大影响。BP网络对隐层的神经元数目也是很敏感的,太少则很难适应,太多则可能设计出超适应网络。
个人分类: MATLAB|11463 次阅读|0 个评论
[转载]python核心编程--笔记
RichieJu520 2012-4-1 19:22
1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file 以给定的文件运行python脚本 2 _在解释器中表示最后一个表达式的值. 3 print支持类c的printf格式化输出: print “%s is number %d!” % (“python”, 1) 4 print的输入内容后面加逗号, 就会使其输入不换行 5 把输出重定向到日志文件: logfile = open(“c:/1.log”, “a”); //打开文件c:/1.log使用a模式..即add, 添加. print logfile, “Fatal error: invalid input!”; 为重定向..将print的结果重定向到logfile, 输出内容是”Fatal error: invalid input!”… logfile.close(); //关闭文件流… 6 程序输入: raw_input(“提示字符串”): user = raw_input(“请输入您的姓名”); 7 int(数值)…..将数值字符串转换成整数值… 8 运算符: 8.1 + - * / %是和其他语言相同的加减乘及取模运算.取余运算 8.2 / 在浮点取模中得到的结果是完整的浮点数 8.3 // 在浮点取模中得到的结果是经过舍去运算的结果. 8.4 ** 是乘方 8.5 和的移位运算也支持. 但不支持java中的 和 移位. 8.6 = = ++ != 等比较运算符 8.7 and or not 等逻辑运算符 9 变量和赋值: python是弱类型语言.. 10 list, tuple, map * 4 得到的结果是一个新的 list | tuple | map, 是原数据的4份 11 数字: 11.1 int(有符号整数) 11.2 long(长整数) 11.3 bool(布尔值) 11.4 float(浮点值) 11.5 complex(复数) 11.6 python2.3开始, 如果结果从int溢出, 会自动转型为long 11.7 python2.4开始支持decimal数字类型, 需要导入decimal模块..由于在二进制表示中会有一个无限循环片段, 普通的浮点1.1实际是不能被精确表示的, 被表示为1.1000000000000001. 使用print decimal.Decimal(‘1.1’);则可以得到精确的1.1 12 字符串: 引号之间的字符集合, 支持使用成对的单引号和双引号, 三引号(三个连续单引号或双引号)可以用来包含特殊字符. 使用索引运算符 可以得到子字符串…字符串中第一个字符的索引是0, 最后一个字符的索引是-1; 13 列表和元组: 可以看作是普通的数组, 能保存任意数量任意类型的python对象… 13.1 列表元素用中括号包裹, 元素的个数及元素的值可以改变. 13.2 元组元素用小括号包裹, 不可以更改, 尽管他们的内容可以, 元组可以看成是只读的列表. 可以使用切片运算得到子集. 14 字典: 相当于其他语言中的map, 使用{key: value}的方式表示. 取值的方式和其他语言的map一致. 也可以直接使用map = value的方式为其赋值. 15 条件语句: if expression: path 1 elif expression2: path2 else: path3 16 while循环 while expression: process business 17 for循环 for item in list|tuple|map: print item 17.1 range(len(list))得到一个list长度范围内的整数list, 方便遍历过程中获取索引值. 17.2 python2.3中增加了enumerate(), 可以通过它遍历list, 同时得到索引和值 for index, data in enumerate(list): print index, “:”, data, 17.3 列表解析: sqdEvens = , 获取一个序列, 该序列是0-8的数字中所有x%2为0(false)的x的平方 18 文件和内建函数: open(), file() 18.1 handle = open(file_name, access_mode = “r”), 只读方式打开文件, 得到的句柄是handle..该方法如果没有提供access_mode, 默认是r 19 异常处理: raise可以故意引发异常 try: # process except IOError, e: # error process 20 函数: 如果函数中没有return语句, 自动返回None对象 def function_name( ): “optional document string” function_suite 20.1 python的函数调用中参数是引用传递 20.2 可以在定义函数的时候, 在参数列表中通过=设置参数的默认值. 21 类: 21.1 定义: class class_name: static_variable_name = value def __init__(self, ): //operation //self in here is the reference for this class instance def general_method_name(self, ): //operation //self is the class instance //if you want to use class variable, please use like self.__class__.__name__ 21.2 实例化: instance = class_name( ); 22 模块: 不带.py后缀名的文件名…一个模块创建之后, 可以使用import导入这个模块使用. 22.1 访问模块内的函数或变量: module_name.function() | module_name.variable | module_name.class_name 22.2 sys模块概览 22.2.1 sys.stdout.write(‘Hello World!\n’) //使用sys模块的标准输出 22.2.2 sys.platform //返回系统的标记 22.2.3 sys.version //返回系统的版本 23 PEP: 一个PEP就是一个python增强提案(python enhancement proposal), 是在新版python中增加新特性的方式…索引网址是: http://python.org/dev/peps 24 一些常用函数 24.1 dir( ) 显示对象的属性, 如果没有提供参数, 显示全局变量的名字 24.2 help( ) 显示对象的文档, 如果没有参数, 进入交互式帮助 24.3 int(obj) 将一个对象转换为整数 24.4 len(obj) 返回对象的长度 24.5 open(file_name, mode) 以mode(r|w|a…)方式打开一个文件 24.6 range( stop ]) 返回一个整数列表…结束值是stop-1, step默认是1 24.7 raw_input(str) 提示str等待用户输入 24.8 str(obj) 将一个对象转换为字符串 24.9 type(obj) 返回对象的类型…返回值本身是一个type对象 24.10 sum(iterable ) 可以对纯数值的list|tuple|map进行求和操作.. 24.11 dir( ) 如果没有参数获得当前脚本scope内定义的对象, 如果有参数, 返回该对象内部定义的对象, 如果该对象有一个__dir__方法, 该方法将被调用, 并且必须返回属性的列表…这就允许通过自定义__getattr__()或__getattribute__()方法的方式实现dir的自定义显示属性列表….如果没有指定参数, 是根据该对象的__dict__内存字典的最佳聚合信息显示的.. 24.12 type( ) 参数为空显示type ‘type’, 参数不为空显示该对象的类型 24.13 type(name, bases, dict) 通过名称, 基类, 内存字典动态创建一个类型 24.14 object__name.__doc__ 查看该对象的文档字符串 24.15 __doc__ 对象的文档字符串, 该文档字符串在定义对象时写在对象语句块中第一句, 使用单纯的字符串的方式表示 24.16 sys.exit() 退出python解释器 24.17 append(Object) 给list添加一个元素 24.18 os.linesep 返回的是系统换行符…不同的系统换行符是不同的, 使用linesep可以提高代码跨平台性 24.19 string_variable_name.strip( ) 脱离, 滤去字符串中的某些字符, 如果没有参数返回原字符串 25 数值按进制分为: 25.1 二进制: 0b101010 25.2 八进制: 07167 25.3 十进制: 98767 25.4 十六进制: 0xf2134
个人分类: Python语言|10520 次阅读|0 个评论
J2ME图像处理基础编程
mafei863 2012-3-19 10:11
J2ME图像处理基础编程汇编如下,以便后续查找方便。大部分均来自网络启发思路,不敢独藏,拿来分享。 思路:程序将硬盘上的图像源文件读取到内存指定的区域中才能处理,对各像素点处理的关键是int类型的位移运算,特别是高位的alpha通道,不能破坏原有的值,所以,若要重新构造数据,则需要赋值全为1,即alpha=0xFF。新像素值p=((alpha 24) | (r 16) | (g 8) | b); 很多稍微复杂些的工作,均有其对应的套路,整理如下。 步骤如下: setp 1. 硬盘上的图像源文件读取到内存句柄中 public Image LoadImage(String strImgPath){ try{ img=Image.createImage(strImgPath);//"/test.jpg" }catch(Exception ex){ System.out.print("Error:"+ex.toString()); } return img; } setp 2. 内存句柄散列到指定数组,以便处理方便 public int pixels = new int ; img.getRGB(pixels, 0, w, 0, 0, w, h); return pixels; } step 3.各种具体的图像处理算法实施 public Image imageToGray(Image src) { int srcW = src.getWidth(); int srcH = src.getHeight(); int ; a = ((argb 0xff000000) 24); // alpha channel r = ((argb 0x00ff0000) 16); // red channel g = ((argb 0x0000ff00) 8); // green channel b = (argb 0x000000ff); // blue channel temp = (int)(.299*(double)r+.587*(double)g+.114*(double)b); r = temp; g = temp; b = temp; srcPixels = ((a 24) | (r 16) | (g 8) | b); } } return drawPixels(srcPixels, srcW, srcH); } step 4. 将处理后的数据数组中的像素值,还原为图像像素值RGB格式,以便显示等处理。 public Image drawPixels(int srcPixels = getPixels(src); int ; int r = 0; int g = 0; int b = 0; int a = 0; int argb,p0,p1,p2,p3; int temp=0xFF; for (int i = 0; i srcH-1; i++) { for(int ii=0;iisrcW-1;ii++) { p0 = srcPixels ; a = ((p0 0x00ff0000) 16); p1=srcPixels ; r = ((p1 0x00ff0000) 16); p2 = srcPixels ; g = ((p2 0x00ff0000) 16); p3=srcPixels ; b = ((p3 0x00ff0000) 16); argb=(int)Math.abs(a-b)+(int)Math.abs(r-g);//高位的alpha通道,不能破坏原有的值 srcPixelsTemp = ((temp 24) | (argb 16) | (argb 8) | argb); } } return drawPixels(srcPixelsTemp, srcW, srcH); } 6. 灰度化(所谓的黑白照片样式) public Image imageToGray(Image src) { int srcW = src.getWidth(); int srcH = src.getHeight(); int ; a = ((argb 0xff000000) 24); // alpha channel r = ((argb 0x00ff0000) 16); // red channel g = ((argb 0x0000ff00) 8); // green channel b = (argb 0x000000ff); // blue channel temp = (int)(.299*(double)r+.587*(double)g+.114*(double)b); r = temp; g = temp; b = temp; srcPixels = ((a 24) | (r 16) | (g 8) | b); } } return drawPixels(srcPixels, srcW, srcH); } //////////////////////////////////////////////////////////////////////////////// 7. 边缘分割,可以生成类似于简笔画图的样式,需要先做二值化 public Image edgeDetectBy4Neighborhood(Image src){ int srcW = src.getWidth(); int srcH = src.getHeight(); int srcPixelsTemp = new int ; int b = 0; int c = 0; int d = 0; int e = 0,a=0; int argb,p0,p1,p2,p3,p4; int temp=0xFF; for (int i = 1; i srcH-1; i++) { for(int ii=1;iisrcW-1;ii++) { p0 = srcPixels ; a = ((p0 0x00ff0000) 16); p1=srcPixels ; b = ((p1 0x00ff0000) 16); p2 = srcPixels ; c = ((p2 0x00ff0000) 16); p3=srcPixels ; d = ((p3 0x00ff0000) 16); p4=srcPixels ; e = ((p4 0x00ff0000) 16); //对二值化后的图像进行类似于简笔画的生成 if(a==0(b==255||c==255||d==255||e==255)) argb=0; else argb=255; srcPixelsTemp = ((temp 24) | (argb 16) | (argb 8) | argb); } } return drawPixels(srcPixelsTemp, srcW, srcH); }
个人分类: J2ME|3072 次阅读|0 个评论
半导体里程_博物馆_1971 可编程只读存储器
WanghuataoHIT 2012-3-9 18:33
半导体里程_博物馆_1971 可编程只读存储器
多夫弗罗曼( Dov Fromana ) 的可擦除 紫外光只读存储器的设计为微机系统的快速发展提供了重要的设计工具 ,被称为 一个可擦写的只读程序或可编程只读存储器 。 英特尔公司掩码只读存储器 ( 1965 里程碑)模式建立在工厂,因此也需要几个星期来设计生产每个迭代。用户可编程只读存储器( PROM )的设备允许设计者在实验室中更改。 1970 年 5 月在公司推出辐射金属保险丝链接连接到 512 位的双极 TTL 电 PROM ( 64x8 )每个位。一位烧用户数据的 I / O ,频谱动态,以及其他一次性可编程熔丝编程单位 . 哈里斯(继任辐射) ,单片存储器,摩托罗拉和西格尼蒂克发展 1k 到 16K 位的镍铬保险丝的可编程只读存储器 。 AMD ,英特尔, IT 产业通过使用备用保险丝材料和肖特基技术 (1969 年里程碑 ) 进入市场。 1967 年斯佩里兰德和贝尔实验室的研究人员独立地描述可变内存存储器可以存储 MOS 栅介质中的电荷。 1971 年英特尔多弗弗罗曼用浮栅(悬空)存储在可擦写只读存储器(存储器) 1702 中。 2048 位内存设备可以改变并重复使用多次。模式是由暴露紫外线光通过包中石英窗口拭除。同时比双极设备执行要慢得多,可重用的可编程只读存储器大量被引用在微处理器 ( 1971 年里程碑) 和微控制器 ( 1974 年里程碑) 的原型 ROM 代码中。英特尔又继续出了几代 EPROM 高达数百万位密度, 1978 乔治 · 皮莱格斯设计的英特尔 2816 ,一个电可擦除 PROM ,消除了长时间的紫外线照射周期。 1981 年在 Seeq 与英特尔其他员工基础上 Perlegos 开发了一种改进的版本,可以对其进行编程和擦除原位。闪存,当今最广泛用于非易失性内存 (NVM) 的形式,是由富士男 Masuoka 的东芝开发于 1984 年和 1988 年由英特尔商业化。 当代文献 : D.Kahng 、 D 和施, S.M." 浮栅和内存设备中的应用 " 贝尔系统技术杂志,火山 46 ,第 4 (1967) pp.1288–1295 。 Wegener, H.A.R., Lincoln, A.J., Pao, H.C., O'Connell, M.R., Oleksiak, R.E. Lawrence, H." 可变阈值晶体管,新的电变、 非破坏性的只读存储设备, " 电子设备会议上,国际 1967 年、 火山 13 ( 1967 ) 体育 70 D." 内存行为在浮栅雪崩注入 MOS (FAMOS) 结构中, " 弗罗曼 -Bentchkowsky 卷第 18 (1971) 体育 332 应用物理快报。 弗罗曼 -Bentchkowsky D." 完全解码 2048 年位电可编程序 FAMOS 只读存储器, " 杂志的固态电路、、 火山 6 ,问题 5 ,第 301-306 页 (1971 年 10 月 ) 详细信息 : 奥加唐斯坦 " 电子魔术,一块 " 状态的艺术: 摄影历史的集成电路。(新的避难所科技纽约: Ticknor 和字段, 1983 年 ) 体育 32 。 布朗、 威廉 D. 和啤酒,乔 E. (编辑) 非易失性半导体存储技术 : 理解和使用自持设备综合指南。(威利 IEEE 出版社, 1997 年 10 月 15 日)。 " Fujio Masuoka : 感谢记忆。 创新, " 声音 ; 商业周刊 (2006 4 月 3 日 ) 。 译者:哈尔滨工业大学(威海)电子封装 090840220 刘卫超 校对者:090840228 谢战胜 英文原文: http://www.computerhistory.org/semiconductor/timeline/1971-EPROM.html 1971 - Reusable Programmable ROM Introduces Iterative Design Flexibility Dov Froman’s ultra-violet light erasable ROM design offers an important design tool for the rapid development of microprocessor-based systems, called an erasable, programmable read-only-memory or EPROM A masked ROM ( 1965 Milestone ) pattern is created in the factory and thus takes several weeks to produce each design iteration. User-programmable ROM (PROM) devices allow the designer to make changes in the lab. Radiation Inc. introduced a 512-bit bipolar TTL PROM (64x8) with metal fuse links connected to each bit in May 1970. A user "burned" the one-time-programmable fuses on programming units from Data I/O, Spectrum Dynamics, and others. Harris (successor to Radiation), Monolithic Memories, Motorola, and Signetics developed 1K through 16K-bit nickel-chromium fuse PROMs. AMD, Intel, and TI entered the market using alternative fuse materials and Schottky technology. ( 1969 Milestone ) Researchers at Bell Labs and Sperry Rand independently described alterable memory cells that stored charge in the MOS gate dielectric in 1967. At Intel in 1971 Dov Frohman used a floating (unconnected) gate for storage in the 1702 Erasable PROM (EPROM). The 2048-bits of memory could be changed and reused multiple times. The pattern was erased by exposure to ultra-violet light through a quartz window in the package. While much slower performing than bipolar devices, re-usable EPROMs found numerous applications in prototyping ROM codes for microprocessors ( 1971 Milestone ) and microcontrollers ( 1974 Milestone ). Intel went on to produce generations of EPROMs up to multi-million bits in density. In 1978 George Perlegos designed the Intel 2816, an Electrically Erasable PROM that eliminated the lengthy UV exposure cycle. On founding Seeq with other Intel employees in 1981, Perlegos developed an improved version that could be programmed and erased in-situ, in the system. Flash, today's most widely used non-volatile memory (NVM) form, was developed in 1984 by Fujio Masuoka of Toshiba and commercialized by Intel in 1988. 版权 copyright by www.computerhistory.org Contemporary Documents D. Kahng, D, and Sze, S. M. "A floating-gate and its application to memory devices," The Bell System Technical Journal, Vol. 46, No. 4 (1967) pp.1288–1295. Wegener, H.A.R., Lincoln, A.J., Pao, H.C., O'Connell, M.R., Oleksiak, R.E. Lawrence, H. "The variable threshold transistor, a new electrically-alterable, non-destructive read-only storage device," Electron Devices Meeting, 1967 International, Vol. 13 (1967) p. 70 Frohman-Bentchkowsky, D. "Memory behavior in a floating-gate avalanche-injection MOS (FAMOS) structure," Applied Physics Letters, Vol. 18 (1971) p. 332. Frohman-Bentchkowsky, D. "A fully decoded 2048-bit electrically programmable FAMOS read-only memory," IEEE Journal of Solid-State Circuits, , Vol. 6, Issue 5, (Oct 1971) pp. 301-306. Oral History transcripts online at the Computer History Museum Frohman-Bentchkowsky, Dov (Intel) an oral history (2009-05-02) Intel FLASH Non-Volatile Memory oral history panel - Kynett, Lai, McCormick, Pashley (2007-11-20) Harari, Eli. (Intel, Waferscale, SanDisk) Transcript in process More Information Augarten, Stan. "A Piece of Electronic Magic," State Of The Art: A Photographic History of the Integrated Circuit. (New Haven New York: Ticknor and Fields, 1983) p. 32. Brown, William D. and Brewer, Joe E. (Editors) Nonvolatile Semiconductor Memory Technology: A Comprehensive Guide to Understanding and Using NVSM Devices. (Wiley-IEEE Press, October 15, 1997). "Fujio Masuoka: Thanks for the Memory. Voices of Innovation," Business Week (April 3, 2006). EPROM的发明者多夫弗罗曼面具设计图纸 石英窗口紫外光EPROM 1971英特尔编程存储器
4763 次阅读|0 个评论
半导体里程_博物馆_1971 可编程只读存储器重用迭代设计的灵活性
WanghuataoHIT 2012-3-5 10:51
格式要求, http://blog.sciencenet.cn/home.php?mod=spaceuid=652849do=blogid=544164
1161 次阅读|0 个评论
[转载]MATLAB与C/C++混合编程之MATLAB调用C程序
dutren 2012-2-23 08:52
通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或WatcomC中的一种。如果你在安装Matlab时已经设置过编译器,那么现在你应该就可以使用mex命令来编译c语言的程序了。如果当时没有选,就在Matlab里键入mex-setup,下面只要根据提示一步步设置就可以了。需要注意的是,较低版本的在设置编译器路径时,只能使用路径名称的8字符形式。比如我用的VC装在路径C:/PROGRAMFILES/DEVSTUDIO下,那在设置路径时就要写成:“C:/PROGRA~1”这样设置完之后,mex就可以执行了。为了测试你的路径设置正确与否,把下面的程序存为hello.c。 /*hello.c*/ #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) {mexPrintf("hello,world!/n"); } 假设你把hello.c放在了C:/TEST/下,在Matlab里用CDC:/TEST/将当前目录改为C:/TEST/(注意,仅将C:/TEST/加入搜索路径是没有用的)。现在敲: mexhello.c 如果一切顺利,编译应该在出现编译器提示信息后正常退出。如果你已将C:/TEST/加 入了搜索路径,现在键入hello,程序会在屏幕上打出一行: hello,world! 看看C/TEST/目录下,你会发现多了一个文件:HELLO.DLL。这样,第一个mex函数就算完成了。分析hello.c,可以看到程序的结构是十分简单的,整个程序由一个接口子过程mexFunction构成。 voidmexFunction(intnlhs,mxArray*plhs ) 前面提到过,Matlab的mex函数有一定的接口规范,就是指这 nlhs:输出参数数目 plhs:指向输出参数的指针 nrhs:输入参数数目 例如,使用 =test(c,d,e) 调用mex函数test时,传给test的这四个参数分别是 2,plhs,3,prhs 其中: prhs =c prhs =d prhs =e 当函数返回时,将会把你放在plhs ,plhs 里的地址赋给a和b,达到返回数据的目的。 细心的你也许已经注意到,prhs 和plhs 都是指向类型mxArray类型数据的指针。这个类型是在mex.h中定义的,事实上,在Matlab里大多数数据都是以这种类型存在。当然还有其他的数据类型,可以参考Apiguide.pdf里的介绍。 为了让大家能更直观地了解参数传递的过程,我们把hello.c改写一下,使它能根据输 入参数的变化给出不同的屏幕输出: //hello.c2.0 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { inti; i=mxGetScalar(prhs ); if(i==1) mexPrintf("hello,world!/n"); else mexPrintf("大家好!/n"); } 将这个程序编译通过后,执行hello(1),屏幕上会打出: hello,world! 而hello(0)将会得到: 大家好! 现在,程序hello已经可以根据输入参数来给出相应的屏幕输出。在这个程序里,除了用到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)外,还用到了一个函数:mxGetScalar,调用方式如下: i=mxGetScalar(prhs ); "Scalar"就是标量的意思。在Matlab里数据都是以数组的形式存在的,mxGetScalar的作用就是把通过prhs 传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量。这个变量本来应该是double类型的,通过强制类型转换赋给了整形变量i。既然有标量,显然还应该有矢量,否则矩阵就没法传了。看下面的程序: //hello.c2.1 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { int*i; i=mxGetPr(prhs ); if(i ==1) mexPrintf("hello,world!/n"); else mexPrintf("大家好!/n"); } 这样,就通过mxGetPr函数从指向mxArray类型数据的prhs 获得了指向double类型的指针。 但是,还有个问题,如果输入的不是单个的数据,而是向量或矩阵,那该怎么处理呢?通过mxGetPr只能得到指向这个矩阵的指针,如果我们不知道这个矩阵的确切大小,就 没法对它进行计算。 为了解决这个问题,Matlab提供了两个函数mxGetM和mxGetN来获得传进来参数的行数和列数。下面例程的功能很简单,就是获得输入的矩阵,把它在屏幕上显示出来: //show.c1.0 #include"mex.h" #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { double*data; intM,N; inti,j; data=mxGetPr(prhs );//获得指向矩阵的指针 M=mxGetM(prhs );//获得矩阵的行数 N=mxGetN(prhs );//获得矩阵的列数 for(i=0;iM;i++) {for(j=0;jN;j++) mexPrintf("%4.3f",data ); mexPrintf("/n"); } } 编译完成后,用下面的命令测试一下: a=1:10; b= ; show(a) show(b) 需要注意的是,在Matlab里,矩阵第一行是从1开始的,而在C语言中,第一行的序数为零,Matlab里的矩阵元素b(i,j)在传递到C中的一维数组大data后对应于data 。 输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同一个地址空间,因而在prhs 中传递出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请,函数原型如下: mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag) m:待申请矩阵的行数 n:待申请矩阵的列数 为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs , intnrhs,constmxArray*prhs ); M=mxGetM(prhs ); N=mxGetN(prhs ); plhs =mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs ); for(i=0;iM;i++) for(j=0;jN;j++) outData =inData ; } 当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到的一些函数,其余的详细情况清参考Apiref.pdf。 通过前面两部分的介绍,大家对参数的输入和输出方法应该有了基本的了解。具备了这些知识,就能够满足一般的编程需要了。但这些程序还有些小的缺陷,以前面介绍的re由于前面的例程中没有对输入、输出参数的数目及类型进行检查,导致程序的容错性很差,以下程序则容错性较好 #include"mex.h" voidmexFunction(intnlhs,mxArray*plhs ) { double*inData; double*outData; intM,N; //异常处理 //异常处理 if(nrhs!=1) mexErrMsgTxt("USAGE:b=reverse(a)/n"); if(!mxIsDouble(prhs )) mexErrMsgTxt("theInputMatrixmustbedouble!/n"); inData=mxGetPr(prhs ); M=mxGetM(prhs ); N=mxGetN(prhs ); plhs =mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs ); for(i=0;iM;i++) for(j=0;jN;j++) outData =inData ; } 在上面的异常处理中,使用了两个新的函数:mexErrMsgTxt和mxIsDouble。MexErrMsgTxt在给出出错提示的同时退出当前程序的运行。MxIsDouble则用于判断mxArray中的数据是否double类型。当然Matlab还提供了许多用于判断其他数据类型的函数,这里不加详述。 需要说明的是,Matlab提供的API中,函数前缀有mex-和mx-两种。带mx-前缀的大多是对mxArray数据进行操作的函数,如mxIsDouble,mxCreateDoubleMatrix等等。而带mex前缀的则大多是与Matlab环境进行交互的函数,如mexPrintf,mexErrMsgTxt等等。了解了这一点,对在Apiref.pdf中查找所需的函数很有帮助。 至此为止,使用 C编写mex函数的基本过程已经介绍完了。 原文链接: http://blog.csdn.net/sbtdkj1017/article/details/1901647
3165 次阅读|0 个评论
关于shell编程中命令提交的问题
liujd 2012-1-30 16:22
写出来shell程序,本质上是一个一个命令提交的过程,在不提供后台运行的情况下,程序必须是依次执行,只有执行完前面的程序之后才能提交后面的程序。要想让shell中的程序并行执行那么可以采用后台运行的方式实现。 如:command1 command2
个人分类: linux|1067 次阅读|0 个评论
我的软件及其编程博客和微博
cnruby 2012-1-22 19:11
自从2005年起开始写软件及其编程博客,我已经使用过许多网站。但是最终使用的还是: http://lycom.de/ 网站。该网站是报道最新Ruby语言、Rails框架、Ubuntu与MacOSX操作系统及其相关软件和技术信息。我的图片一般情况下储存于网站: http://cnruby.slide.com 。但是该网站即将也要被关闭,看来还要把这些图片存放到自己的网站。我的软件及其编程微博: http://twitter.com/cnruby 。
个人分类: 软件与编程|2137 次阅读|0 个评论
[转载]C语言程序编程规范
joel1019 2012-1-20 07:16
C语言程序编程规范 (2008-02-19 10:02) 分类: 嵌入式开发 C语言编程规范(仅供参考) 1. 基本要求 1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。 1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。 1.3 尽量 使用 标准库函数和公共函数。 1.4 不要随意定义全局变量,尽量使用局部变量。 1.5 使用括号以避免二义性。 2.可读性要求 2.1 可读性第一,效率第二。 2.2 保持注释与代码完全一致。 2.3 每个源程序文件,都有文件头说明,说明规格见规范。 2.4 每个函数,都有函数头说明,说明规格见规范。 2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。 2.7 常量定义(DEFINE)有相应说明。 2.8 处理 过程的每个阶段都有相关注释说明。 2.9 在典型算法前都有注释。 2.10 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为 单位 ,定义Tab为 6个 字节。 2.11 循环、分支层次不要超过五层。 2.12 注释可以与语句在同一行,也可以在上行。 2.13 空行和空白字符也是一种特殊注释。 2.14 一目了然的语句不加注释。 2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。 2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3 。 3. 结构化要求 3.1 禁止出现两条等价的支路。 3.2 禁止GOTO语句。 3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。 3.4 用 CASE 实现多路分支。 3.5 避免从循环引出多个出口。 3.6 函数只有一个出口。 3.7 不使用条件赋值语句。 3.8 避免不必要的分支。 3.9 不要轻易用条件分支去替换逻辑表达式。 4. 正确性与容错性要求 4.1 程序首先是正确,其次是优美 4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。 4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。 4.4 所有变量在调用前必须被初始化。 4.5 对所有的用户输入,必须进行合法性检查。 4.6 不要比较浮点数的相等, 如: 10.0 * 0.1 == 1.0 , 不可靠 4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否 逻辑锁定、打印机是否联机等。 4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。 5. 可重用性要求 5.1 重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。 5.2 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。 5.3 公共控件或类应建立使用模板。 附:C++ 编程规范,delphi作相应的参考 1适用范围 本标准适用于利用Visul C++ ,Borland C++进行软件程序开发的人员.。 .2变量命名 命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意 义字符串,如果连续意义字符串仅两个,可都大写.如OK. 具体例程: BOOL类型         bEnable; ch   *       char              chText c   *       类对象             cMain(对象实例) h   *       Handle(句柄)         hWnd i   *       int n   *       无符号整型 p   *       指针 sz,str *       字符串 w           WORD x,y          坐标 Char或者TCHAR类型    与Windows API有直接联系的用szAppName 形式否则用 FileName 形式,单个字符也可用小写字母表示; Int类型          nCmdShow; LONG类型         lParam; UINT类型         uNotify; DWORD类型        dwStart; PSTR类型         pszTip; LPSTR类型        lpCmdLine LPTSTR类型        lpszClassName; LPVOID类型        lpReserved WPARAM类型       wParam, LPARAM类型        lParam HWND类型         hDlg; HDC类型          hDC; HINSTANCE类型      hInstance HANDLE类型        hInstance, HICON类型         hIcon; int             iTmp float             fTmp DWORD          dw* String , AnsiString       str * m_           类成员变量           m_nVal, m_bFlag g_           全局变量            g_nMsg, g_bFlag 局部变量中可采用如下几个通用变量:nTemp,nResult,I,J(一般用于循环变量)。 其他资源句柄同上 .3常量命名和宏定义 常量和宏定义必须具有一定的实际意义; 常量和宏定义在#include和函数定义之间; 常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线 连接 ,每一 条定义的右侧必须有一简单的注释,说明其作用; 资源名字定义格式: 菜单:IDM_XX或者CM_XX 位图:IDB_XX 对话框:IDD_XX 字符串:IDS_XX DLGINIT:DIALOG_XX  ICON:IDR_XX .4函数命名 函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源:模 块名及文件名, 如是内部函数,只要注释其定义文件名; 第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线 间隔,示例如下: void UpdateDB_Tfgd (TRACK_NAME);  file://Module Name :r01/sdw.c void PrintTrackData (TRACK_NAME); file://Module Name :r04/tern.c void ImportantPoint (void);      file://Module Name :r01/sdw.c void ShowChar (int , int , chtype);  file://Local Module void ScrollUp_V (int , int);      file://Local Module .5结构体命名 结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用 大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数 据区,必须注明其所属的进程。全局数据定义只需注意其用途。           示例如下:           typedef struct           {               char         szProductName ;               char         szAuthor ;               char         szReleaseDate ;               char         szVersion ;               unsigned long    MaxTables;               unsigned long    UsedTables; }DBS_DATABASE; DBS_DATABASE GdataBase; 6 控件的命名: 用小写前缀表示类别 用小写前缀表示类别: fm       窗口 cmd      按钮 cob      combo,下拉式列表框 txt      文本输入框 lab      labal,标签 img      image,图象 pic      picture grd      Grid,网格 scr      滚动条 lst      列表框 frm      fram 7注释 原则上注释要求使用中文; 文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复 杂的算法需要加上流程说明; 函数注释包括:输入、输出、函数描述、流程 处理 、全局变量、调用样例等,复杂的函数 需要加上变量用途说明; 程序中注释包括:修改时间和作者、方便理解的注释等; 转载自: http://blog.chinaunix.net/space.php?uid=20490872do=blogid=1665371
个人分类: C/C++|3387 次阅读|0 个评论
[转载]VC++中如何调用matlab函数
joel1019 2012-1-16 06:12
Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。基于 VC 和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。    1. 什么是Matlab引擎   所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab的控制。可以主要功能有:   ★ 打开/关闭一个Matlab对话;   ★ 向Matlab环境发送命令字符串;   ★ 从Matlab环境中读取数据;   ★ 向Matlab环境中写入数据。   与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供100%的支持。同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。   实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时,会自动执行一次: matlab /regserver   将自己在系统的控件库中注册。如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。    2. 配置编译器   要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例):   1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:/matlab/extern/include"(假定matlab安装在C:/matlab目录)。   2) 选择Library files,添加路径:C:/matlab/extern/lib/win32/microsoft/msvc60。   3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。   以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ Builder ,设置大体相同,不再赘述。    3. 引擎API详解   在调用Matlab引擎之前,首先应在相关文件中加入一行:#include "enging.h",该文件包含了引擎API函数的说明和所需数据结构的定义。可以在VC中调用的引擎函数分别如下:   3.1 引擎的打开和关闭   engOpen-打开Matlab engine   函数声明: Engine *engOpen(const char *startcmd);   参数startcmd是用来启动Matlab引擎的字符串参数, 在Windows操作系统中 只能为NULL。   函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine数据结构。   EngClose-关闭Matlab 引擎   函数声明: int engClose(Engine *ep);   参数ep代表要被关闭的引擎指针。   函数返回值为0表示关闭成功,返回1表示发生错误。   例如,通常用来打开/关闭Matlab引擎的代码如下: Engine *ep; //定义Matlab引擎指针。 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。 { MessageBox("Can't start Matlab engine!" ); exit(1); } . ………… engClose(ep); //关闭Matlab引擎。   3.2 向Matlab发送命令字符串   engEvalString-发送命令让Matlab执行。   函数声明: int engEvalString(Engine *ep, Const char *string);   参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。   函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。   3.3 获取Matlab命令窗口的输出   要在VC中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab窗口中的输出,可以调用engOUtputBuffer函数。   函数声明: int engOutputBuffer(Engine *ep, char *p, int n);   参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。该函数执行后,接下来的engEvalString函数所引起的命令行输出结果会在缓冲区p中保存。如果要停止保存,只需调用代码:engOutputBuffer(ep, NULL, 0)。   3.4 读写Matlab数据   3.4.1从Matlab引擎工作空间中获取变量。 mxArray *engGetVariable(Engine *ep, const char *name);   参数ep为打开的Matlab引擎指针,name为以字符串形式指定的数组名。   函数返回值是指向name数组的指针,类型为mxArray*(mxArray数据类型在本文第4节详细简介)。   3.4.2 向Matlab引擎工作空间写入变量。 int engPutVariable(Engine *ep, const char *name, const mxArray *mp);   参数ep为打开的Matlab引擎指针,mp为指向被写入变量的指针,name为变量写入后在Matlab引擎工作空间中的变量名。 函数返回值为0表示写入变量成功,返回值为1表示发生错误。   3.5 调用引擎时显示/隐藏Matlab主窗口   默认情况下,以engine方式调用Matlab的时候,会打开Matlab主窗口,可在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。 int engSetVisible(Engine *ep, bool value);   参数ep为打开的Matlab引擎指针,value为是否显示的标志,取值true(或1)表示显示Matlab窗口,取值false(或0)表示隐藏Matlab窗口。   函数返回值为0表示设置成功,为1表示有错误发生。   要获得当前Matlab窗口的显示/隐藏情况,可以调用函数: int engGetVisible(Engine *ep, bool *value);   参数ep为打开的Matlab引擎指针,Value为用来保存显示/隐藏情况的变量(采用指针方式传递)。   函数返回值为0表示获取成功,为1表示有错误发生。 4. 数据类型mxArray的操作   在上节的Matlab引擎函数中,所有与变量有关的数据类型都是mxArray类型。数据结构mxArray以及大量的mx开头的函数,广泛用于Matlab 引擎程序和Matlab C数学库中。mxArray是一种很复杂的数据结构,与Matlab中的array相对应,我们只需熟悉Matlab的array类型和几个常用的mxArray函数即可。    在VC中 ,所有和Matlab的数据交互都是通过mxArray来实现的,在使用mxArray类型的程序中,应包含头文件matrix.h,不过在引擎程序中,一般会包含头文件engine.h,该文件里面已经包含了matrix.h,因此无需重复包含。   4.1 创建和清除mxArray型数据   Matlab有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是mxArray。   数组的建立采用mxCreatexxx形式的函数,例如新建一个double类型数组,可用函数mxCreateDoubleMatrix,函数形式如下: mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);   参数m和n为矩阵的函数和列数。ComplexFlag为常数,用来区分矩阵中元素是实数还是复数,取值分别为mxREAL和mxCOMPLEX。   例如,创建一个3行5列的二维实数数组,可用如下语句: mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);   对应的,要删除一个数组mxDestroyArray,该函数声明如下: void mxDestroyArray(mxArray *array_ptr);   参数array_ptr为要删除的数组指针。   例如,要删除上面创建的数组T,可用如下语句: mxDestroyArray(T);   类似的创建函数还有: mxArray *mxCreateString(const char *str);   创建一个字符串类型并初始化为str字符串。   一般的在VC与Matlab交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。   4.2 管理mxArray数据类型   4.2.1 管理mxArray数据大小   要获得mxArray数组每一维上元素的个数,可以用mxGetM和mxGetN函数。其中mxGetM用来获得数组第一维的元素个数,对于矩阵来说就是行数。 int mxGetM(const mxArray *array_ptr); //返回array_ptr对应数组第一维的元素个数(行数) int mxGetN(const mxArray *array_ptr); //返回array_ptr对应数组其它维的元素个数,对于矩阵来说是列数。对于多维数组来说是从第2维到最后一维的各维元素个数的乘积。   要获得某一特定维的元素个数,则要用函数: const int *mxGetDimensions(const mxArray *array_ptr);   该函数返回array_ptr各维的元素个数保存在一个int数组中返回。对于常用的矩阵来说,用mxGetM和mxGetN两个函数就可以了。   另外还可以通过mxGetNumberOfDimensions来获得数组的总的维数,用mxSetM、mxSetN设置矩阵的行数和列数,函数说明如下: mxGetNumberOfDimensions(const mxArray *array_ptr); //返回数组的维数 void mxSetM(mxArray *array_ptr, int m); //设置数组为m行 void mxSetN(mxArray *array_ptr, int n); //设置数组为n列   4.2.2 判断mxArray数组类型   在对mxArray类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为double数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为inf、NaN等。常见的判断函数有: bool mxIsDouble(const mxArray *array_ptr); bool mxIsComplex(const mxArray *array_ptr); bool mxIsChar(const mxArray *array_ptr); bool mxIsEmpty(const mxArray *array_ptr); bool mxIsInf(double value); …… ……   这些函数比较简单,意义自明,不再解释。   4.2.3 管理mxArray数组的数据   对于常用的double类型的数组,可以用mxGetPr和mxGetPi两个函数分别获得其实部和虚部的数据指针,这两个函数的声明如下: double *mxGetPr(const mxArray *array_ptr); //返回数组array_ptr的实部指针 double *mxGetPi(const mxArray *array_ptr); //返回数组array_ptr的虚部指针   这样,就可以通过获得的指针对mxArray类型的数组中的数据进行读写操作。例如可以用函数engGetVariable从Matlab工作空间读入mxArray类型的数组,然后用mxGetPr和mxGetPi获得数据指针,对并其中的数据进行处理,最后调用engPutVariable函数将修改后的数组重新写入到Matlab工作空间。具体实现见第5节程序实例。 5. 程序实例   对大部分软件研发人员来说利用 VC编程 方便、高效,但是要显示数据图形就不那么容易了,这时候不防借助Matlab引擎辅助画图做数据分析。下面通过实例演示如何利用VC调用Matlab绘图,程序的主要功能是在VC中对数组x计算函数值y=sin(x) ±log(x),然后调用Matlab绘制y对x的图形。   在VC中新建工程,编写代码如下: #include iostream #include math.h #include "engine.h" using namespace std; void main() {  const int N = 50;  double x ,y ;  int j = 1;  for (int i=0; iN; i++) //计算数组x和y  {   x = (i+1);   y = sin(x ) + j * log(x ); //产生-之间的随机数赋给xx ;   j *= -1;  }  Engine *ep; //定义Matlab引擎指针。  if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。  {   cout "Can't start Matlab engine!" endl;   exit(1);  }  //定义mxArray,为行,N列的实数数组。  mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL);  mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); //同上。  memcpy(mxGetPr(xx), x, N*sizeof(double)); //将数组x复制到mxarray数组xx中。  memcpy(mxGetPr(yy), y, N*sizeof(double)); //将数组x复制到mxarray数组yy中。  engPutVariable(ep, "xx",xx); //将mxArray数组xx写入到Matlab工作空间,命名为xx。  engPutVariable(ep, "yy",yy); //将mxArray数组yy写入到Matlab工作空间,命名为yy。  //向Matlab引擎发送画图命令。plot为Matlab的画图函数,参见Matlab相关文档。  engEvalString(ep, "plot(xx, yy); ");  mxDestroyArray(xx); //销毁mxArray数组xx和yy。  mxDestroyArray(yy);  cout "Press any key to exit!" endl;  cin.get();  engClose(ep); //关闭Matlab引擎。 } 6. 小结   本文详细的介绍了Matlab引擎使用方法并演示了一个简单的利用VC调用Matlab画图的程序实例。大多数时候,程序员可以利用Matlab强大的数据读写、显示能力和VC编程的高效率。例如,在Matlab中要读入一幅任意格式的图像均只需一条命令i=imread('test.jp');图像数据矩阵便存放在了二维数组i中,可以通过VC读入该数组进行相关处理再调用Matlab显示,这种混合编程方式能大大提高工作效率。   当然,利用VC编译的Matlab引擎程序,运行环境中还必须Matlab的支持,如果要编译完全脱离Matlab的程序,可采用其它方式,如利用第三方Matcom程序编译独立的可执行程序等 转载自: http://hi.baidu.com/lreij/blog/item/638817cacbb26743f21fe79f.html
个人分类: C/C++|4764 次阅读|0 个评论
Python核心编程及其笔记
bennyg 2011-12-28 10:16
Python的优越性就不说了,直接上书。希望多交流。 Python核心编程(中文第二版).pdf Python核心编程笔记.doc
2521 次阅读|0 个评论
[转载]抗衰老药物可提高小鼠细胞重编程效率
fuchengcaiyun 2011-12-19 00:36
抗衰老药物可提高小鼠细胞重编程效率 来自中科院上海生命科学研究院生化与细胞所,广州生物医药与健康研究院等处的研究人员发表了题为“Rapamycin and other longevity-promoting compounds enhance the generation of mouse induced pluripotent stem cells”的文章,发现Rapamycin等抗衰老药物可以提高小鼠细胞重编程的效率,这说明生物体寿命的调节和细胞重编程过程的调控之间可能有着功能上的紧密联系,这一研究成果公布在国际著名期刊《衰老细胞》( Aging Cell )上,这一研究课题获得国家科技部973项目、国家自然科学基金委以及中国科学院干细胞先导专项的经费资助。 领导这一研究的是中科院裴钢研究员,裴钢研究组近年来在iPS细胞研究方面获得了一些重要的成果,主要集中在iPS细胞诱导效率方面,之前他们曾发文,发现小分子化合物通过E-cadherin蛋白能加速重编程过程,为提高iPS细胞诱导效率提供了一种新策略。裴钢研究员为中国科学院院士、第三世界科学院院士,曾先后获得过求是科技基金会“杰出青年学者奖”、何梁何利科技进步奖、国家自然科学二等奖、上海市自然科学一等奖。 生物体的衰老(aging)是一个非常复杂的过程。随着年龄的增长,生物体内各种分子、细胞、组织以及器官的损伤会不断的积累,从而逐渐丧失功能,并最终导致疾病和死亡。近年来,延缓衰老以及延长人类的健康寿命(healthy lifespan)成为了生物学研究的热点。包括mTOR以及IIS 信号通路在内的一些细胞信号通路已经被证明与生物体的寿命调节有着密切的联系。生化与细胞所裴钢课题组最近的一项研究表明,生物体寿命的调节和细胞重编程过程的调控之间可能有着功能上的紧密联系。 Rapamycin是一种临床使用的免疫抑制剂,并通过抑制mTOR信号通路而调节细胞的存活,增殖,以及迁移等。在包括小鼠、果蝇、线虫等在内的多种模式生物上,rapamycin已被证明能够显著延长生物体的寿命。 在最近的研究中,裴钢研究组发现,在小鼠细胞重编程的早期给以rapamycin或另一mTOR信号通路的抑制剂pp242处理都能显著提高重编程的效率。同时,另一与生物体寿命密切相关的通路IIS信号通路的抑制剂PQ401 也同时具有提高细胞重编程效率和延长果蝇寿命这两种作用。进一步的研究发现,包括sirtuin蛋白的激动剂resveratrol, 以及autophagy的激活剂spermidine在内的多种抗衰老药物都可以有效提高细胞重编程的效率。这些研究结果表明细胞重编程的调节和生物体寿命的调控之间共享一些信号通路,从而提供了一种从细胞重编程的角度研究生物体寿命调节的新方法。通过解析体内细胞重编程的过程,科学家有可能最终获得抵御衰老永葆青春的方法。(来源:生物通 万纹)
0 个评论
Python for Bioinformatics 为生物信息学设计的Python教程
热度 11 Hadron74 2011-11-21 20:46
由于这本书较旧,本书的中文译本将不出版。新书《Python生物信息数据管理》己出版,网上有售。谢谢大家的关注和支持。应多位朋友的要求,把该《Python for Bioinformatics》一书的旧稿放到数据空间的博客上,点击即可,供大家参考 (2017.1.13): 前言 第一部分 编程 第一章 介绍 第二章 初识Python 第三章 基本编程:数据结构 第四章 编程:流程控制 第五章 处理文件 第六章 代码模块化 第七章 错误处理 第八章 面向对象编程(OOP)介绍 第九章 正则表达式 第二部分 Biopython 第十章 Biopython (I) 第十章 Biopython (II) 第三部分 高级主题 第十一章 网络应用 第十二章 XML 第十三章 Python和数据库 第十四章 合作开发:版本控制 第四部分 带注释代码的Python菜谱 第十五章 批量操作序列 第十六章 过滤载体污染的网络应用 第十七章 用Prime3寻找PCR引物 第十八章 对引物集计算解链温度 第十九章 从Genbank过滤出特定字段 第二十章 转换XML BLAST文件到HTML 第廿一章 推导剪切位点 第廿二章 用限制性内切酶处理DNA突变 第廿三章 多序列联配的网络服务器 第廿四章 用存储在数据库中数据来画标记位置 译 后 感
个人分类: 生物信息|42230 次阅读|21 个评论
R语言基础 入门 基本框架ppt和联系材料
热度 1 maolingfeng 2011-11-16 05:44
R语言基础---by 毛岭 2-练习数据.rar 跟随PPT例子程序.r 峰.ppt R语言基础---by 毛岭峰.ppt R语言基础---by 毛岭峰.ppt 前几天做了个R语言的相关报告,附件中有相关的联系程序,觉得对初学者对R的理解和基本应用有所帮助,特将资料上传,其中具ppt有张金龙博士的贡献,特此感谢!希望对大家有用。
个人分类: R语言学习笔记|8054 次阅读|1 个评论
嘉文请进!实例讨论。
热度 1 geneculture 2011-11-15 17:08
我是这样想的: 1.C和C++的同类示例或实例比比皆是,如何选择几组有说服力的案例并能用较少的文字和图表加以转述和点评?这也是一种能力。这样的学习和锻炼的机会,学习者最好不要简单地一带而过!换一句话说,作者要站在读者立场上来想一想:别人读了我的文章究竟能从中得到什么新的启示或帮助? 2.如何采用对称矩阵的方式和双语编程的策略来调用和重组从上述比比皆是的C和C++的同类示例或实例中选择的几组有说服力的案例?具体做法多种多样——我曾经在多种场合并以多个角度介绍过。 记住 Kurt Lewin 的话:“ 没有什么比一个好的理论更实用了 。” 一个好的理论使得学习和开发你的知识更容易,而不会带来过分的崇拜。这将是聪明的。 http://edu.qq.com/a/20101118/000174_2.htm geneculture 2011-11-15 16:57 就用一个五子棋做例子, 这样也许更能说明问题。 附录: geneculture 2011-11-15 16:53 我们在 做的对照实例 中就有: 0.汇编语言 1.结构化编程语言 2.对象化编程语言 以上是第一路径的做法 , 以下是第二路径的做法 : 3.对称矩阵方式+双语调用机制= 最终是双重路径协同的效果 : 第二路径的用户 仅需在前台采用“母语+对象”进行操作 双重路径的系统 即可在后台 支持 调用或重组“数据结构+算法”加以响应 (这 对第二路径的用户来说 也就相当于 用户无须懂第一路径的任何编程语言 就可直接采用“母语+对象”的操作方式 进行特定的个性化编程或标准化类库的 调用或重组) 【84】 geneculture 2011-11-15 16:40 e.g.1 你想要看的那些个简单的示例,如:计算示例的“hello world!”,在新框架中是这样实现的: 步骤1:用户只要用母语把“你好!”(等价于“Hello”或“hello world”)和一个“对象”界面用鼠标拉在一起, 步骤2:再按一个运行模式调用按键 步骤3:即可完成。具体表现为:用户点击--机器运行。 注: 在新框架(“前台仅可用母语的多语种自由切换开发环境”)的双语标注对象类库中选择进入“(简单)调用”(不懂任何编程语言的普通用户)或“(精心)重构或重组”(至少精通某种编程语言的高级用户),本例进入前一个入口,即可看见一个具体的子类库,用户便可从中选择某个“双语标注对象”,本例就是步骤1所述的情形,然后,再选择“(简单)调用”,本例即步骤2,步骤3实际上已经是验证者点击--软件运行回应。 博主回复(2011-11-15 17:08) : 这样好吧,我把传统只用第一路径实现加法操作语义的架构和过程展现出来。晓辉基于这个架构和过程对照说明你的第二路径是如何参与进来工作,是可以如何更便捷解决更复杂的问题的(可以故意复杂化加法操作语义的问题,以便展现第二路径的优势)。 博主回复(2011-11-15 16:51) : 我现在需要晓辉展示的是:做一个具体的计算操作。这个计算操作,一定要使用到晓辉的序位矩阵、孪生图灵机等架构元素,还要看到在什么扩展点或聚拢点与第一路径的架构交汇。 博主回复(2011-11-15 16:47) : 关键是要展现你的架构的关键特征,而不是实现一个简单的示例,因此,可能需要将简单的示例复杂化,以便这个示例可以用来表现你的架构机制的优势。 【83】 geneculture 2011-11-15 16:19 不要说设计做一个加法了, 就是设计做计算器、象棋、写字板、浏览器、视窗、信息管理系统、计算机辅助教学系统、计算机辅助决策系统、多种编程语言协作开发平台、前台仅可用母语的多语种自由切换开发环境,等等,都不在话下。 你想要看的那些个简单的示例,如:计算示例的“hello world!”,用户只要用母语把它(即:“你好!”)和一个“对象”界面用鼠标落在一起,再按一个运行模式调用按键即可完成。换句话说,对第二路径的普通用户几乎就是无须使用以往的任何编程语言就实际是在做第一路径需要编程的事情了。 博主回复(2011-11-15 16:37) : 不是让晓辉实现我这个示例,是让晓辉模仿设计和实现自己的示例。这种示例测试着设计,是我认为是一种非常有效的架构设计方法。 博主回复(2011-11-15 16:34) : 案例可参考我的基因软件架构设计的“计算者”系列示例。 http://blog.sciencenet.cn/home.php?mod=spaceuid=33982do=blogid=405882 博主回复(2011-11-15 16:29) : 晓辉需要在示例中展示你的每一个架构的特性。 博主回复(2011-11-15 16:28) : 晓辉明显轻视了这个任务。何不写篇博文沙盘演示一下? 【82】 geneculture 2011-11-15 16:06 补充2: 图11是该虚拟云操作系统第二层c 界面示意图。 由图11 可知,云操作系统第二层c 界面属于“物”的范畴,也具有可间接计算的特点。即:具有“三多”功能或机助人的环境。 注:“三多”即:多媒体(呈现方式)、多学科(知识背景)、多语种(语言支撑)。 博主回复(2011-11-15 16:25) : 也就是说,你可以把一个加法操作设计得是非常难以执行到的操作,用传统的第一路径如何实现这个操作语义的端对端贯通,而在加入第二路径之后,又是怎样贯通的。即便这么简单的问题,用第二路径来解决可能反而显得更累赘和啰嗦,也是可以理解的,只要机制是通的,我总能找到这些累赘的机制对于更复杂的问题而言,是必要的的道理。 所以,晓辉没有理由举不出这样的例子。我对我自己的基因软件架构,就是使用这个方法来测试的。 博主回复(2011-11-15 16:16) : 只有这种实在的、事实化的论述,才会激起读者的兴趣和勤奋欲。 博主回复(2011-11-15 16:14) : 要证明操作语义的实现机制很简单,请设想在新架构下,可以把一个加法实现为什么样子?尽量充分利用到你的每个架构特征,也许这样的加法,会需要很多晦涩可笑的隔靴捎痒的操作,但为了最简要地展现机制而不受问题本身的影响,是可以得到非常的重视的。——尽管你只实现了加法的操作。 【81】 geneculture 2011-11-15 16:03 补充: 图10是该虚拟云操作系统第二层b 界面示意图。 由图10 可知,该云操作系统第二层b 界面属于“意”的范畴,具有可间接计算的特点。即:具有“三注”功能或人助机的平台。 【80】 geneculture 2011-11-15 15:59 第8期 因为孪生图灵机在本质上就是一个协同智能计算系统,所以,其标准化的基本数据结构和基本算法与其个性化的具体数据结构类型和具体算法组合之间存在合理分工、优势互补;高度协作、优化互动的融智过程。 换句话说,其人机交互界面除第一和第二两层的标准化界面入口之外,其 第三层及其之后融入的个性化界面入口只能在教学、研究、服务等具体的实践活动中逐步加以完善,分别与“文”和“物”相应的“意”的具体特征,使其必然如此,否则就不足以建构一个标准化与个性化高度融合的完整知识系统。这是知识整体论的要求。但由于自然人主体和计算机代理双方各有其局限,因 此,只有从协同智能计算系统角度提供一个基本的程序来运行该系统,从而,驾驭标准化的数据库及其第一和第二层界面入口,同时,也为个性化的数据库和后续各层界面入口及其与之相应的配套程序提供接口,才能更好地快速实现上述“16 字方略”体现的融智过程。 图1是一种虚拟的孪生图灵机原理图。 图2是与好算法配套的文化基因系统工程蓝图。 图3是可且易计算的(言和语的关系)数据库原理及其调用示例示意图。 图5是基本的数据结构和算法及其组合衍生各类复杂情形之间的关系示意图。 图6是该超级计算机虚拟云操作系统首层界面示意图。 图7是该虚拟云操作系统第二层a 界面示意图。 由图7 可知,该云操作系统第二层a 界面属于“文”的范畴,具有可间接形式化的特点。与其照应的虚拟数据库有图3 所示标准化的字与字组的关系数据库那样的取值特征。 图8是基于双列表的间接形式化方法原理示意图。 由图8 可知,“字、式、图、表、音、像、立体、活体”均可基于双列表而间接形式化。即:本文所述的虚拟孪生图灵机具有(由图3 进一步推广而来)图8 所示的(双列)表格化、(左列)数字化、(右列)字组化“三化”功能。这里的文即广义文本。 图9是孪生图灵机的双路径选择和天平原理图。 图10是该虚拟云操作系统第二层b 界面示意图。 由图10 可知,该云操作系统第二层b 界面属于“意”的范畴,具有可间接计算的特点。 图11是该虚拟云操作系统第二层c 界面示意图。 由图11 可知,云操作系统第二层c 界面属于“物”的范畴,也具有可间接计算的特点。 综上所述,从图6 至图11 笔者向读者展示了一个虚拟的超级计算机云操作系统的虚拟的前台界面和后台数据结构及各种潜在的算法路径。 图12是一个独特的计算机辅助系统的基本程序示意图。 由图12 可知,一种独特的计算机辅助双语教学、研究与服 务系统的基本操作程序,即:... ... 【79】 geneculture 2011-11-15 15:47 第7期(再续) 图12是对称矩阵(方式)与双语处理(策略)及其所遵循的序位法则或原理(已经转化为统一参照系的比对平台或天平转换装置)示意图 图15是(相对于现有的必须不断地进行数据挖掘的污染严重的数据中心而言)洁净数据中心的语言(总量受到控制且易定量分析)和知识(领域得到界定并可定性分析)的计算统计及质性分析(所支持的语言教育和知识管理或人才培养与知识处理的人机协同互助互动的协同智能计算系统的一种具体体现的应用实施例系统工程方案的蓝图)示意图。 图16是整合双重路径的超级宏语言及其类库调改环境及平台(两种路径对接的的高低两种方式)示意图。 ... ... ... ... 图27是在两个参照系之间明确各就各位与各得其所的方法论(相互关系示意图)。 博主回复(2011-11-15 16:05) : 能不能设计做一个加法看看?看看晓辉的新架构是如何实现协同操作的? 不要小看这个简单的示例。这是计算示例的“hello world!”. geneculture 2011-11-15 15:33 第7期(续) 图11是软件工程两类形式化途径比较示意图。 由图11 可见,(一)和(二)两条基本的形式化途径,即软件工程形式化方法的双重技术路线。其中,第一路径是学界和业界都非常熟悉的软件工程所谓的直接形式化途径,其特点是:... ... 第二路径是我们发现并明确地提出的软件工程间接形式化途径,其特点是... ...双方彼此遵循的分工协作原则——简称“16 字方针”又叫“协同智能观”。 换句话说,就是要自然人(甲方)与计算机(乙方)遵循“16字方针”或“协同智能观”来构造彼此进行广义双语对话的软 件(样品、产品、商品三位一体)乃至协同实施软件工程(蕴含管理和技术双重服务)。严格地讲,这是和以往的软件和软件工程的固有理念完全不同的另类新理念,即:协同智能。 geneculture 2011-11-15 15:27 第7期 2 软件工程形式化方法第二路径何以优越? 在上述软件工程学科何以独特这个根本性大问题语境下, 以下将给出软件工程形式化方法第二路径及其重要性的论证。 geneculture 2011-11-15 15:25 第6期 图2是协同智能计算模型及其汉语形式化计算实例示意图。 图3是自然语言文本理解双重技术路线中第二路径的特征示意图。 注:它同时也是双重路径比较示意图。 geneculture 2011-11-15 15:22 第5期 图4是从a 到c 逐渐收敛的孪生图灵机原理示意图。 geneculture 2011-11-15 15:19 提示: 孪生图灵机 有三层示例: a是由并行的两图灵机组成的一个虚拟的孪生图灵机; b是基于“同义并列、对应转换”法则而建构的天平式计量转换装置,其构造原理由实施例c 描述; c是基于可穷举汉语单音节字的文本符号有限集为实施例来说明上述天平式计量转换装置的。 geneculture 2011-11-15 14:57 多数偷懒的读者或用户 都不读FAQ和help 文件 有很好答案的常规疑问 他们却要请他人来解答 故总充当局外人的角色 geneculture 2011-11-15 14:51 这就像大型软件都自带有: Frequently Asked Questions (FAQ)和help 文件一样, 读者或用户只要熟悉FAQ和help 文件所有常规疑问几乎都能得到很好的解答。 geneculture 2011-11-15 14:47 建议或希望嘉文朋友不要偷懒, 至少认真读完以下前三篇文章! 这样你的很多问题就不是问题, 那时我们再来有针对性的对话, 相信彼此都会更加愉悦和高效。 全文下载: 间接计算模型和间接形式化方法 http://www.ccomsoft.com/kanlist_c.asp?id=272 全文 单击此处 附件下载观看 协同智能计算系统——理论模型及其应用 http://www.ccomsoft.com/kanlist_c.asp?id=306 全文 单击此处 附件下载观看 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 全文 单击此处 附件下载观看 虚拟的孪生图灵机——以双语信息处理为例 http://www.ccomsoft.com/kanlist_c.asp?id=319 全文 单击此处 附件下载观看 “云计算”概念的分析研究 http://www.ccomsoft.com/kanlist_c.asp?id=322 博主回复(2011-11-15 16:08) : 这些链接有权限限制,只能看到摘要。 全文 单击此处 附件下载观看 【70】 geneculture 2011-11-15 10:48 明确回答: “第二路径”(好比是光纤)与“第一路径”(好比是独木桥)之间的关系就是“并联电路”那样的关系, 博主回复(2011-11-15 13:10) : 存在接口适配的问题。无论是什么脑,既然要两条路并行处理,也就是说,至少在机脑一侧,晓辉还是要借助第一路径来贯彻操作语义。那么,就必须明确第二路径如何与第一路径接口。 原来晓辉提到的是孪生图灵机,我还以为是一种独特的实现操作语义的状态机,不需要传统状态机来实现操作语义,现在的说法,似乎有变化了。 这个孪生图灵机只是一个概念机。 博主回复(2011-11-15 11:41) : 在何处并联,并联的接口如何定义?这是没有明确的关键的问题。 【69】 geneculture 2011-11-15 10:44 补上这个回应: 可以这样类比。 博主回复(2011-11-7 08:04):区分“言”和“语”,是不是类似区分“原子”和“分子”? 原子是化学反应的基本不变元件。 从元素周期表的启示来说,晓辉应该只需要编“言周期表”就可以了,语,应该是“言所进行的化学反应”的结果。 【68】 geneculture 2011-11-15 10:06 同理, 提出“第三脑智”(即“协同智能观”和“协同智能计算系统”) 也就是说, 不能再仅仅从“第一脑智”或“第二脑智”各自的角度来简单地看待原有的一系列问题了。 博主回复(2011-11-15 10:27) : 至少是 【67】 geneculture 2011-11-15 10:02 因为, 提出“第二路径”不是不要“第一路径”, 而是,等于:进一步提出了“双重路径”。 博主回复(2011-11-15 10:26) : 如果是这样,晓辉的第二路径需要明确的问题,就不那么多了,但仍然还有艰巨的任务:第二路径和第一路径的接口在什么地方?是什么样的?至少,在机脑的一侧存在接口的问题,在人脑一侧的接口恐怕也不是自然而然的。 博主回复(2011-11-15 10:19) : 也就是说:第二路径是寄生在第一路径之上的一条局部的并列路径? 这条路径“宽阔地短路”掉了第一路径上原来狭窄漫长的一部分通道? 【66】 geneculture 2011-11-15 09:59 或者, 应该给时间让读者重新整理一下思路了。 博主回复(2011-11-15 10:28) : 或许是读者帮您整理一下思路。 【65】 geneculture 2011-11-15 09:58 说到这里, 我认为够读者消化一阵子了。 【64】 geneculture 2011-11-15 09:55 为什么说: 主要是第二路径的语言教育和知识管理的问题了呢? 当看完了“软件工程学科何以独特——形式化方法的双重路径”之后, http://www.ccomsoft.com/kanlist_c.asp?id=320 你就会注意到这样一个问题: 必须翻译或解释或编译的单语者和无需翻译的双语者之间的区别。 【63】 geneculture 2011-11-15 09:50 进一步提示: 既然必须启用第二路径的(多数)用户参与进来协作, 那么如何启用第二路径的(多数)用户参与进来协作? 这就几乎与第一路径的编程无关而是第二路径的语言教育和知识管理的问题了!。 【62】 geneculture 2011-11-15 09:48 请注意: 既然是单靠第一路径的(少数)编程人员所不能胜任的, 那么就必须启用第二路径的(多数)用户参与进来协作。 【61】 geneculture 2011-11-15 09:42 首先表示:我理解并认可这个说法。 晓辉既然理解并认可这个说法,当然也就不会忽视这个重要的问题。 暂时没有直接回应这个说法,只是因为这不是一个简单回应的问题。 现在可以明确地说: 两条路径在各自提出“真正的操作语义端对端的解决方案”时采用了“合”与“分”不同的策略,而晓辉的方案是不仅“合”与“分”两个路径及其不同的策略都要用,而且,还要用两者整合之后它们各自均不具备的“第三脑智”的“双重路径”和“协同策略”。 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 http://www.ccomsoft.com/kanlist_c.asp?id=321 博主回复(2011-11-15 09:28):我在实例讨论的博文中已经点到:第一路径实现了真正的操作语义端对端的解决方案。而晓辉的第二路径,只是实现了符合形式语义的端对端。两条路径的起点和终点是不同的,晓辉忽视了这个重要的问题。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:33 关于 “贯通到操作语义层次” 我是赞同、理解并支持的。 但是,我想说的是: 这不仅是如何“利用机脑的优势”一个方面的问题, 就是说这是单靠第一路径的编程人员所不能胜任的。 博主回复(2011-11-15 09:38) : “不仅是”的含义也可以理解为“至少是”。 如果“至少是”的问题没有得到落实,那么,“整体是”就悬浮了。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:26 理解并赞同: 博主回复(2011-11-15 09:16):一套完美妥帖的符号体系,只是一个人的美丽的脸。要看她的心(真实的语义处理能力)如何,就必须要用它来处理操作,必须落实到行为操作的层次,才能证明(行为操作是最好的表达),需要跑跑骡子跑跑马。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:23 站在协同脑智的立场上是这样思考的: 工程融智学,主要解决“间接计算模型和间接形式化方法”的问题, 也就是要找到统一的语言,统一的一套符号,及其相应的操作平台; 应用融智学,主要解决“协同智能计算系统——理论模型及其应用”的一系列问题,也就是如何使用这套语言来处理实际的操作的一系列的问题。 博主回复(2011-11-15 09:28) : 我在实例讨论的博文中已经点到:第一路径实现了真正的操作语义端对端的解决方案。而晓辉的第二路径,只是实现了符合形式语义的端对端。两条路径的起点和终点是不同的,晓辉忽视了这个重要的问题。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:17 未来的实践主题: 在协同智能计算系统的超级云支持下去协同来做。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:12 看过 http://survivor99.com/entropy/2006entropy/3-4/2006-4-8.htm 图11“三化”(语言) 图12“三注”(知识) 之后, 嘉文就应该知道:早就起步并给出了典型示例。 当然,并不是说:所有的事情都不用再去做了。相反,它们不仅还需要很多人去做,而且,可以说,更需要在协同智能计算系统的超级云支持下去协同来做!。 博主回复(2011-11-15 09:23) : 字本位只是晓辉构造语言文本与数字的形式化映射体系的基础。并没有涉及到我认为“真正到底”的操作语义映射的层次。尤其在机脑这侧,不贯通到操作语义层次,就不可能利用机脑的优势。这就是我说晓辉“海市蜃楼”的原因。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:09 请见: 字本位与中文信息处理 ——解析“字与字组的关系”探索“汉语形式化”新路 (典型实例:由“一字精解”到“字字精解”) 邹晓辉 http://survivor99.com/entropy/2006entropy/3-4/2006-4-8.htm 图11“三化”(语言) 图12“三注”(知识) !-- �༭/a--�ٱ� geneculture 2011-11-15 09:02 提示或探讨: 不知嘉文是否还记得晓辉“语言(形式)定位系统”(即“三化”方法)和“知识(内容)定位系统”(即“三注”方法)的两幅图解? 博主回复(2011-11-15 08:48):我要告诉晓辉的是:我认为晓辉的语言文本的间接形式化也还远未彻底。而语言含义的间接形式化方法还没有起步。发现这一点,就已经是创新了。 博主回复(2011-11-15 09:16) : 一套完美妥帖的符号体系,只是一个人的美丽的脸。要看她的心(真实的语义处理能力)如何,就必须要用它来处理操作,必须落实到行为操作的层次,才能证明(行为操作是最好的表达),需要跑跑骡子跑跑马。 博主回复(2011-11-15 09:11) : 是的,我理解,晓辉只是提出了一种表示映射的方法。对这种表示映射如何用来处理逻辑操作,还几乎是空白。这,就是我说,远未彻底的原因。 不管是人脑还是机脑还是协同脑,有了统一的语言,只是一套符号,关键是如何使用这套语言来处理实际的操作。 这就是我一再强调操作语义的重要性的原因。 我们日常说:“知人知面不知心,路遥知马力,日久见人心”,剥离其褒贬之意,其实我们能发现操作语义的原始重要性。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:59 认同嘉文这个说法或认识。 这就是科学界常说的“提出问题比解决问题更重要”的道理。 博主回复(2011-11-15 08:48):创新的价值,不是完成多大的工作量,而是发现大量的新的有趣的研究工作可以提供给有兴趣的人跟进。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:53 研究性大学应当善于发现并扶持这样的人——真正的原始创新者 http://blog.sina.com.cn/s/blog_65197d930100vmyb.html 原创阶段几乎都是纯粹个人的事情,是市场几乎判断不了的事情。 http://blog.sciencenet.cn/home.php?mod=spaceuid=94143do=blogid=508107 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:52 说得很好! 博主回复(2011-11-15 08:42):最终回到了同一条战线:已知世界向未知世界发起进攻的前沿战线。这正是人类永恒不变的智力活动的根本任务。这条战线不是清晰的单线条的,不是每一个人,每一个团队都是平齐前进的,不是每一个人,每一个团队都是始终前进的,前前后后,进进退退,这条战线始终在向前推进。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:47 进一步提示或商讨: 晓辉所解答的问题1和2以及引出问题的那几个帖子,如果联系到一起,那么,就可看出嘉文理解或赋值的第一层意思之后的另几层意思。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:40 回复: 仅就第一层意思,认同嘉文的下述理解。 再进到二层意思,提示嘉文两点,即: 不仅语言文本可以间接形式化处理并间接计算, 而且语言内容也可间接形式化处理并间接计算。 另外,暂且不管当前学界其他人如何看待或对待HNC,仅就其以字母+数字的组合形式来表达概念的想法和做法而论,也当属第一路径的某种具体的形式化方式。 博主回复(2011-11-15 08:20):剥离语义和语意的真正价值,就是剥离出了可形式化和不可形式化的语言的逻辑信息。 博主回复(2011-11-15 08:48) : 我要告诉晓辉的是:我认为晓辉的语言文本的间接形式化也还远未彻底。而语言含义的间接形式化方法还没有起步。发现这一点,就已经是创新了。 创新的价值,不是完成多大的工作量,而是发现大量的新的有趣的研究工作可以提供给有兴趣的人跟进。所以,我认为,晓辉只是在创新,没有在做研究工作。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:29 探讨或启发: 我认为嘉文对“在下区分的义与意”的理解或赋值是一层意思,有道理,在约定范围内进行文本处理也可行。但是,不排除“在下区分的义与意”还有进一层的意思,也有道理,且在更大的范围内进行文本处理同样也可行。 以上是回复以下嘉文博主回复的第一句,接着再回复第二句,即:不知嘉文是否考虑过这样的情形——事实是会变化的因此它也会造成另一类歧义。 博主回复(2011-11-15 08:08): 对已知的用“义”,对未知的用“意”。这便是“意”“义”区分的由来。 没有不可理解的事实(纯语义),只有不可理解的说法(含语意和语义)。 博主回复(2011-11-15 09:02) : 人类是用“义”来沉淀战果,用“意”来谋求新的突破。 所以,我们对“义”要求严格,对“意”可宽容犯错。 博主回复(2011-11-15 08:42) : 最终回到了同一条战线:已知世界向未知世界发起进攻的前沿战线。这正是人类永恒不变的智力活动的根本任务。这条战线不是清晰的单线条的,不是每一个人,每一个团队都是平齐前进的,不是每一个人,每一个团队都是始终前进的,前前后后,进进退退,这条战线始终在向前推进。 博主回复(2011-11-15 08:36) : 晓辉,我考虑到了:变化本身就是事实的一部分,变化也有已知变化和未知变化。 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:31 关于合作, 提供一个晓辉的“黄金三角模型”图解: 愿望、能力和机会的关系(人才成长的黄金三角模型) http://kbs.cnki.net/forums/140508/ShowThread.aspx 博主回复(2011-11-15 08:20) : 现在回想,当时看到的HNC的基本思想,其实已经体现了将“已知和共知事实”部分语义做形式化处理的策略。从而剥离难以形式化处理的“未知和独知”部分的“语意”。剥离语义和语意的真正价值,就是剥离出了可形式化和不可形式化的语言的逻辑信息。 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:29 解读或提示: 从哲学方法论到科学方法体系 其中是由四类集合相互联系的。 从哲学方法论到科学方法体系 http://kbs.cnki.net/forums/140507/ShowThread.aspx !-- �༭/a--�ٱ� geneculture 2011-11-15 05:28 哲学上认为: 世界观和方法论是同一个问题的两个方面。 附(晓辉的一个研究成果图解): 从哲学方法论到科学方法体系 http://kbs.cnki.net/forums/140507/ShowThread.aspx !-- �༭/a--�ٱ� geneculture 2011-11-15 05:25 一锤定音,认可嘉文的这个判断或结论: 【晓辉转移到了词条含义的形形互证的语义上去了,引起了别人对晓辉不关心“逻辑语义”的误解。】 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:04 中国知网(刊载《软件》5、6、7、8、9五期电子版): http://www.cnki.net/kcms/detail/12.1151.TP.20110907.1007.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111004.1537.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1912.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1917.002.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1922.003.html !-- �༭/a--�ٱ� geneculture 2011-11-15 04:57 全文下载: 间接计算模型和间接形式化方法 http://www.ccomsoft.com/kanlist_c.asp?id=272 协同智能计算系统——理论模型及其应用 http://www.ccomsoft.com/kanlist_c.asp?id=306 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 http://www.ccomsoft.com/kanlist_c.asp?id=321 虚拟的孪生图灵机——以双语信息处理为例 http://www.ccomsoft.com/kanlist_c.asp?id=319 “云计算”概念的分析研究 http://www.ccomsoft.com/kanlist_c.asp?id=322 http://www.ccomsoft.com/pic.asp?id=253 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:55 可否这样来看? 软件工程学是介于工程融智学和应用融智学之间的一门学问。 软件工程学科何以独特——形式化方法的双重路径 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:51 回顾3: 应用融智学的“协同智能计算系统——理论模型及其应用” !-- �༭/a--�ٱ� geneculture 2011-11-15 04:49 回顾2: 工程融智学的“间接计算模型和间接形式化方法” !-- �༭/a--�ٱ� geneculture 2011-11-15 04:47 回顾1: 理论融智学的“三通”: 通论:四大类——物、意、文、理义法道 通则:两定律——第一和第二两信息定律 通式:两公式——广义和狭义的信息方程 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:42 再对好一点: “道”和“德”以及“经”其实分属三个基本类,即: “法”和--------------“文”, “义”和“意”以及“文”, “理”和---“物”及“文”。 博主回复(2011-11-15 08:08) : 对已知的用“义”,对未知的用“意”。这便是“意”“义”区分的由来。 所以,凡是“义”,必须是“开明尊”的,而“意”,则可以是“密而藏”的。 这样,对“义”就无从误解,对“意”,误解活该。 所以,会有我的这句话:没有不可理解的事实(纯语义),只有不可理解的说法(包含语意和语义)。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:38 再想一想: “道”和“德”以及“经”三个概念, 难道不正是: “法”和..................“文”, “义”和“意”以及“文”, “理”和.................“物”以及“文”, 可以这样来解读的吗? 当然, 事前的非显而易见 和 事后的显而易见性 给人的感受不一样。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:31 试想一想: 柏拉图“意义”概念难以区分“意”和“义” 亚里士多德“物理”概念难以区分“物”和“理”以及其“文法”概念难以区分“文”和“法” 这样的根本性问题, 难道不是非常重要的问题吗? 这不正是千年不遇的问题吗? 谁能在这一些列问题的解答上做出其独特的贡献,难道不是难能可贵的事情吗? !-- �༭/a--�ٱ� geneculture 2011-11-15 04:23 晓辉所解答的问题1和2以及引申问题, 其实可以说是以汉语为母语的人所能超越以英语(以及其它西方语言)为母语的人唯一或者说是少有的具有广阔前景的问题,思考并解决其中任何一个实质性的问题,哪怕是其中一个局部,都是十分难得的千年不遇的机会。其重要性不亚于任何举世闻名的国际难题,其唯一性也不亚于牛顿发现的万有引力定律和沃森发现的基因双螺旋特征以及地位与它们相当的其它科学发现。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:14 引出的问题: 晓辉认为:近现代乃至当代的英美分析哲学(语言学转向的几个发展)和德法大陆哲学(强调话语的主体间性的多向发展)之所以会对“语义”和“语用”乃至“功能语法”与“认知语法”等等众说纷纭的学问如痴如狂地追捧,乃至癫迷甚至畸形地发展,他们没有甚至不可能区分我前述两个问题(更别说它们的两个解答了)不能不说是其语言瓶颈。 至于说汉语的若干代人的广大学者为什么也没有认识到这两类问题的重要性,其中的原因是复杂的。何况,众所周知,融贯古今中西人文理工(这是解决所有超级复杂问题所必须具备的基本素质)的大学问者从来就极其罕见。晓辉十多年前在(广义和狭义的)融智学问探讨的过程中在理论上主要也只是提出了前述两个问题而已,至于近几年把重点放在了(狭义)融智学问及其实践上从而获得了一系列可喜的实质性进展——若干个显著的可验证且可操作乃至相对容易被协同智能计算系统重复使用的重要突破,也只是开启了(广义)融智学问巨大冰山的一角(充其量也只是几个角)——而其所蕴含的广大未知领域或未开垦的处女地还等待广大师生和众多的学人们共同去探索或开垦呢。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:46 解答问题2(续): 又如:晓辉还可在柏拉图“意义”概念难以区分“意”和“义”、亚里士多德“物理”概念难以区分“物”和“理”以及其“文法”概念难以区分“文”和“法”,这样的一些非常重要的根本性问题上做出独特的贡献。 相比之下,李耳(老子、老聃)“道德经”所述的“道”和“德”以及“经”三个概念都是可以明确地区分的。后来的解读者反而有不少人混淆了“道”和“德”两个基本范畴的本质区别,混淆两个字用法的就更是大有人在了。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:33 解答问题2: 在我看来,由于汉语“意义”可细分为“意”和“义”进且它们三者各自都可有其明确所指的三个不同的类,于是,这就具有了非同寻常的(词语本身的)含义和(晓辉所赋予的)用意。例如:晓辉就可在语言学之父索绪尔区分“语言”和“言语”的基础之上再向前推进一步区分“言”和“语”从而不仅可完成“语言”和“言语”的汉语文本的间接形式化,而且,在解决了汉语理论界百年争论的本位问题——2009年上海国际会议时最终集中到“字本位”与“词本位”之争的同时,也解决了普通语言学、形式语言学、程序语言学、计算语言学长期没有汉语地位的问题——这不仅对说汉语的人不公平而且对因为以往缺乏汉语理论研究突破而几乎都忽略了汉语和汉语理论应当在其中具有其独特地位的那几个基本的重要的普适的语言学分支本身也是一个缺憾。 问题2: 英语meaning翻译成汉语是意义,反之也成立。 但是,英语“meaning”是不能再细分的;而汉语“意义”不仅可以再细分为“意”和“义”而且它们各自都还可以有其明确所指的两个不同的类。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:16 解答问题1: 在我看来,因为英文单词Semantic说的就是语言的意义或词语的意义, 所以台湾人用“语意”而大陆人用“语义”来翻译都可以粗放地成立。 我强调“意”和“义”的区分也是针对上述这种不区分的粗放的混合, 但是我理解台湾人用“语意”而大陆人用“语义”来翻译的人文背景。 问题1是: 同一个英文单词Semantic台湾人用“语意”而大陆人用“语义”来翻译。这已经也成了惯例。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:04 因此, 语义和语意(不考虑台湾人的用法)的区分, 是可以用“求同存异,求异存同”来替代的。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:01 问题2: 英语meaning翻译成汉语是意义,反之也成立。 但是,英语“meaning”是不能再细分的;而汉语“意义”不仅可以再细分为“意”和“义”而且它们各自都还可以有其明确所指的两个不同的类。 !-- �༭/a--�ٱ� geneculture 2011-11-15 02:56 问题是: 同一个英文单词Semantic台湾人用“语意”而大陆人用“语义”来翻译。这已经也成了惯例。
个人分类: 双语信息处理|1510 次阅读|2 个评论
[转载]MATLAB GUI编程中几个有用的程序段
热度 1 onduty 2011-11-15 15:08
MATLAB GUI编程中几个有用的程序段 1、 启动 % 获取当前文件所在路径 currPath = fileparts(mfilename('fullpath')); % 切换工作路径到当前位置 cd(currPath); % 判断所用操作系统 if computer == 'PCWIN' % MATLAB版本号 v = version; if v(1)~='7' warndlg ('Only run in matlab 7.x(R14.x)'); return else % 添加当前路径下的所有子目录 addpath(genpath(pwd)); addpath(genpath(currPath)); end end 2、 在GUI中使用Axes控件 % 1.删除所有画线及对应图例 % 查找Axes控件中的画线 sameLines = findobj('type','line'); % 逐一删除这些画线 for i = 1 :length(sameLines) delete(sameLines(i)) end % 获取Axes控件中的图例(由于画线全部被删除,因此为空) lgStr = get(legend(handles.ResultsAxes), 'String'); % 重新设置图例(为空) legend(handles.ResultsAxes,lgStr); % 2.添加画线 % 获取原来的图例 lgStr = get(handles.hLegend, 'String'); % 设置下一个画线为添加方式 set(handles.ResultsAxes, 'Nextplot', 'add'); % 指定要画线的Axes axes(handles.ResultsAxes); % 画线 plot(distance_target, '-r') % 添加图例 handles.hLegend = legend(handles.ResultsAxes, lgStr,'目标距离'); % 3.删除某一画线 % 所删除画线对应的数据为distance_target,获取它的句柄 sameLines = findobj('type','line','YData', distance_target); % 删除画线 if ~isempty(sameLines) delete(sameLines); end % 获取原有的图例 lgStr = get(legend(handles.ResultsAxes), 'String'); % 从原有图例中删除对应图例 legend(handles.ResultsAxes, setdiff(lgStr, {'目标距离'})); 3、 在GUI中使用Excel表格(Activex控件Microsoft Office Spreedsheet) % 获取现在使用的spreedsheet的句柄 ActiveSheet = get(handles.activex1,'ActiveSheet'); % 现在使用的spreedsheet的现在使用工作薄 ActiveWorkbook = get(handles.activex1,'ActiveWorkbook'); % 现在使用的表 eSheets = handles.activex1.ActiveWorkbook.Sheets; % 使用表的第一个子表 eSheet1 = eSheets.get('Item', 1); % 激活该表 eSheet1.Activate; % 获取当前单元格的句柄 ActiveCell = get(handles.activex1, 'ActiveCell'); % 选择坐标为A1的单元格 Select(Range(ActiveSheet,'A1')); % 获取当前单元格的句柄 ActiveCell = get(handles.activex1, 'ActiveCell'); % 设置当前单元格中的内容 set(ActiveCell, 'Value', '仿真结果报告'); 4、 为Axes控件设置图片 % 所有设置的Axes控件 axes(handles.MyLog); % 读取图片数据 Image_tip1=imread('Setting/mylog.jpg'); % 显示图片 image(Image_tip1);
个人分类: Matlab|3372 次阅读|1 个评论
编程中数据处理的问题(三)浮点数运算与精度误差
andrewwang 2011-11-10 21:37
上篇博文提到了两种误差,“转换误差”和“舍入误差”。其实前者完全是因为我们只习惯用十进制的科学计数法,而计算机暂时又只能使用二进制,所以必须转换进制实现人与机器的数据互动。有要是有种外星人天生习惯用二进制思考问题,我想就没这个问题啦。Ha, joking! 这篇博文进一步探讨一下,机器具体怎么在运算中产生“舍入误差”,以及这种误差对数值计算算法有什么样的影响。首先是 机器精度E m ,这个概念很基础,但是时间长了容易模糊,只知道IEEE设计浮点数时使机器表示实数具有离散化的特性。有一种直观的理解方法就是:两个实数的差值小于 “它们平均值的E m 倍”的时候,这两个数在机器中就作为同一个数存储。 这种表述可以和浮点数的数轴标识对应起来。 If abs(A - B) (A + B)/2 *E m Then A == B in MACHINE; 一般在可以用这样的算法得到机器精度epsilon: epsilon = 1; loop = 0; maxloop = 100; while loop maxloop epsilon = epsilon/2; b = 1 + epsilon; if b == 1 break; end loop = loop + 1; end 如果实数的运算结果在机器精度表示的范围之外,那么就产生了舍入误差。 有两种情况舍入误差会造成较大的影响。一种是误差的累积,在许多(如几百万次)步骤运算后,微小的误差可能会累积产生对结果有明显的影响。另一种比较有趣,即便的步骤不多的运算,也有可能产生灾难性的误差。比如计算自然底数公式: e = Lim n-∞ (1 + 1/n) n 在计算时可以选择一个较大的数得到一个e的近似值。用一个较大的值n计算得到的近似值 f(n)和标准e值2.718281828459046 比较,得到误差error,无论用什么语言实现,结果都是类似的。下面是用8Bytes的float实现得到的数据(Intel Windows平台): n f(n) error 1.0e+000 2.0000000000 0.7182818285 1.0e+002 2.7048138294 0.0134679990 1.0e+004 2.7181459268 0.0001359016 1.0e+006 2.7182804691 0.0000013594 1.0e+008 2.7182817983 0.0000000301 1.0e+010 2.7182820532 0.0000002248 1.0e+012 2.7185234960 0.0002416676 1.0e+014 2.7161100341 0.0021717944 1.0e+016 1.0000000000 1.7182818285 可以看出n在10 8 的时候能到的最佳的近似值,而往后到10 16 的时候,误差竟然突增到灾难性的地步。虽然公式 e =(1 + 1/n) n 只有几步的计算,却产生了与理想情况巨大的误差。这是因为“1 + 1/n”的浮点加法在两个数相差很大的数量级的时候有很大的精度损失。8Bytes的浮点数拥有16位的十进制有效数字,因此当n=10 16 时,达到了有效数字的极限,1/n和1相比直接可以被忽略掉,结果自然也就是 1 了。 因此,浮点数运算有这样的特点“当 两个相差好几个数量级的浮点数相加 或者 两个几乎相等的浮点数相减时,舍入误差达到最大”。 另外在科学计算中经常被提起的误差来源于“用离散逼近连续函数”导致的截断误差(Truncation error),但是这种误差与机器本身和机器语言并没有关系,是属于算法设计中的问题。 研究机器运算的误差特点有两个用处,一个是在进行科学计算算法设计时能够有意识的想到这些问题,遇到问题也能够合理的分析;二是帮助我们更加熟悉面对的机器的特性,也是很有趣的过程。
2046 次阅读|0 个评论
编程中数据处理的问题(二)浮点数运算与精度误差
热度 2 andrewwang 2011-11-7 23:52
浮点数的运算误差主要来源于两个方面,“转换误差”和“运算舍入”。 所谓“转换误差”,先看一段C程序: float a = 0.65f;   float b = 0.6f;   float c = a - b; 此时c=0.5吗?运行结果其实是 0.0499999523,为什么?是我们输入十进制的0.65和0.6其实转换成二进制时为:   (0.65)10 = (0.101001100110011001100110011001100110011......)2   (0.6) 10 = (0.10011001100110011001100110011001100110011......)2 省略号就是无穷尽。而实际的存储只能是取前几位,造成转换误差。实际上我们输入十进制整数是能无误差转换成二进制,而小数却不一定(进制转换方法不详述)。 来看什么时候这个数字会无法表示呢?那么只有两种情形:    1) 幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。    2) 尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。 有意思的是,有时候有些不大的整数也有可能造成转换误差,比如:对一个单精度浮点数(4 Bytes)赋值“ 20014999”,由于这个数表示成浮点式二进制为(注意是按照浮点二进制转换,有别于整数二进制): 0 10010111 0011000101100111100 1100 从左到右三组数字分别是符号、幂指数、尾数。实际上,该尾数不是精确的,实际要是尾数位数足够的话,应该是 0011000101100111100 10111 注意看这个尾数,实际的尾数10111被舍入成1100。这样就造成了误差,此时这个浮点数变量实际存储的是“20015000”。 要是使用双精度的double(8 Byte)则可以精确表示,其二进制表示为: 0 10000010111 001100010110011110010111 0000000000000000000000000000 注意加亮的尾数的确保存了精度。 按照上一篇博客的理解,20014999这个数正好处在 “浮点数表示精度间隔的中间” 。单精度的float无法表示它。因为浮点数的精度不是平均分布的呢,和整数的均布不同,浮点数精度是“两头差,中间好”。 所谓“运算舍入”误差,这个十进制运算是一样的(代数运算对进制无偏向性)。1/3=0.3333333…… ,以及按照级数计算出得一些无理数如π=3.1415926549…… 。这种运算舍入误差在二进制中同样存在,因此带来精度问题。还有一些运算中的舍入误差跟特定的机器实现有关,比如可能出现在加减法中、乘法中(这在下一篇博文中会详细说明)。 总之浮点数至少最后一位是不精确的,甚至有些在一段运算过后可能产生较大的精度误差。 浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。一般在科学计算中浮点数的精度能够满足,不行就用double或者更多Bytes的扩展浮点类型。但是有些使用要注意,比如比较判断时,开头c代码中,判断 c==0.5 就会得到 false,因此一般使用 abs(c-0.5)=0.0001 。还有一些情况是金融货币领域,对数字要求精确,比如一个人存了15000000元,你不能说他存了14999999。这时候有一些其他的解决办法。比如 C#中提供了Decimal类型,VB中提供了Currency 类型,这些都是用很大的资源开销来处理精度,并不适合做科学计算,但是适合需要很精确的场合。
3316 次阅读|2 个评论
编程中数据处理的问题(一)浮点数与精度理解
andrewwang 2011-11-7 21:21
编程中一般处理两类数据:一类是简单的事务性的,如一些用于逻辑判断,一些小整数做跳转,等等;另外一些是用于科学计算的,往往在算法设计时要用到。第一类比较好理解。 在科学计算的中,数据的重要性在于数的表示范围和精度。总的来说,计算机中把数据分成两类,一类是整型Integer(包括用于表示字符的char),另一类是浮点型(包括float、double和一些扩展浮点型)。整形数据比较简单,也很好理解,历史上,CPU也是先从支持整型运算开始,后来才到支持浮点运算。 理解数据需要理解“数据在计算机中的表示方式”和“数据的显示”。前者是计算机中数据存储和处理的机制,后者是与人的交互。整型的存储表示很简单,就是一串0和1的组合,有n Byte(8n bits)的数据,可以表示0 — 2^(8n)-1 或者 ±2^(8n-1)-1 的范围。浮点数是另一种表示机制,简单说就是:一部分位表示底数,一部分表示指数,一位表示符号(具体表示方法IEEE有规定)。这样总的二进制有效位数是固定的,指数变化时,小数点在有效位之间浮动,从而可以表示非常大范围的数,在数据不是很大时(指数绝对值不大时),数据的精度也很高。以4 Byte的浮点数为例, 最大正数:(1-2^-23)*2^127, 最小正数:2^-129, 最大负数:-2^-129, 最小负数:-2^127。数据精度是“两头差,中间好”。 值得一提的是,CPU用于实现浮点数存储和运算的机制还是比较复杂的,但是我们只要理解到这一步,知道计算机能够实现浮点数所有正常运算就行了。 下一个问题就是“数据的显示”问题,由于计算机用得时二进制码、补码等形式存储处理浮点数,所以是很不直观的,往往一些大学里的考试题就是给你一串二进制的浮点数,要你把它化成十进制的科学计数法,经常要手算半天。因此,实际计算机在(显示器、语音)显示数据时是用的是人好理解的十进制科学计数法,这其中有从二进制数到十进制的转换。而最终软件显示数据时,还会根据用户的设置显示一定长度的精度。比如实际转换成十进制的浮点数可以有10位的有效数字,而软件只显示5位。 这里有一个问题,就是我们用户怎么方便的来使用程序中的数据。一种方法是直接把数据存成文本格式(ASCII码)这样我们查看数据时比较直观,但是有时候软件输出数据到文本格式时精度会有损失(无论是有意无意的);读取数据时,也是将ASSCII码转换成浮点形式进行运算。 另一种方法是,将数据直接存储成二进制形式,即数据在文件的存储和实际的浮点数表示是相同或者类似的。很多软件选择后者因为这非常方便,省去了与ASCII码转换等等麻烦。但是往往只有专门对应的软件才能读取这种数据了,因为文件中会加入软件特殊的控制信息。例如在matlab (based on Windows) 中,就可以将数据保存成 .txt 格式或者 .mat 格式,分别对应第一种和第二种方法。 总之理解浮点数的存储和运算,就要理解 “数据在计算机中的表示方式”和“数据的显示”这两方面。
1721 次阅读|0 个评论
遥感图像处理算法编程一定要注意的事
hujianbo 2011-11-3 22:03
遥感图像不同于一般照片,有的时候会很大很大。那么如果你是要做图像处理算法编程的。切记切记,一定要一开始就学好分块处理。否则,你的程序在小图像上可用,在大影像上直接报“内存不足”。目前,在推倒以前的程序重写中,基本上是全部重写! 面对那么多代码,一股悲壮的心情油然而生。
个人分类: 科教相关|6785 次阅读|0 个评论
[转载]单片机C51编程资料
热度 2 outcrop 2011-10-23 21:21
单片机 » 单片机C51编程资料 C51控制矩阵键盘 51单片机4X4矩阵键盘(查表法) - C51源代码 51单片机4x4矩阵键盘实验(计算法) - C51源代码 51单片机矩阵键盘按键键值显示程序 - C51源代码 51单片机矩阵键盘模拟电子琴 - C51源代码 C51控制 1602 液晶 1602 LCD 模块 是常用的液晶显示模块,相关介绍以及使用说明请参考 1602 LCD 。下面是相关的C51源代码: 51单片机1602LCD串行方式显示 - C51源代码 51单片机1602LCD计数显示实验 - C51源代码 51单片机1602LCD简单时钟显示实验 - C51源代码 51单片机1602LCD显示字符A - C51源代码 51单片机1602从右到左移动显示字符实验 - C51源代码 51单片机LCD1602 滚动显示 - C51源代码 51单片机LCD1602 移动显示C - C51源代码 51单片机LCD1602显示Welcome - C51源代码 51单片机LCD随机数字显示 - C51源代码 51单片机LCD循环右移显示Welcome to China - C51源代码 51单片机LCD液晶时钟程序 - C51源代码 C51控制 24C08 E2PROM 51单片机24C08断电记忆功能的00-99计时器 - C51源代码 51单片机24C08多花样流水等实验 - C51源代码 51单片机将按键次数写入AT24C08,再读出并用1602LCD显示 - C51源代码 51单片机将数据0x0f写入AT24C08再读出送P0口显示 - C51源代码 C51控制 DS1302 时钟电路 51单片机1602--DS1302时钟 - C51源代码 51单片机1602LCD-DS1302时钟实验 - C51源代码 51单片机DS1302数码管读取演示 - C51源代码 51单片机DS1302数码管显示时间日期可调 - C51源代码 C51控制 12864液晶 (带字库) 51单片机12864串行驱动演示 - C51源代码 51单片机12864图文显示测试 - C51源代码 51单片机12864中文显示测试 - C51源代码 C51控制 18B20数字温度显示系统 51单片机18B20与1602LCD温度实验 - C51源代码 51单片机18B20测温1602LCD显示 - C51源代码 51单片机18b20测温数码管显示实验 - C51源代码 C51控制红外接收 51单片机红外遥控解码 - C51源代码 51单片机红外接收1602LCD显示 - C51源代码 51单片机红外遥控解码数码管显示实验 - C51源代码 51单片机数码管遥控解码 - C51源代码 51单片机遥控解码通过电脑串口显示 - C51源代码 C51控制串口通讯 51单片机串口测试程序 - C51源代码 51单片机串口向PC及发送字符 - C51源代码 C51控制单片机外部中断实验 51单片机外部中断计数2位数码管显示 - C51源代码 51单片机外部中断计数器 - C51源代码 C51控制8X8点阵 51单片机8X8点阵测试实验 - C51源代码 51单片机8X8点阵滚动显示 - C51源代码 51单片机8X8点阵滚动显示温度 - C51源代码 51单片机8X8点阵上下滚动显示 - C51源代码 C51控制超声波测距 51单片机21-超声波测距实验 - C51源代码 C51控制步进电机 51单片机步进电机加速减速匀速演示 - C51源代码 51单片机步进电机正反转调速1602显示 - C51源代码 51单片机步进电机正反转停止实验 - C51源代码 C51控制直流电机 51单片机直流电机PWM调速实验 - C51源代码 51单片机直流电机正转反转停止实验 - C51源代码 C51控制数字编码开关 51单片机控制数字编码开关 - C51源代码 51单片机控制数字编码开关LED显示 - C51源代码 C51控制 PCF8591 AD转换实验 51单片机PCF8591 AD转换实验 - C51源代码 51单片机PCF8591 DA转换实验 - C51源代码 C51控制PS2接口 51单片机PS2键盘解码实验 - C51源代码 51单片机PS2鼠标控制实验 - C51源代码 C51控制无线遥控接收模块实验 51单片机无线遥控接收模块实验 - C51源代码 C51控制单片机综合实例 51单片机PC与单片机双向通讯智能温控程序 - C51源代码 51单片机-VB遥控播放器红外遥控解码 - C51源代码 51单片机-VB控制继电器实验 - C51源代码 51单片机VB上位机控制LED灯程序 - C51源代码 51单片机VB串口继电器控制实验 - C51源代码 51单片机VB控制4X4控制系统 - C51源代码 51单片机VB上位机控制数码管 - C51源代码 51单片机0-9999每秒加1计数器 - C51源代码 51单片机1602、18B20、DS1302电子时钟源程序 - C51源代码 51单片机1602、18B20电子钟 - C51源代码 51单片机1602、24C08、4X4键盘密码锁 - C51源代码 51单片机12864 18B20温度计(串行方式显示) - C51源代码 51单片机12864、DS1302时钟、18B20温度计 - C51源代码 51单片机PWM控制LED灯渐亮渐灭实验 - C51源代码 51单片机功能完整的1602LCD时钟实验 - C51源代码 51单片机交通灯 - C51源代码
个人分类: 机电工程|4942 次阅读|3 个评论
题目:《编程的两种基本思路之比较》
geneculture 2011-10-16 16:18
题目:《编程的两种基本思路之比较》 摘要: 关键词:编程语言;对称矩阵;双语编程 框架: 0.引言 0.1.目的 0.2.背景 0.3.意义 1.基于现有编程语言来进行单语编程 ——如:基于英语的编程语言 2.基于创新对称矩阵来进行双语编程 ——如:基于一系列双列表【即那一对(即左右)矩阵】可采用母语(如汉语)参与编程的做法 3.单语编程与双语编程的区别和联系 ——如:基于左右对称矩阵可采用母语(如汉语)编程的做法与基于现有编程语言来编程的做法之间的区别和联系 4.结论 致谢 参考文献 附录0: ZouXiaohui 12:19:44 我想的是更进一步,即:不仅要把我那两篇的内容加进去作为有力证据,而且,还要把现有的编程思路及其典型例子也加进去作为另一方面的有力证据,通过理论分析和实际比较,让读者自己来判断两种编程基本思路的特点及其对母语是非英语的编程人员以及不懂编程语言的广大普通用户的重要意义。 ZouXiaohui 12:24:11 这样,才可能引发一场计算机编程或软件设计的巨大变革,进而可带来软件产业的重新洗牌——给母语是非英语的编程人员以及不懂编程语言的广大普通用户参与软件市场竞争的公平机会或应有的主动地位。 附录1: ZouXiaohui 12:31:46 从我昨天在交大的报告和交流相当成功的情况来看,大家都逐步开始认识到:软件产业和软件工程正在生着一场基于“第三脑”(本质上是第三智)的革命——它已经由《软件》第5期和第6期刊载的我那两篇论文拉开了序幕,许多师生(它们都是学计算机软件研究生)都已经表现出激动不已和跃跃一试——希望加入进来。 ZouXiaohui 12:32:47 因此,大家对我讲对称矩阵这一块普片都能理解。 附录2: ZouXiaohui 12:48:24 提示:“对称矩阵”引出“双语编程”进而超越(现有的几乎所有的)“编程语言”的单语编程。你现在明白了吗?这就是在软件编程方面来看《软件》第5期和第6期的一个具有革命意义的知识创新——“对称矩阵”+“双语编程”>>(现有的几乎所有的)“编程语言”+“单语编程”。 附录3: a 提纲(略) b 创新——“对称矩阵”+“双语编程”>>(现有的几乎所有的)“编程语言”+“单语编程” 用例子和比较来论述上述创新的作用和意义 c 引用——《软件》第5期和第6期——打上引号,注明出处;引用其他人写的论著也都要这样。
个人分类: 双语信息处理|1 次阅读|0 个评论
软件工程基本路径的拓展,为何可带来软件产业的重新洗牌?
geneculture 2011-10-16 14:14
软件工程基本路径的拓展,为何可带来软件产业的重新洗牌?
说明:以下就是我昨天报告正文部分的三组图解。
个人分类: 《软件》杂志|2025 次阅读|0 个评论
[转载]一个很好的介绍算法和总结各大公司面试题目的csdn博客
热度 1 shixuanlv305 2011-10-12 14:49
博客地址: http://blog.csdn.net/v_JULY_v 本文转自: http://blog.csdn.net/v_JULY_v/article/details/6697883#comments 重启开源,分享无限--诚邀你加入微软面试187题的解题中 前期回顾 我想,只要是稍微浏览过我博客的朋友都知道,本博客内总体上大致分为两个部分的内容:1、 算法 (如十六个经典算法研究系列);2、 面试与编程 (涉及到微软面试100题系列,程序员编程艺术系列,海量数据处理面试题集锦等等)。从开博至今,大概10个多月之久,本博客内至始至终都是围绕着这两条主线“算法”和“面试”而创作各类文章,也正因为这两方面的内容,我才因此有幸认识全国各地的普天下的朋友。 从去年的10月初开始整理微软,google等各大公司的面试题起,陆陆续续的整理了187道面试题目(微软面试100题+微软面试100题第二版70题+海量数据处理面试题17题,共187道面试题目), 微软等数据结构+算法面试100题全部出炉 1206 http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx 微软100题V0.2版第 1-60题: 微软、谷歌、百度等公司经典面试100题 微软100题V0.2版第61-70题: http://blog.csdn.net/v_JULY_v/archive/2011/04/10/6313257.aspx 。 十道海量数据处理面试题与十个方法大总结 17道海量数据处理的面试题: 海量数据处理面试题集锦与Bit-map详解 然后发帖和众多网友一起做这些面试题,把我们各自的思路或答案全部回复到下述帖子上(后来,我们把这些答案和思路整理成了文档上传到了我的资源下载处,请看下文): 横空出世,席卷Csdn:记微软等100题系列数次被荐 11.26日 http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html 紧接着,我便开始把我自己和众多网友的思路和答案开始整理成文档上传至我的资源下载处(现在,基本上每份面试题的资料都是1000-3000人以上的下载量), 微软面试100题资源下载处: http://v_july_v.download.csdn.net/ 。 后来,当我整理完微软面试100题中的 第1-60题的答案 后(是的,目前为止,只整理完成了前60道题目的答案,正待你我共同完成余下题目的答案),发现其中很多题目的答案有问题,我便做起了微软面试100题的勘误与修订工作,发布在本博客内: 永久优化:微软技术面试100题第1-10题答案修正与优化 http://blog.csdn.net/v_JULY_v/archive/2011/03/25/6278484.aspx 。 永久优化:微软技术面试100题第11-20题答案修正与优化 http://blog.csdn.net/v_JULY_v/archive/2011/04/04/6301244.aspx 。 除此之外,我还意识倒这些面试题目中的每一道都值得重新求解,继续深究下去。于是,我便把这100题中某些值得进一步探究与商榷的题目提取出来,重新研究与解答,从此,程序员编程艺术系列横空出世。在编程艺术系列中,每一道题的解答不再只是紧紧提供答案,而是多种思路选取,多种方法解答,不断寻求更好的思路,更有效率的算法实现,由此,我们算是升华了这100题。此编程艺术系列详见: 程序员编程艺术系列 关于这微软面试100题的更多详情,请参见此文: 横空出世,席卷Csdn--评微软等数据结构+算法面试100题 。 重启开源 从来没有一项事情能汇集到如此众多的网友一起参加解题,众人分享各自的思路,共同享受思考的乐趣;从来没有一项事情能惠及到如此众多的朋友,包括学习编程的学生,即将要面临毕业找工作的人,以及准备去各个公司面试的朋友,众人一起努力学习,共同享受开源所带来的利益。 意义重大,造福深远 。 一年一度的校园招聘与面试热潮再度即将来临之际,我本人诚挚邀请全天下,全国各地的朋友,来继续参加这微软面试100题的解题中,加入我们的学生,老师,上班族,研究人员等各种人才组成的浩荡队伍中。 只要你有一定的时间,有一定的兴趣,有一定的激情,当然,也有一定的目的(或是为了准备面试,或是为了学习编程, 哪怕是工作之外,空闲之余,闲时拿一道面试题目来动动脑子,练练编程也好 ),我们就欢迎您跟我们来一起做这微软面试100题,一起享受解题和思考,开源与分享的无限乐趣,以帮助你我,造福天下。 如果你已下定决心,不论你是何种身份,出于何种目的,你想见识或做做这187题道题目,我告诉你接下来,该怎么做: 首先,找到这 187道面试题目的原题 : 微软等数据结构+算法面试100题全部出炉 12.06 http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx 微软100题V0.2版: 微软、谷歌、百度等公司经典面试100题 微软100题V0.2版第61-70题: http://blog.csdn.net/v_JULY_v/archive/2011/04/10/6313257.aspx 。 十道海量数据处理面试题与十个方法大总结 海量数据处理面试题集锦与Bit-map详解 其次, 下载答案 :请到我的资源下载处下载: http://v_july_v.download.csdn.net/ (下载第1-60题的答案)。 微软等数据结构+算法面试100题 2011、01、04 http://download.csdn.net/source/2959162 7. 微软等数据结构+算法面试100题 http://download.csdn.net/source/2832862 8. 精选微软数据结构+算法面试100题 --修正 http://download.csdn.net/source/2813890 //注:答案,仅仅只作为思路参考。 由于之前上传的部分答案是有问题的,所以,你还要关注 答案的修订 (即答案的修正与优化)与题目的 进一步探究 (即程序员编程艺术系列文章)两个方面: 永久优化:微软技术面试100题第1-10题答案修正与优化 http://blog.csdn.net/v_JULY_v/archive/2011/03/25/6278484.aspx 。 永久优化:微软技术面试100题第11-20题答案修正与优化 http://blog.csdn.net/v_JULY_v/archive/2011/04/04/6301244.aspx 程序员编程艺术第一~十章集锦与总结 第4步: 如果你对以上微软面试187题中的任何一题有任何想法,请把你所有的思路或解答发表到此帖子上 : 横空出世,席卷Csdn:记微软等100题系列数次被荐 11.26日 http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html 最后,请感受我对你的致谢。因为,我本人目前正在创作两本 书 ,其中一本便是有关面试与编程的书(至于最后是否能出版还不一定),而如果各位的思路和解答比我目前所能想到的更好的话,那么,我将在后续的答案修订和勘误中采取你的思路,最终在我的书籍的感谢一栏上荣幸的添加你的名字,聊表谢意。 能在网上找到有意义的事情并不多,而如此能帮助到千千万万的初学者,和即将要找工作而参加面试的人的事情更是罕见。希望,你也能参与进我们之中来,一起来做这微软面试187题,一起享受无私分享,开源,思考,共同努力,彼此交流,探讨的诸多无限乐趣。谢谢大家。 注 : 希望参与进来做这些微软面试题目的朋友不是抱着极度想进微软等公司的目的而来的。我们常说,苦苦追功功不成,无心插柳柳成荫。所谓功到自然成,相信,不用多说,聪明的你,明白这个道理。:)。 你可以永久在百度或谷歌中搜索本博客名称的前4个字,即:“ 结构之法 ” 这4个关键字,即可进入本博客。 July、2011年8月18日启。
个人分类: 编程|9086 次阅读|1 个评论
[转载]Matlab 指针 pointer 的 使用【转】
innocent2010 2011-10-6 00:41
指针是一种比较难以驾驭的工具。像是老郭这样的编程菜鸟使用指针,稍有不慎轻则内存泄漏,重则直接蓝屏,真是杯具。还好老郭喜欢的Java语言一开始就杜绝了指针的使用。Matlab也杜绝了指针,所以大家在网上只能搜到零零星星的介绍。 有一些万不得已非要使用指针的情况,譬如变长数组:老郭有100个矩阵,要分别求他们的奇异值分解,但是这100个矩阵大小不一样,怎么样编写循环呢?这 就要用指针了。注意matlab拒绝将指针跟双精度数字混为一谈,所以如果用a来存储这100个矩阵,就要事先清空a,命令是 clear a 接下来,写循环命令储存矩阵: a(i)=libpointer('doublePtrPtr',rand(6)); 循环的那些for神马的,此处略去。这里'doublePtrPtr'是数据格式,double就是double,一维数组用doublePtr,三维用 doublePtrPtrPtr,以此类推。rand(6)是矩阵,下一个循环单位可以写rand(4)都可以。这是储存的步骤,读取的步骤是: get(a(2),'Value') 就返回我们刚才存进去的第2个矩阵。'Value'是浮云,放在那里,不解释。 值得注意的是Matlab的这个机制本来是设计用于跟C等等语言做交互的。我们这里滥用一下。如果您想了解更多,查阅Matlab手册就行
5057 次阅读|0 个评论
[转载]22条经典的编程引言
hzkvictory 2011-9-21 15:01
下面的这些经典的引言来自英文,也许有些我翻译的是不很好,所以,我提供了中英对照,如果有问题,请大家指正。 过早的优化是万恶之源。Premature optimization is the root of all evil! - Donald Knuth 在水里行走和以一个需求规格进行软件开发,有一点是相同的,那就是如果水或需求都被冻住不了,那么行走和软件开发都会变得容易。Walking on water and developing software from a specification are easy if both are frozen - Edward V Berard Hofstadter 定理:“一件事情总是会花费比你预期更多的时间,就算是你已经考虑过本条 Hofstadter 定理”。It always takes longer than you expect, even when you take into account Hofstadter’s Law. - Hofstadter’s Law 有些遇到问题的人总是会说“我知道,我会使用正则表达式”,那么,你现在有两个问题了。(意思是:你本想用正则表达式来解决你已有问题,但实际上你又引入了“正则表达式”的一个新问题)Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems - Jamie Zawinski 调试程序的难度是写代码的两倍。因此,只要你的代码写的尽可能的清楚,那么你在调试代码时就不需要那么地有技巧。Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. - Brian Kernighan 用代码行来衡量开发进度,无异于用重量来衡量制造飞机的进度。Measuring programming progress by lines of code is like measuring aircraft building progress by weight. - Bill Gates PHP被一些不合格的业余人员造就成了一个小恶魔;而Perl则是被一些熟练的但不正当的专业人员造就成了一个超级大恶魔。PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals. - Jon Ribbens 在两个场合我被问到:“请你告诉我,如果你给机器输入了错误的数字,那么,是否还能得到正确的答案?”我并不能正确领会这类想法。(意思是:程序需要有纠错的能力吗?)On two occasions I have been asked, ‘Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?’ I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.” - Charles Babbage 在编程的时候,我们一定要想像一下,以后维护我们自己的代码的那个人会成为一个强烈的精神病人,并且,他还知道我们住在哪里?Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. - Rick Osborne 现代的编程是“程序员努力建一个更大更傻的程序”和“世界正在尝试创造更多更傻的人”之间的一种竞赛,目前为止,后者是赢家。 Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. - Rich Cook 我才不关于我的代码是否能在你的机器上工作!我们不会给你提供机器。I don’t care if it works on your machine! We are not shipping your machine! - Ovidiu Platon 我总是希望我的电脑能够像电话一样容易使用;我的这个希望正在变成现实,因为我现在已经不知道怎么去使用我的电话了。I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone. - Bjarne Stroustrup 计算机是一种在人类历史上所有发明中,可以让你比以前更快地犯更多的错误的发明,同样,其也包括了“手枪”和“龙舌兰酒”这两种发明的缺陷。A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila. - Mitch Ratcliffe 如果调试程序是一种标准的可以铲除BUG的流程,那么,编程就是把他们放进来的流程。If debugging is the process of removing software bugs, then programming must be the process of putting them in. - E. W. Dijkstra 教一群被BASIC先入为主的学生,什么是好的编程风格简直是一件不可能的事。对于一些有潜力的程序员,他们所受到的智力上的伤害远远超过了重建他们的信心。It is practically impossible to teach good programming style to students that have had prior exposure to BASIC. As potential programmers, they are mentally mutilated beyond hope of regeneration. - E. W. Dijkstra 理论上来说,理论和实际是一样的。但实际上来说,他们则不是。In theory, theory and practice are the same. In practice, they’re not. - Unknown 只有两个事情是无穷尽的:宇宙和人类的愚蠢。当然,我现在还不能确定宇宙是无穷尽的。Two things are infinite: the universe and human stupidity; and I’m not sure about the universe. - Albert Einstein Perl这种语言就好像是被RSA加密算法加密过的一样。Perl - The only language that looks the same before and after RSA encryption. - Keith Bostic 我爱“最终期限”,我喜欢“嗖嗖嗖”的声音就像他们在飞一样。I love deadlines. I like the whooshing sound they make as they fly by. - Douglas Adams 说Java好的是因为它跨平台就像好像说肛交好是因为其可以适用于一切性别。Saying that Java is good because it works on all platforms is like saying anal sex is good because it works on all genders - Unknown XML就像是一种强暴——如果它不能解决你的问题,那只能说明你没有用好它。XML is like violence - if it doesn’t solve your problems, you are not using enough of it. - Unknown 爱因期坦说,自然界中的一切一定会有一个简单的解释,因为上帝并不是反复无常和独裁的。当然,不会有什么信仰能程序员像爱因期坦那样感到舒服。 Einstein argued that there must be simplified explanations of nature, because God is not capricious or arbitrary. No such faith comforts the software engineer. - Fred Brooks
个人分类: spacetime|2280 次阅读|0 个评论
[转载]OpenMP并行编程1
ywmucn 2011-9-4 21:25
转载自: http://vastars.info/parallelcomputing/openmp.html 距离上次写 并行计算概述 很有段日子了,后续的可能至少有三篇文章需要写。今天花了点时间针对Openmp共享内存的并行编程写了点东西。这里只能提供一点概念和感觉(甚至有可能会误导),需要系统学习Openmp并行计算的朋友可以到文章末尾下载推荐的教材。个人觉得把那书翻翻就足够用啦~ 什么是OpenMP? “ OpenMP (Open Multi-Processing) is an application programming interface (API) that supports multi-platform shared memory multiprocessing programming in C, C++ and Fortran on many architectures, including Unix and Microsoft Windows platforms. It consists of a set of compiler directives, library routines, and environment variables that influence run-time behavior. ” 简单来说,OpenMP是一个可以应用于多种平台的共享内存式并行计算的接口。 Openmp的工作模式: Openmp的工作模式为串行-并行-串行…。一开始的主线程是串行,当在需要并行的时候(这时候程序中应该有相应的Openmp指令语句),多个线程开始一起工作。若当前的并行块结束(仍旧由相应的Opemp指令语句来控制)时,又重新回到单一的主线程。如此可往复继续。在一个四核心cpu上运行Openmp程序(并行块的线程数默认是核心数目,这里即为4个线程),程序处于主线程时cpu利用率为100%,但是当程序进入并行块时所有的核心都会参与进来,cpu利用率会达到400%。如果程序的主要运算部分都处于并行区域,则绝大部分时间cpu都处于400%的工作状态,这样便大大提高cpu的利用率。 Openmp程序的结构: 正如上面所说,编写Openmp程序只需要在已有的串行程序上稍加修改即可:在并行开始和结束的地方加上Openmp语句引导并行的开始和结束。这些引导语句本身处于注释语句的地位,必须在编译时加上Openmp并行参数才能使其生效。如果不加编译参数,编译出来的程序仍旧是串行程序。 Openmp是最容易实现的并行方式。 Openmp程序的编写: 下面以fortran语言为例说明Openmp程序的编写(对c语言和fortran语言,都可以参考本文最后给出的openmp教程)。一般的格式为 !$omp parallel CLAUSE !$omp DIRECTION !$omp end DIRECTION !$omp end parallel 其中 DIRECTION 是Openmp指令,有sections,do等,指定并行行为。中间的 即是需要并线的程序块。除了上面的称为 DIRECTION 的指令语句外,Openmp还需要称为 CLAUSE 的从句对并行进行限制和说明。比如,需要对私有变量进行声明时就需要用到private从句(这是经常要遇到的,后面会以例子说明)。在fortran的串行编译下,以“!”打头的都处于屏蔽状态是不起作用的。加了openmp编译参数后才会生效。 我在程序编写中用到最多的是do指令,偶尔用一下sections。do指令通常用来并行化do循环。本来用一个线程来执行的长的do循环被分割成几个部分让多个线程同时执行,这样就节省了时间。sections指令通常用来将前后没有依赖关系的程序块(也即原本不分先后,你换下顺序也无所谓)并行化。因为无关联,所以可以同时执行。 可以说,若程序主要用来做计算,掌握了do和sections这两个指令足矣! 简单的程序例子: 1.Sections 指令的应用: !$OMP PARALLEL SHARED(A,B,C), PRIVATE(I) !//Paralell块开始 !$OMP SECTIONS !//Sections开始 !$OMP SECTION !//第一个section DO I = 1, N/2 C(I) = A(I) + B(I) END DO !$OMP SECTION !//第二个section DO I = 1+N/2, N C(I) = A(I) + B(I) END DO !$OMP END SECTIONS NOWAIT !//Sections结束 !$OMP END PARALLEL !//Paralell块结束 这个并行语句将本来从1到N的循环手动分为两个部分并行执行。上面的shared,private就是从句(clause),声明A,B,C为公有的,而循环指标I是私有的。因为两个section同时执行,都会对I进行改变,所以两个section的循环指标必须彼此独立,不能是同一个变量。PRIVATE会自动将这个会引发冲突的变量按需生成多个拷贝以供使用。最后的!$OMP END SECTIONS NOWAIT语句告诉两个线程可各自自行结束,无需相互等待。 2.Do 指令的应用: 上面用Section实现的功能完全可以用Do来实现: !$OMP PARALLEL SHARED(A,B,C), PRIVATE(I) !//Paralell块开始 !$OMP DO !//Do的并行开始 DO I = 1, N C(I) = A(I) + B(I) END DO !$OMP END DO !//Do的并行结束 !$OMP END PARALLEL !//Paralell块结束 Do循环本来是从1到N,现在有多少个线程就分为多少个部分执行,比上面的section更方便智能。不用担心循环次数N不能被线程数整除~。一般情况下,各个线程均分循环次数,但是在某些循环指标下运算可能比较快,所以各个线程的运算时间可能不尽相同。这时候如果需要让各个线程都结束了才能再往下(没有NOWAIT),快的线程就必须等待慢的线程。为了解决这个问题需要加上schedule从句,首行变为如下: !$OMP PARALLEL SHARED(A,B,C), PRIVATE(I), SCHEDULE(DYNAMIC) 这个SCHEDULE(DYNAMIC)从句告诉程序动态调整并线方式,那些任务轻松运算快的线程会自动去帮任务重运算慢的线程,力争所有线程同时完成任务。 关于Do的积累计算,如累加,需要加上REDUCTION从句: C=0.d0 !$OMP PARALLEL SHARED(A,C), PRIVATE(I), REDUCTION(+:C) !$OMP DO DO I = 1, N C =C+ A(I) END DO !$OMP END DO !$OMP END PARALLEL 这里将累加分为几个部分由多个线程进行运算,由于各个线程都在0.d0的基础上开始计算它该算的部分,所以最后必须将各部分计算的结果再次求和。 REDUCTION(+:C) 从句就实现了这个效果。类似的叠乘等等用类似写法,只需把“:”前的运算符改为乘法“*”即可。 一些注意问题: 1.尤其要注意的问题就是变量的私有和公有问题。其实只要把握好一个原则,即如果这个变量有可能会被不同的线程同时进行写操作(这不是你希望看到的),则这个变量就应该声明为私有。一般来说,并行体中临时用到的一些中间变量应该是私有的。 2.据我的经验,Fortran中如果不特别声明,变量都是默认公有的。这一点可以用DEFAULT(PRIVATE/SHARED)从句强行改变。循环指标默认是私有的,无需自己另外声明。放在common域中的变量都是全局的,若要将这些全局变量私有化,可使用threadprivate指令(参见文章: OpenMP并行编程:threadprivate指令 )。 3.并行引导语句可以简化,但要注意前后配对。比如上面那个累加的例子可以这样写: C=0.d0 !$OMP PARALLEL DO SHARED(A,C), PRIVATE(I), REDUCTION(+:C) DO I = 1, N C =C+ A(I) END DO !$OMP END PARALLEL DO 也即可以将从句加在指令之后。 4.Fortran+Openmp的编译问题: 一般来说,加上-openmp编译参数即可。如: ifort -openmp -o exe.out main.f gfortran用-fopenmp编译参数,g77和ifort一样用-openmp参数。 如果用Makefile,将编译参数放在合适的地方。 5.对于多重do循环,如果中间变量太多,对私有公有弄不清楚或者虽然清楚但是闲麻烦,可以保留最外层循环,将里面的循环在别处写成一个子函数或子程序 ,然后在此处调用。这样从结构上看就是对一重循环进行并行化,条理清楚不容易出错。当然,传递给子函数或子程序的参数一般是要声明私有的。 6.将串行程序改为Openmp并行程序后,在加与不加-openmp编译参数的情况下分别编译并运算,比较并行与串行的结果,确保并行块没有改错。 7.可以在并行开始前指定由多少个线程来并行。在单cpu单核心的机器上也可以(虽然没有实际意义,但可以用来调试并行程序): CALL OMP_SET_NUM_THREADS(scalar_integer_expression) 其中scalar_integer_expression是个整形变量,指定并行的线程数目。 8.Openmp对私有变量的大小有限制。所以当遇到这样的情况,一般就是由这个限制造成的:不加openmp并行时程序没有问题,加了openmp并行时出现断错误(segmentation fault),但是当把某个(一些)私有数组的维数变小时,段错误消失而且和串行时结果一致。 解决办法(linux下,windows下另外search)如下: 在linux终端执行 ulimit -s unlimited ;export KMP_STACKSIZE= 2048000
个人分类: 编程|6513 次阅读|0 个评论
即将开学 心中充满期待
AegeanSea 2011-8-31 22:14
从六月底到现在两个多月,一直呆在家里。导师分配的任务也没有完成,但是却涉猎一些更为感兴趣的其他东西。 刚回来时,信誓旦旦地说自己要好好看论文,好好学英语,好好练习编程,好好看《信号与系统》。开始的一段时间自己确实是花时间努力做这些事,但是慢慢地发现自己定的任务在家时多么难以完成。难道自己的定力太差了?还是自己的脑子太笨?最后我给自己找了一个强大的理由~~没有纸质书,只有电子书。现在我不得不说,暑假看了有1000+页的电子书,眼睛真的受不了。 后来自己又努力地
个人分类: 生活感想|0 个评论
关于学习JAVA语言知识的一点体会
yjercou 2011-8-27 16:15
1 次阅读|0 个评论
我与三十多门语言的爱恨情仇(3)——机语
热度 7 xuyingxiao 2011-8-26 08:59
0. 引子 人语——英语:期望很高,读书时投入很多,工作以后得到的回报也很多;但是其实我深深地知道,英语永远无法像母语那样成为我生命中自然而然的一部分;但我更深深地知道,即使明知没有希望得到英语的垂青,也明知对英语无法像对母语那样产生发自心底的爱,但我仍旧不可能离开英语,只能无怨无悔地继续投入,别无选择。也正因为如此,总会有种幽怨不时地飘过。 图语——UML:不离不弃,在最失落的时候给了我回光返照的安慰,但却始终未能修成正果。人生难免不如意,只是想起来总会有些遗憾。 图语——机械制图:曾经的深爱,还到图书馆自学了几本更深入的教材,为各种精巧的设计惊叹不已。但一切属于单恋,“我本有心向明月,奈何明月照沟渠”。就像寒门小伙难娶富家千金,要把我的各种想法和设计变成现实,门槛太高,这也使得我最终彻底放弃,转向了计算机,转向了一样给我带来种种惊叹的程序设计。计算机貌似豪门,其实一旦拥有,就只需要一点电费就能没有成本地实现各种新奇的梦想了。俺的眼光还是蛮准的,尽管刚工作时的几年计算机仍旧属于稀缺资源,到了今天,很多手机都赛过那时的计算机了,更何况学校机房也向学生免费开放。 机语——编程语言是计算机所用的语言,学了很多编程语言,情形各不相同。有的是包办婚姻,先结婚再恋爱。有的是利益型婚姻,皆为利往。有的是心怀不轨,奔着A去追B。有的是跟随潮流,跟着大家一起追大众情人。年轻时追求各种不同的语言,有机会就自学新语言,以后想感情归一了,却已停不住脚步,现实的无奈还是让自己继续不断地学了各种各样新的编程语言。所幸的是,计算机的世界很单纯,只要追求,都可以上手。只是有些付出很少,得到很多;有些付出了很多,却只是满足了一下自己的兴趣。 其实在国内搞编程的大都各种语言通吃,不像老外,几种语言就可以做一辈子。不过话说回来,其实编程语言都不难,学到后面大同小异,相近的语言花个半天看一下就可以上手了,难的是学习各种不同的开发工具、各种不同的程序库和框架以及设计中的各种思想,那可是如汪洋大海永无止境。 简单点,就单单回忆一下编程语言吧。 1. Basic语言——计算机算命 本科时学院有个计算机四年不断线的理念,就是每年开一门计算机相关的课程。Basic语言是第一门,也因为这门课程,第一次有机会去计算中心“上机”。 其实那时上机的机会很少,只够把自己的作业挑几个输入进去运行一下。大部分时间在纸上写程序,但从来没有机会去运行一下看看效果。考试则全部靠背,我背了个最高分:98分。 读研究生时,南京街头流行计算机算命,有同学弄了个程序来,我们在Quick Basic中跑一下自己给自己算命。看了一下代码,大部分是if…else…语句,就知道计算机算命是多么不靠谱,唯一有点技术含量的是根据你的出生日期算出来你已经活了多少天了,算命本身则全看编程序的想打印什么给你看。 2. Fortran语言——牛顿下山 Fortran是学院安排的第二门计算机课程。当时的主流思想是:学Basic入门,但工科要用数值计算,必须学Fortran才行。不过说实话,我对学Fortran已经没有多少印象了,因为之后就没多少机会来用。 只记得后来学数值计算和算法分析时是用的Fortran,那时对用牛顿下山法解数学方程感到很震惊——竟然可以在一个区间用二分法不断地猜结果来计算方程的近似解!和学数学课时完全是不同的思路,解法很暴力,明显不像数学那么准确,但确实又能解决问题、能达到工程所需要的精度。那时另一个让我惊讶的是,对于设计得不好的工程计算,小数点后N位相差一点点,竟然会层层放大,最终结果会有天壤之别。不过那时我显然没弄懂为什么让我们学这个,导致的后果是我对任何计算出来的结果都不知道该不该相信。 3. Pascal语言——宇宙延伸一倍的欣喜 印象中,Pascal是自学的。之所以学它是因为自己选了一门叫《数据结构》的公共选修课,而那时的数据结构教材都是用PASCAL作为例子来讲解的。之所以选《数据结构》这门课程,用选修课老师的话来说:这么点时间其实学不了什么东西,大家其实都是来混机时的。确实,那时大家都喜欢去上机,但没有机会,只有选了计算机相关的课,才能得到几个小时的上机机会。老师在有限的时间里只教了链表、堆栈等,最后的大作业是编程序计算逆波兰表达式。 学Basic、Fortran、Pascal,其实都在同一个层次学习,学到后面就会发现大家都差不多,都是变量、分支、循环、数组、文件之类的。那时虽然对编程序很痴迷,但实际上做的其实都是很简单的计算,自己在图书馆找了本趣味程序集,里面大部分也是把各种现实问题数学化后靠循环、判断来解决。时间久了,对着小型机的终端就会感觉不知自己还能编些什么有意思的程序。 在这百无聊赖的时候,忽然间数据结构向我揭示了另外一篇天空:当一块块数据按照各种方式链接在一起后,就可以充分发挥你的想象力,做出各种奇妙的事情。我和这些数据打了这么久的交道,怎么就没想到把它们链接在一起呢? 这个感觉,就像你呆在屋子里过了几年正无聊的时候,不小心触碰了身边的一堵墙,于是这堵墙突然向外缓缓移动,我盯着这堵移动的墙,一个全新的宇宙不断映入眼帘,整个宇宙似乎一下子翻了一倍,在这个新扩充的宇宙里你可以发挥想象自由驰骋。更让我惊讶的是这个全新的宇宙本质上是如此的简单,它就在我身边,和我仅隔了一层薄薄的纸板,而我竟然没有丝毫察觉,更没有想到过伸手推一下这堵墙。这时的头脑是兴奋异常又异常冷静,整个世界都宁静下来,吃兴奋剂的人估计就是这种感觉。那时每天走在校园里,看人来人往,觉得这个熟悉的世界之外竟然还存在一个完全不同的世界,而我就在这两个世界穿梭,一种使命感油然而生。 这种醍醐灌顶般的震惊,在我的学习史上,后来只有工作以后学习设计模式时再次领略过。 之后对软件就不断有各种新想法,在纸上写各种各样的新程序。印象最深的是做了一个简单的有自学习功能的游戏。 读书时用了很长时间Pascal,有了微机以后就用Turbo Pascal,再之后,Pascal就逐渐淡出了,但数据结构从未淡出。有句名言:程序=数据结构+算法,以后学C语言、C++、Java,数据结构的作用依然。研究生时学习人工智能和专家系统,真正把树的结构弄清楚,编一些有点智能的下棋游戏,数据结构所带来的新世界不断在扩展。 4. 汇编语言 学习汇编语言,一方面是学单片机课程时做了简单的实验,更多的是后来有机会用微机了,看别人都在屏幕上显示出画图出来(后来知道人家是在用Windows里的扑克游戏),只有我的屏幕上光是文字,于是去钻研如何控制屏幕,能在屏幕上画出线来。那时的开发环境还比较简单,钻研的结果是只能直接往内存指定的地址写数据,可以控制屏幕上哪个像素显示什么颜色。这个就只得靠汇编来帮忙了。高级语言调用汇编,到以后加载鼠标驱动、读鼠标状态、读键盘状态,把这些和其他语言结合,就感觉整个计算机都归我控制了,只要能想到什么效果,都可以通过程序实现。 5. LISP语言 学AutoCAD做二次开发用,和其他语言明显不同,所有的东西都放在表里。 读研究生时曾经以为这个会成为我的主业,但最后还是没有做成项目。那时有海外学者到系里做学术讲座,我们去听了,发现都是我们平时学过的东西。最后交流时,系里的教授副教授们也没提什么意见,就是说能不能分个模块给我们做?但还是分不到一杯羹。那时项目就很难拿到,就是这种低技术的活也不容易揽到。 6. Prolog——第一次做计算机方面的项目 硕士毕业的项目用了Prolog,这是唯一一个让我花了很大的劲才弄懂的语言,因为它的思路和其他语言完全不同,它的内核很死脑筋,以不变应万变,完全机械地回溯、匹配,却表现出了接近于日常生活的推理能力。 印象最深的例子是,程序里给出如下规则: 爷爷(X, Y):- 父亲(X,Z), 父亲(Z,Y) 给出如下事实: 父亲(张三,李四) 父亲(李四,王二麻) 它就可以靠回溯匹配判断出 爷爷(张三,王二麻) 是否成立。 摸清楚它的脾气后,一切就很顺手了。用Prolog编推理机、表示知识,我甚至用它调用汇编控制屏幕来编写输入界面,在屏幕上画线、擦线做菜单,并做了个绘图软件。 虽然付出不多,但它最终给了我很多,在省级科技进步奖里挂了名,后来又给了我上海市优秀青年教师的荣誉。但这些又确实没派上什么用场,评讲师时第一次还不知道消息,第二次则已经不需要了。评副高时又过了时效。 一个小插曲:刚参加工作时,投稿一篇文章,里面需要通过程序修改配置文件,但新单位找不C, C++, Pascal的编译器,还好我随身带的软盘里有Prolog,就用Prolog绕了半天编了个程序。心想编辑肯定要笑了:就改个配置文件还用Prolog。还好编辑没提出异议,还是接受了稿件。再之后,就再也没机会用Prolog做项目了。 7. C语言——第一笔计算机方面的稿费 传说C语言最厉害,最贴近底层,代码的效率最高。更传说读研究生时都需要会C语言,老板是不会给你时间学编程语言的,项目要用到什么技术时都是假定你已经会了的。于是未雨绸缪,将C语言学了。一开始还先编译成目标代码再链接在一起,后来有了Turbo C这个工具,再后来Turbo C++、Borland C++,但其实我是按着C语言来使用。这个语言是我学生时代最耗时间的语言,各种有意思的想法都靠它实现了,但里面的指针绕啊绕很费脑子,程序的每条代码都装在脑子里,每天走路时我的大脑就是计算机,一行行去执行那些代码看哪里有问题。 那时编个小程序就有杂志愿意发表代码,就投稿了一些简单的电子琴、小游戏、编程技巧之类的文章。倒真是有学生看了文章之后再把这些代码逐行敲到电脑里去调试,碰到问题还把代码打印出来通过邮局邮寄给我检查。看来编程的发烧友还是很多的,只是那时很多地方还没普及网络,否则直接把代码email过去就行了。 再后来用到C语言,则是工作以后在服务器端用它编写简单的CGI程序,只是后来它迅速被perl、php取代了。 8. C++语言——第一个计算机方面的兼职 这个语言给我带来了面向对象的概念。读书时出于打工的需要,三天突击自学就去面试去了。再次证实了我的感觉:一门新的编程语言,学个几天就可以用了,只是要用得好的话,那是永无止境的事情。 直到工作以后学Java,我才真正用上了面向对象的特性;直到再以后学了设计模式,我才敢说自己总算掌握面向对象的精髓、真正知道它好在哪里了。 9. 结构化查询语言(SQL) 在早期很长一段时间没搞清楚它和微软的SQL数据库以及开源的MySQL之间的关系。 后来在各种语言的程序中都用SQL语句了,再后来才发现它竟然也是属于一种语言,是一种领域/行业语言。再究其本质,其实数据库解释SQL语句时和BASIC解释器解释BASIC程序本质上是一样的,只是一个用在数据库这个领域,一个用在开发程序这个领域。 10. Foxpro 它既是小型的数据库又提供了二次开发。从Foxbase到foxpro到visual foxpro,有一阵子成了数据库编程的代名词,很多人靠它吃饭。但我似乎只是编了些小程序、做些界面玩玩而已。 11. Java语言——第一本独立编写的书 硕士快毕业时,Java诞生了,宿舍里流传着Java的传说:Java难学,一家企业要选拔员工去出国,只要会Java,就能出国。 去单位报到的火车上,在报纸上看到一个有关Java的报道,那是我第一次看到Java这个词。现在想来,那时看到的应该是10个最主要的操作系统供应商将在其产品中嵌入Java技术的报道。那时,还没有意识到Java和我会有什么关系。因为我认定有了C++已经可以编写任何程序了。 到了单位,学Java成了一项任务。虽然是自己去SUN的网站下载资料自学,但上班的任务是学习、还给你发工资,对我来说是天上掉馅饼了。看了资料才知道,尽管当时很多人认为Java难学,其实只是因为教材少,Java其实已经把C++中的复杂的东西都简化了。对我来说比较难的是,当时和单位的同事分工,他学习教程的前一半,我得跳过前面一半直接从教程的后一半开始学习。 Java让我真正学习了面向对象的各种特性,从此只用来做过一个短暂项目的C++语言就被打入冷宫,我准备将Java作为我所学的最后一门编程语言了。随着JSP、Servlet、J2EE出现,一路跟下去。 Java给了我很多第一次,第一次去首都出差、第一次写书……,以Java为依托学到的各种技术和思想就更多了,只觉得自己的内功越来越深厚。不过俺这么深邃的思想在国内国外都没派上用处,在老外这里面试时,就靠一个Java程序实现一个算法搞定面试,其实只用了十年前的技术,各种内功还没去发挥,但老外就已经很满意而当作一个面试案例了到处宣传了。在国外做编程确实比在国内简单多了。 12. 超文本标记语言(HTML)——第一本参与的书 学Java之前接触了HTML,第一反应是:这也叫语言?值得这么流行?不就是一个文本文件加个标记让浏览器根据标记排版、并点击后访问其他文件吗?和平时用的WPS在文件中加排版标记有什么不同? 还跟着领导出了生版了生平第一本书,第一反应是:这么简单的东西也值得写书?不过我写的是其中Java部分。 还看到有人在大学的学报发表论文介绍HTML,好歹也是核心期刊。第一反应是:这个都能作为论文发表? 不过那时做网页必须全部手写所有的标记,要记住这么多标记倒是比较费功夫的。印象最深的是自己把border写成了boarder,结果做不出效果,查了很久才发现这个问题。后来用这个考学生,考倒一大片。现在想想真是不够厚道。 13. 虚拟现实建模语言(VRML) 刚工作不就就用它了,存粹靠记事本做了个校园的模型作为校园网页大赛的一个亮点,这么简单就做了个三维的东东,那时真是那个兴奋啊。 14. JavaScript 它和Java的关系让很多人包括我困惑了很久,因为实在没什么关系,就是看Java比较火,就把名字改了借它的光而已。但我一直怀疑为啥没有版权问题。 做动态网页时用了很多JavaScript,但大部分都是参照别人网上现成的代码进行改编,从没正正经经地去学它。有几年不做网页了就再也不用它了,觉得这么多新技术出来了,它应该已经退出江湖了。没想到多年不碰它它仍旧风头不减,不断有新的东西出来。出国以后有项目做了,做的第一个项目也是以HTML和JavaScript为主,十几年前用的东西竟然没做多少知识更新就能直接派用场,只是和google map、KML之类结合了一下,还要学一些新的软件包和调试工具,就这些就赢得了老外的信任。一个硕士生找工作前还让我辅导一下JavaScript。 15. Perl 刚参加工作时出于工作需要,编写服务器端程序,之后我就不用C语言来编写CGI程序了。 16. PHP PHP流行时是我的同事介绍给我的,我下意识地拒绝学习,因为跟风是永远没有止境的,而且不喜欢它把HTML和PHP两种不同的代码混杂在一起的风格,觉得读着特别别扭。但不知不觉周围就全部是PHP了,帮人看代码时也都是PHP,也就不知不觉地和PHP熟悉了起来。 17. ASP 微软的,一直在坚持用自己的JSP和Servlet,我要一路Java走到底。但微软太强势了,偶尔还是不得不面对ASP代码。 18. C# 总觉得它是抄袭Java的,任它多么流行,任微软怎么宣传,拒绝学它。不过后来出于上课对比不同语言的需要,还是简单学了一下。出国以后还在一个项目里用了一点点,主要是客户的环境中已经有.NET了,再让人家为一个小东西装个Java的话太臃肿了。 19. 工具命令语言(TCL,Tool Command Language) 读博士时用了网络模拟器NS,除了改内核得用C++以外,一般使用就靠TCL了。不过我老是想起那个王牌彩电的广告。 20. 扩展标记语言(XML) XML那个热呀,反复学过几次,从编程的角度学和从做研究的角度学是完全不同的思路。最后对我真正有用处的还是编程用Java、JavaScript访问XML文件。 和HTML相结合,又出来个XHTML,我晕了一阵发觉和以前的HTML区别不大。就按照符合XML规范的HTML来用它了。 21. Web服务描述语言(WSDL) 搞Web服务时学了一下。 22. 业务流程执行语言(BPEL) 搞Web服务时花了很大精力看文档、看论文研究了一下。 23. Web本体语言(OWL ) 本来应该叫WOL的,但WOL发音太拗口了,就OWL吧,还有一个说法是为了纪念William H. Martin 在上世纪70年代发起的 “One World Language” 项目。 在国内入了门,出了国继续用。 24. Flex/ActionScript 做Flash,一直坚持住没去学,但出国以后做项目时还是用了一下。 25. Python 第一次听说Python这个词是出国前了解云计算时,试了一下Google App Engine,看到它以前支持Python程序,后来开始支持Java程序了。那时对Python一点概念也没有,就直接看Java部分了。谁知道出国后一年竟然开始用Python了。 26. YAML 这个算是语言吗?不过是一种存储数据的文本格式而已。但它确实是从C,Perl,Python和XML借鉴过来的,早期它的全称确实叫语言:Yet Another Markup Language。 但后来它的全称变了,说自己不叫标记语言,全称为YAML Ain't Markup Language。它还是语言吗?这和GNU全称叫GNU's Not Unix、PNG有种全称叫PNG's Not GIF异曲同工。 27…n. 各种脚本语言 不同操作系统不同脚本语言,DOS的批处理、Unix脚本、Novell Netware的脚本……这个就列不全了。 集大成者: 一个很好的项目,由于经历了几届学生,得Perl、PHP、Python、Java、HTML、JavaScript、Linux脚本、SQL都用上,十年不用的东西又重新上手了,很快熟悉一下以后竟然没有多少障碍。 尾声: 语言和工具本身其实是花拳绣腿,不学不行,但不断在变化,永远让你不停地追赶,算算已经追了二十多年了。回头看看,只有内功才是永恒的。 小时候看电视剧《再向虎山行》,对台词中的一句俗语记忆犹新:“练功不练拳,犹如无舵船;练拳不练功,到老一场空。”程序员在学了编程语言的花架子后,得以内功为主,否则年纪大了以后,真的要觉得自己什么也不会了。语言常换,里面的思想和方法才是永恒的,才是值得不断追求的。还好,在学习之初我就有这种意识。 但是,我练内功也练了近20年了,一直以来内功强大、花拳绣腿也不错,却也没做出什么事情来啊? 还是工科的思维在作怪,长期所受的训练形成的理念就是:接到工程项目、查阅文献应用最新技术和研究成果解决实际问题、解决方案经过实际应用检验后发表论文。但如果接不到项目呢?就一切都抓瞎了,内功再强大也没用。 所以还是理科的思维容易出成果:管你有没有项目,我看文献然后天马行空光靠脑袋想,想好了不管程序做得多烂能不能用,只要做出了原型有了数据验证了想法可行就去发论文。 从这个角度看,练拳、练功虽然必要,但并不重要,真正影响人的一生的是思维方式。而思维方式的形成则取决于所看过的书、所经历的人和事。故而人生取决于所看过的书、所遇见的人和事。 补遗:——另一种机语:数控机床 “机”非得是计算机吗?俺们机械也是“机”啊。大四学数控机床,涉及到数控机床编程来控制步进电机,俨然是一种新的语言,但其中的指令非常简单。 老师讲完了,找同学在黑板上写程序,几经动员竟然没有人上去。我觉得很容易啊,但就是没人举手。老师说:看来得来点激励措施,这样吧,谁做出这个题目就不用参加期末考试了。 还是没人上去,免考对我诱惑太大了,要省我好多时间,我终于忍不住举起了手——这是我大学期间屈指可数的几次举手。 在黑板上写完程序,当场点评,只有一个很小的粗心的错误。期末果然就不用参加考试了,交个报告就行了。 等我工作以后做老师后,上课问问学生问题时也是鸦雀无声,把问题难度降低再降低,还是没人吭声。我不敢用免考激励学生——那得算我教学事故了。但我可以给你加平时分呀,加1分,有人回答吗?加2分,5分,……最后还是得靠点名某某来做。其实我很理解你们,当初我也是,明明会回答,就是不肯举手或张口。
个人分类: 思考|2418 次阅读|12 个评论
课题实验——matlab7视频编程
mafei863 2011-8-12 09:47
利用matlab视频编程,在commandwindows中输入edit,打开了Editor窗口,输入代码 info = imaqhwinfo('winvideo'); obj = videoinput('winvideo',1); himage=preview(obj); frame = getsnapshot(obj) ; imshow(frame) 连接摄像头后即可显示视频。
个人分类: 任务细化|1 次阅读|0 个评论
Linux 下 text 模式安装 Matlab R2011a
热度 3 william1985 2011-6-22 13:21
最近对 Matlab 很感兴趣,发现用这个东东写程序和C差不多,但是调用数学包和矩阵操作确实方便不少。 为了提高计算速度,在实验室的小工作站上安装了最新版的R2011a,在这里记录一下。 首先,下载 Matlab R2011a,可以在ipv6站点下载: http://bt.neu6.edu.cn/viewthread.php?tid=712428highlight=matlab%2B2011 5.17G, 好庞大的东东。幸亏俺有六维时空,就学校那点流量怎么够用捏~ 我是在 windows 下用 Daemon tool 挂载,然后把解压的一堆文件用 FileZilla 上传到服务器的,这样比较土鳖,而且上传过程比较花时间。可以把iso文件包整体上传,在Linux下挂载,这样会更有效率。这样带来的另一个不好的地方是,install 和 /java下面的 java 读写运行权限变了,不管三七二十一,用 chmod 777 把他们变成可运行,以免出现 permission denied 错误。 然后,开始 ./install ,注意需要root权限才能把matlab安装在/usr/local/下。这时,麻烦出现了: could not reserve enough space for object heap could not creat the java virtual machine 这时因为服务器的Java版本比较老,限制了开辟内存的大小,为了解决这个问题,我下载了最新的Java版本,然后替换掉老版本,就行了。具体做法参见: http://developer.51cto.com/art/200906/129164.htm 以及: http://developer.51cto.com/art/200907/135155.htm 注意,安装最后修改一下环境变量,我是安装下面的方法修改的: /etc/profile 在最后面加入 export JAVA_HOME=/usr/java/jre1.6.0_26 export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH 保存退出。 其次,排除了java虚拟机的问题之后,Matlab就可以顺利安装了,注意因为是文本模式安装,安装时加上选项 ./install -inputFile installer_input.txt installer_input.txt 中按照提示填写,最后的安装组件默认是全部安装。 这些做好了,安装就会开始,大改十分钟左右,安装完成。进入/usr/local/R2011a/bin下,运行./matlab,系统提示找不到 libxp.so.6 组件,这是因为工作站没有安装图形界面,而matlab运行需要其中的某些组件。 补充安装这个组件的说明可以参考: http://bianbian.org/technology/242.html “ 1)到 http://ftp.xfree86.org/pub/XFree86/ ,找到最新版本点进去,现在是4.7.0。 2)如果对自己系统不熟悉,可以先下个Xinstall.sh。然后运行 sh Xinstall.sh -check 他会告诉你下哪个编译好的版本适合你的系统。我的是”Linux-ix86-glibc24″。 然后点binaries进去,不研究源码,只是拿来用,就下预编译的好了。接着点“Linux-ix86-glibc24”。 3)这有很多tar,注意:你只要下Xbin.tgz就够了(现在是6.6M) 4)tar zxf Xbin.tgz -C /usr/X11 5)vi /etc/ld.so.conf,加入/usr/X11/lib 6)ldconfig ” 根据系统我选择的是 Index of /pub/XFree86/4.7.0/binaries/Linux-ix86-glibc23 另外,注意,由于系统是64位的,config中改为 /usr/X11/lib64。 最后,再运行 ./matlab 系统会提示激活错误,这里的解决办法是: ./matlab -c /home/wli/Matlab/ crack/lic_standalone.dat 在斜体部分换成自己具体的路径。 为了避免麻烦,我把别的机器上用图形界面安装时生成的 /licences 文件夹整个拷到 /usr/local/R2011a/下,这样只要敲 ./matlab 就可以直接启动了。当然,要先把 matlab 路径添加到 .bashrc 里: PATH="${PATH}":/usr/local/R2011a/bin/
个人分类: 计算机技术|12190 次阅读|0 个评论
[转载]Web 2.0 编程思想:16条法则
readnet 2011-6-13 18:27
Web 2.0 编程思想:16条法则  (2006-04-19 16:20) 标签: web2.0   分类: 编程天地 原文: Thinking in Web 2.0: Sixteen Ways 作者: Dion Hinchcliffe 1、 在你开始之前,先定一个简单的目标 。无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标。就像“我需要保存一个书签”或者“我准备帮助人们创建可编辑的、共享的页面”这样的目标,让你保持最基础的需求。很多Web 2.0应用的最初吸引之处就是它的简单,避免并隐藏了那些多余的复杂性。站在创建者的立场,可以想象Google的几乎没有内容的主页,还有 del.icio.us 的简单的线条。从最终用户的角度来看,与之齐名的就是 Diggdot.us 所提供的初始化页面。你能够并且希望加入更多功能,但是先做好最开始的。在一个时候只做一个特性,完成一个目标。这听起来很太过于单纯化了,但它将使你更加专注,而且你也会明白我的意思。 2、 链接是最基础的思想 。这就是我们称之为Web的一个理由。链接是把Web中各种实体连接起来的最基本的元素。你的信息、你的关系、你的导航,甚至是能够被写成URL的任何内容。这里有一个链接应该遵循的规则(其实你也不必严格的遵守): 1. Web上的任何东西都是可以被URI或者是URL所连接的。 2. 把所有的链接都保存为他的原始出处,这样可以让你与任何人、在任何地方、任何时候都能分享它。 3. 第二条中任何时候的前提是链接必须是持久的,它不会在没有任何缘由的情况下被改变或者是消失。 4. 链接应该是人类可读的、稳定的、并且能够自我诠释的。 3、 数据应该属于创建它的人 。是的,你听我的。任何用户创建的、贡献的或分享的都是他们自己的,除非他们很明显的放弃这个权力来让你自由处置。他们贡献到Web上的任何信息都应该是可编辑的、能被删除的、并且能够取消共享,无论在任何时候,只要用户愿意。这也包含了那些间接的数据,像他们所关心的记录、日志、浏览历史、网站访问信息,或者是任何可以被跟踪的信息。所有的网站必须清晰简单的陈诉那些信息是用户创建的,并且提供他们停止创建的方法,甚至是清除的方法。 4、 数据优先,体验与功能其次 。无论它是文本、图片、音频还是视频,Web最终还是把这些解析为数据。换句话说,你无法脱离数据去呈现内容。所有这些数据都通过那些易于发现的URL来定位(参见第2条)。通过另一种形式来看待这些,Web最终是名词优先,动词其次,虽然最近正在向动词偏移。来看看名词的例子:日历的条目、家庭照片、股票价格。还有一些动词的例子:定一个约会、共享一张图片、买一份股票。 5、 做好积极分享一切的准备 。尽可能的分享一切,你所拥有的所有数据,你所提供的所有服务。鼓励不遵循原有意图的使用,提倡贡献,不要那些需要分享的内容坚持设置为私有的。在分享与发现之后,提供易于使用的浏览方式是显而易见的需求。为什么呢:话说回来,你会从别人的共享之中受益匪浅。注意:这里没有许可让你去侵犯版权保护的法律,你不能够去分享你刻录的DVD或者是拥有商业版权音乐,因为你已经同意不会去分享这些东西。但是你可以发现并分享那些完全开放的媒体内容。一个小小的建议,你可以学习一下 Creative Commons license (共创协议). 6、 Web是一个平台;要让它成长 。当然,我们还有很多其他的平台(Windows、Linux、Mac),但是那些已经不是重点了。换句话说,Web是无法脱离的平台,不会中断的平台,你可以通过各种方式去扩展的平台。你在Web上提供的数据与服务将会成为Web一部分,最终你会在Web平台的某一处扮演你的角色。扮演好你的角色并照顾好后来者。 7、 理解与信奉“阶梯性” 。现在的Web越来越大,几乎蔓延到了全世界的所有国家,并且已经拥有了10亿用户。我的观点是Web的各个组成部分存在着细微的区别和不同,就像不同地方的用户那样。例如Web的设计部分:易用性永远优先于速度、可靠性、重用性与可集成性。你也应该提供同样的体验给你的用户。它已经被一次又一次的被人们在文档中强调,忠诚的用户很快会成为专业的用户,他们期待更快的速度还有更多。退一步支持他们。同样,也有很多很多的用户会进入这个阶梯的底端,如你所期待的那样。他们可能不会说你的语言,不熟悉你的文化,甚至不知道是如何到这里的。所以你需要向他们表达清楚。 8、 任何东西都是可编辑的 。或者是它应该被编织的更好。要确定的是,只有很少的东西是不能被编辑的,剩下的都可以,这是一个可写的Web。这并不意味着原始内容的丢失,而通常被理解为用户能够很容易的对内容加以评论,或者评注内容是在那里发现的。如果你对此应用的好,他们能够比你所想象的做的更多(把内容串起来并且给予原始内容来创建自己的,等等)。 9、 Web上的身份是神圣的 。不幸的是,这并不意味着你能够得到更多的隐私(这完全是上个世纪的想法)。但对身份的验证是必要的,你应该感谢那些只需一个邮件地址就能确定你身份的服务。这意味只要你对你的用户承诺了,你就必须保证他们的隐私安全。必要的时候,在这个世界的某处你还得为你的用户挺身而出,向当地的权威挑战。如果你没有打算那样做,你就得把实际情况告诉你的用户。另一方面,如果身份是必须的,不要试图伪装它,不然在某一天我们将会在Web上放弃我们的最后一点点隐私的权利。 10、 了解流行的标准并且使用他们 。从一个消费者或者是创作者的立场来看,数据将会以不同的格式与任何一个人交换。同时这样的数据也会反过来促进标准的完善与采纳。这通常意味像RSS、 OPML、XHTML、Simple XML、JSON等简单标准的流行,而避免SOAP、XSD,还有RDF、ATOM也一样,使用它们会给我的内心带来痛苦。请你也为你所钟爱的标准投上一票来支持它们。 11、 遵循无意使用的规律 。如果你把非常有趣的数据和服务用广泛使用的格式开放和共享出去,你将会得到你所应得的,其他人也将会基于你的那一块Web平台来构建。或许还会从别人那里得到更多,所以为这个做一下准备比较好。我已记不清有多少次我看到一个播客(podcasting)服务因为流行过渡而导致服务垮掉,就是因为他们被 Slashdot和del.icio.us给收录了。这一点要知道:网络上的大量化意味着如果一个内容非常有趣,即使是一个很小的角落也会得到惊人的访问量。鼓励使用这种方式,它还是非常有价值的,前提是你要有所准备。 12、 粒化你的数据与服务 。我们应该在很早以前就明白这些,大规模集成的数据仅仅适用于无需管理的下载与批量操作。分解你的数据,让他们独立成可描述的URL地址,对你的服务也一样。反过来说,你不要创建一些巨大的、复杂的、像圣诞树那样的数据结构和服务。保持简单,要非常的简单。让这些分离的片断能够容易的被重组和发现。 13、 提供用户能够单独受益的数据和服务 。渐渐依赖于这种社会化参与是存在风险的,你需要让你的用户有一点点动机来贡献时间、热情和信息,除非他们能够直接受益。社会化分享比个体行为的利益大很多,除非你能够激发用户的个人动机,否这你将无法享受这份厚礼。 14、 让用户组织并过滤信息 。不一定是必须的,但却是非常重要的。让用户以他们自己的方式来标注和组织数据,因为你自己是永远无法及时的处理他们的。用户会按照他们自己理解的最佳方式来处理并构建。要保证你的Web服务能够按照用户所需所想的方式来工作。这也是标签(tagging)和通俗分类(folksonomies )的方式如此成功的主要因素。 15、 提供丰富的用户体验 。Web一直都在和本地的应用程序进行着激烈的竞争。为什么?因为本地程序还是感觉上好一些,速度也快一些。但是这不会长久的(确信在5年或者15年后,这种竞争就不存在了)。是的,我在谈论 Rich Internet Applications , Ajax, 还有那些不可思议的交互应用。他们让Web成为了一个真正的“无平台”的平台,如果你知道我是怎么想的。 16、 信奉并支持快速改进和反馈 。这个通常意味着加快步伐,但也意味着使用轻量级的工具、技术和不要做出那些适得其反的痛苦决定(例如使用一个被层层环绕的Ajax框架来代替可以通过混合来实现的,或者用C++来构建所有的东西,其实使用Ruby会更好一些)。这同时也意味着需要一个非常快速的方式来处理错误报告,修复Bug,释放新版本。从一个用户的角度来看,报告你所发现的任何问题,还有那些你经常抱怨的地方,甚至那些都不是一个Bug。 当然,Web 2.0是一个极其广泛和深奥的话题,没有一个人能够列举出它的所有重点和特征。如果你对此充满了兴趣,请花一点时间来补充我没有提到的地方。我想这就是Web 2.0的参与性吧! 原作者的这个标题借鉴了 Bruce Eckel 的两本畅销书的名字:《Thinking in C++》和《Thinking in Java》,《C++编程思想》与《Java编程思想》,在此说明一下为什么要这样翻译这个题目:)
个人分类: IT|2336 次阅读|0 个评论
怎样讲解较复杂对象的演化过程—教学难点讨论之四
热度 25 tangchangjie 2011-4-18 10:09
一次不成功的即兴编程实验课 上周三,一位研究生毕业后到外校任教的年轻教师给我诉说了一次精心准备而又多灾多难的演示课。他用了二十多个小时,精心准备了一次即兴编程演示课,自认为从来没有这样认真过,兴致勃勃请了有关领导和老教师检查指导,还给学生们发了学生评教表,满怀信心带着软件到多媒体教室,结果遇到下列意料外的事: (a) 软硬件资源不够 教室的多媒体设备速度较低,内存较少,可能是因为病毒干扰,前一天上午安装好的C语言编程环境,经历了两个其它课程而被损坏,重装VC用去8分钟,好不容易安装好,不知是计算机资源不够还是系统中的权限限制,一运行就死机; (b) 征用学生电脑调整环境 幸好,临时征用了学生带的笔记本电脑,花了2分钟,把移动硬盘上资料复制过去,又花了几分钟,才把软件环境调好,至此,宝贵的15分钟时间过去了,开始请学生即兴出的题目; (c) Game over ,沮丧极了 。殊不知,学生即兴出的题目,看似简单,却暗藏难点(不是学生故意刁难老师,笔者自思,如果自己第一次遇到那个问题,在微妙的边界条件上也可能要花若干时间,捅破了窗户纸,又觉得简单),这位年轻老师的几次陷入错误,幸能挑出,但最后一次错误,用了20分钟,还未来得及跳出,下课时间到了。这一堂50分钟的课中,学生看到了老师的焦头烂额和毛焦火辣,既同情,也不满意;老师自己也好像在玩一场电子游戏,还没摸到火门就听到 :“ Game over ,you are failed ”, 沮丧极了。 典型的演化过程讲述实例 在讲课、讨论班、毕业论文答辩中有时需要讲述较复杂过程。下面是几个较典型的实例: (1) 演示即兴编程技巧 。在课堂上,打开C语言编译环境,由学生即兴出题。老师即兴编程实现,让同学们看老师怎样犯错误,又怎样从错误中跳出,演示调试程序的技巧;看看“钢铁是怎样炼成的”,比只看“炼成的钢铁”学得更多; (2) 推导复杂的数学命题 。在黑板或PPT中推示一个需要30分钟或更长时间才能完成的复杂的数学命题推导过程; (3) 数据结构的生长和死亡 。演示一个数据结构(例如 B-Tree,堆栈,队列, R-tree)的生长变化过程; (4) 演示生产流程 ,演示基因表达式编程中个体进化过程,或…… 几种展开并解析过程性难点的方法 通常,在讲述比较复杂对象的演化过程时,可以采用下列方法之一: (a) 屏幕录像 。例如,在准备程序调试技巧课程时, 一边编程,一边使用屏幕录像程序(google一把, 可找到很多这类程序),用屏幕录像程序记录下全过程,包括犯错误和改正错误的过程。可配上录音,上课时播放;也可不配录音,上课时讲解。这一方法的优点是效果好,甚至可以不要老师讲解而自动反复播放,在做产品介绍,或作国际会议DEMO时,常用这种方法;其缺点是制作时间较长,缺少交互,不能增量更新,修改比较麻烦。 (b) 精配动画 精心做PPT,配上动画来描述变化过程,制作时间较长。 (c) 编程高手即兴编程 。如果老师是编程高手,先精心地熟悉课程相关技能技巧,表演时就像平时编程一样,从容展示。其缺点是不确定因素多,老师的临场经验,心态,甚至气候,都可能影响效果。就像上面说的那次即兴编程实验课 ,其发展过程并不全在表演者的掌控之中。 (d) 假动画+标注框 。预先做好比较丰富的PPT,用“假动画+标注框”技术来展开和解析复杂对象的变化过程,易控制速度, 可增量更新,是一种 性价比 较高的方法,是本文推荐、下面将解释的方法,图1和图2给出了11个PPT页面。 “假动画+标注框”的优点   (1)简单易作 图1中演示了一个树结构的生长过程。先做好第5子图,加上一两个标注框,然后用复制幻灯片功能,复制成为连续的5份。在第5子图中把一些元素改成无色(或适当的浅色)就得到第4子图,第4子图中把一些元素改成无色或适当的浅色即的第3子图,以此类推。在“无色”和“适当的浅色”二者中,笔者更喜欢“适当的浅色”----即选择一种在电脑屏幕上能隐约看到,但投影屏幕上却看不到或不明显的颜色,(利用了投影机和电脑屏幕的显示效果差别)。   (2) 增量式更新 ,每次讲课后立即修改讲课中发现的不足,次年备课时,根据新的理解加以修改, 这样,讲课质量是增量式更新,第二次讲课前的备课较易 ,讲课质量一年比一年高。如果没有这样一个PPT,每年备课只是从记忆的基础上开始,用时多,进步慢。   (3) 回卷容易 讲课或答疑中,常需要倒回几页重来一次,回卷时,假动画方式的PPT比正规动画来得快,容易控制回卷点和重放速度。   (4) 引导听众视觉焦点 ,因用浅色隐去了稍后页面中的焦点元素,新页面刚跳出时,新元素就吸引眼球,此外,标注框能部分代替激光笔和肢体语言,老师不需要在晃眼的投影灯光前跳来跳去,或许说一句:“请注意红色标注框”,就能引导听众关注的焦点。    (5)预见下一页,心中有数 。因为报告人在电脑上能隐约看到下一页的焦点内容,(但投影出来的屏幕上看不到),报告人知道下一页的将要将的焦点内容。 就避免了“幻象讲解”----即在显示第N页时,凭记忆超前讲述了第N+1页的内容。等到下一页跳出来,在把自己吓一跳之后,沮丧地发现提前做了费力不讨好的事情。(真动画方式就有这样的缺点)。 模仿“歌手假唱” 方式讲授即兴编程课 即兴编程课程通过演示老师在编程时怎样犯错误,又怎样从错误中跳出来,来传授程序调试技巧。 推荐用模仿“歌手假唱”的方法做个应急版本。 (a) 选择有代表性的题目备课 ,编程中较密集地抓下屏幕(有很多工具,例如搜狗拼音的扩展功能就可以抓屏幕),包括有意设置的或无意遇到的错误以及改正错误的过程; (b) 抓屏,嵌入到PPT ,选择“另存为—工具—压缩图片”,平衡投影后的清晰度和文件大小; (c) 复制,以浅色实现隐藏 ,把每页的页面复制成为2-3份(以知识点,关注点为准),加上适当的标注框解释。 这样做出来的PPT可以作为一个应急预案,它能演示即兴编程,演示编程者犯错误和改正错误的过程,课后(或课前)还可以把PPT发给学生。 在即兴编程演示时,如果遇到第一节叙述的意外情况,启动上述应急预案,(或者,一开始直接就用这个PPT),这有点像歌手 预录+对口型的假唱(其实,很多节目都有预录的应急版本);也许,歌手假唱后引起观众不满,但这样的有准备的“假即兴”编程,能有效地演示编程犯错和改正错误的过程,能收到较好的教学效果。其实,假的不一定都伪劣,如假牙假肢,被广泛采用。 平时多流汗 图2是笔者讲解NP-完全问题 “子集和(Sub-Sum)”问题时用的20个PPT页面中的5个。其要点是一个归约过程,在多项式时间内把3SAT归约为Sub-Sum, 其中的标注框是根据需要,逐步出现又逐步隐去的。Sub-Sum问题较难懂,也较难讲;虽然书上也有那个表格和严格的文字说明,但不如PPT上有动作的先后过程好懂。如果没有这个PPT,可能要写满几十黑板,需要几个小时,学生记笔记也较难。自从做了较好的PPT后,讲起来轻松一些了,学生课后还可利用PPT作复习的支撑。    做一个好的PPT,平时多流汗,在教学时就会“战时少流血”了。      下篇讲什么 有博友提出这个问题,答案是“真的不知道”。   写博文常即兴选题,有感而发。 博文有点像 压仓物 ,它保持生活之舟的吃水深度,使其平稳; 因其压仓物属性,所以只要科研教学一忙,诸多事务中,最先停下让路的就是写博文。  其次,选题也有踌躇 :“嘤其鸣矣,求其友声”,写文章当然希望有人读。昨天,有朋友提示我写一篇数据挖掘方面的教学难点讨论,数据挖掘问题和数学问题相比,面要窄一些。所以,在本系列博文的前几次选题时,选了读者面较宽的卷积和小波。也许下一篇议论数据挖掘方面的吧,但要选一个有点难、又有趣,还能讲得深者见深、浅者见浅,有较多读者的题目还真费思量。 相关博文 辐射、服碘、补盐、空袭和卷积 ----- 教学难点讨论之一 引玉之砖释小波--教学难点讨论之二 尺度伸缩,男女声合唱与数学显微镜--教学难点讨论之 三 怎样讲解较复杂对象的演化过程 — 教学难点讨论之四 实事实地有实照,从此点名不烦恼--介绍一款照相点名系统 其它系列博文的入口 相关博文   答辩PPT五技巧-表达公式推导、数据结构和算法 (其附件中,可下载一个解释这些方法的PPT)   答辩之前支几招
个人分类: 教学科研|11541 次阅读|57 个评论
立委微博:“抄袭”是程序员的常规技能
热度 1 liwei999 2011-4-14 23:58
我的导师才是 COBOL 刘 他一辈子用 COBOL,于是我 BASIC 以后,就一直用 COBOL。开始写繁琐啰嗦的COBOL,我老出 SYNTAX 错, 哪怕简单的两行程序也错,没脾气。后来学乖了,不跟自己较劲,也不跟电脑较劲儿,从来不 start from scratch,任何程序都是先 cut and paste (CtrC CtrV),至少保证不会再有句法的干扰。 可见,抄袭是工程师的看家本领:不抄袭几乎没法儿活。当然,抄的只是形式,袭的是框架,血肉还是自己填。也一样编出实用系统来。
个人分类: 立委随笔|2728 次阅读|1 个评论
R语言学习笔记(二)Introductory statistics whith R -Peter Da
热度 1 maolingfeng 2011-3-21 23:32
(cases form Introductory statistics whith R by Peter Dalgaard) ###R镜像官方网站( http://ftp.ctex.org/mirrors/CRAN/ ) 1、对矩阵的操作,可以利用matrix函数,并且,用rownames()函数给矩阵赋予名字 x - matrix(1:12,nrow=3,byrow=T) rownames(x) - LETTERS x A 1 2 3 4 B 5 6 7 8 C 9 10 11 12 2、对于矩阵的合并,按行合并或者按列合并cbind()\rbind() cbind(A=1:4,B=5:8,C=9:12) A B C 1 5 9 2 6 10 3 7 11 4 8 12 rbind(A=1:4,B=5:8,C=9:12) A 1 2 3 4 B 5 6 7 8 C 9 10 11 12 3、因子的定义 text.pain - c("none","severe", "medium", "medium", "mild") factor(text.pain) 4、利用data.frame()来讲两个向量合并成一个矩阵 vetor1 - rnorm(20) vetor2 - rnorm(20) d - data.frame(vetor1,vetor2) 5、条件选择,可以利用条件,对别的向量进行操作 vetor1 - rnorm(20) vetor2 - rnorm(20) a- vetor1 ##选出向量1中,当向量vetor2中数大于0所对于的数值。 6、对于缺损值NA,利用is.na(x)来寻找 7、d ,对于数据库d,在 , 1, mean)##代表对于矩阵a4,从2列到第6列开始,取平均值mean,其中参数“1”为按 ##行计算,如果括号中参数为2,则按列计算,mean可以变为sd,sum、中值median等计算。 case: m - matrix(rnorm(12),4) apply(m, 2, min) result: -1.1616653 -0.7892404 0.3189893 lapply(thuesen, mean, na.rm=T)和sapply(thuesen, mean, na.rm=T)是等效的,其中对于na.rm=T 代表的是缺损值不进入计算 6\高斯分布随机函数Gaussian(normal):形式为rnorm(n,mean=0,sd=1); 随机数runif(n, min=0, max=1) 7\排序range(x)其功能等同于才c(min(x),max(x)) 8\关于协方差的计算var(x,y),如果是矩阵或者数据框,则用cov(x,y)来表示。 ####二、关于制图 1、基本的制图函数形式 x - runif(50,0,2)##产生两个含50个元素,从0-2的的随机向量x,y。 y - runif(50,0,2) plot(x, y, main="Main title", sub="subtitle",xlab="x-label", ylab="y-label") ###其中main为主标题,sub为副标题,xlab为x轴的名字,ylab=为y轴的名字。其他参数还有很多,比如 ###add=FALSE为不叠加到前一个图形上,如果为TURE叠加到前面一个图上,如果有的话;axes=TURE则 绘制边框,如果是FALSE则不绘制边框。type="p":点图;“l”线图;“b”点连线图。xlim=c(1,10),xlim=rang(x) 用来指定xy轴的上下限 2、部分比较有用的绘图低级命令 points(x,y)添加点 lines(x,y)添加线 text(x,y,labels,)在(x,y)处添加用labels指定的文字,典型用法是plot(x,y,type="n");text(x,y,name) abline(h=y)在纵坐标y处化直线 abline(v=x)在横坐标x处画直线,很有用的函数 abline(lm.obj)画由lm.obj确定的回归线;如lm.obj-lm(x~y),执行abline(lm.obj)既添加上了回归线 3、关于坐标轴axis的设定 axis(2,at=seq(0.2,1.8,0.2))##其中,2代表y轴,如果是1则代表x轴,坐标轴的形式中的分界点 at为从0.2开始到1.8结束,中间间隔为0.2 box()设置外边框 4、联合不同的图形 x - rnorm(100) hist(x,freq=F) curve(dnorm(x),add=T) h - hist(x, plot=F) ylim - range(0, h$density, dnorm(0)) hist(x, freq=F, ylim=ylim) curve(dnorm(x), add=T) 5、编写函数的相关函数 x - y/2 repeat{ x - (x + y/x)/2 if (abs(x*x-y) 1e-10) break } x ###if给出条件语句,如果符合那么执行下面的步骤,case中即break中断 x - seq(0, 1,.05) plot(x, x, ylab="y", type="l") for ( j in 2:8 ) lines(x, x^j) ##for语句的应用及相关的格式 6、ls()给出所有的工作空间内的对象;rm(height, weight, bmi)移除相关的对象;rm(ls())移除所有对象 7、保存工作空间及所有的计算过程save.image("ZDVI_y2_3.rdata")注意保存文件名的后缀名.rdata 8、移除文件包detach("package:survival") 基本的学习结束。 三、概率和分布(probablity and distributions) 1\随机采样 sample(1:40,5)###在1到40的数中随机采集5个数 sample(c("H","T"), 10, replace=T)##当采样个数大于向量的元素个数时,利用replace可以重复 "T" "T" "T" "T" "T" "H" "H" "T" "H" "T" sample(c("succ", "fail"), 10, replace=T, prob=c(0.9, 0.1))##不均一的概率采样,其中prob中 设置0.9代表采集到succ的概率为90% "succ" "succ" "succ" "succ" "succ" "succ" "succ" "succ" "succ" "succ" 2、1/choose(40,5)###函数40个数中选择5个的概率 3、画随机曲线,dnorm(x),表示x的密度, x - seq(-4,4,0.1) plot(x,dnorm(x),type="l") 等效函数为curve(dnorm(x), from=-4, to=4); 4、1-pnorm(160,mean=132,sd=13)###对于平均值为132,标准差为13的一组数列,其中一个数值为160或者比这更大的概率为 0.01562612 5、pbinom(16,size=20,prob=.5) 0.9987116 6、###关于正态分布95%自信区间的获取 xbar - 83###一组数的平均值 sigma - 12###标准差sd n - 5 ###数据的长度length sem - sigma/sqrt(n)###平均的标准误差 sem 5.366563 xbar + sem * qnorm(0.025) 72.48173 xbar + sem * qnorm(0.975) 93.51827 ###获得95%置信区间的上下数值 In professional statistics they are used to create simulated data sets in order to study the accuracy of mathematical approximations and the effect of assumptions being violated. rbinom(10,size=20,prob=.5)###10为重演十次,20为可能性,prob=0.5为概率值 12 11 10 8 11 8 11 8 8 13 ###测试抛硬币的函数哪个要好点的算法,两个好像差不多 a-rbinom(10000,size=1,prob=.5)####注意两种选择,size等于1 b-sample(c(0,1), 10000, replace=T, prob=c(0.5,0.5)) sum(a) sum(b) ###关于正态分布的自编函数normal.fun() normal.fun- function(vetor1,a)##a的数值为0.05或者是0.001自己设定 { xbar - mean(vetor1)###一组数的平均值 sigma - sd(vetor1)###标准差sd n - length(vetor1) ###数据的长度length sem - sigma/sqrt(n)###平均的标准误差 border1 - xbar + sem * qnorm(a/2) border2 - xbar + sem * qnorm(1-a/2) vetor2 - c(border1,border2) return(vetor2) } b-rnorm(20) normal.fun(b,0.05)
个人分类: R语言学习笔记|20197 次阅读|1 个评论
R语言学习笔记(一)
maolingfeng 2011-3-12 23:30
(说明:前段时间的R语言学习笔记文件坏了,现在记录在博客上,以便于自己学习之用,感兴趣的人还可以看看。记录的东西也不一定正确,请大家指教,里面可能会引用到一些别人的资料等,作为学习之用) 读书笔记 Basic knowledge for R 2011-3-10 相关的函数记录与整理 1、source("文件名.r"):调取主程序的文件,在程序结构复杂的时候很有用,可以将一部分复杂的运算主程序放入其中。 2、install.packages("fields"):安装程序包 3、library(fields):导入程序包 4、t(x)转置函数,对于csv中横排的转置很有用 5、dev.off():中断函数 6、a - as.character(b):因子型转化为字符型函数 7、position - regexpr('_',a):regexpr()函数对字符的定位很有用,返回值position为特定字符,如字符串a中’_’的位置 8、结合定位函数,对字符串如x345_xbt,进行拆分,利用函数substring(要拆分的字符串,开始的字符位置,结束的字符位置) namecol1 - substring(a, 2, position - 1) namecol2 - substring(a, position + 1, nchar(a)) 结合regexpr()函数,这两个命令返回的值为,namecol1-345;namecol2-xbt; 9、合并向量data.frame(vetor1, vetor2, vetor3) cbind(vetor1, vetor2, vetor3) 10、取名字相同的交集unique()函数 例如对包含行名的向量R1、R2、 R3取名字相同的行,组成新的向量。 nam1 - rownames(R1) nam2 - rownames(R2) nam3 - rownames(R3) tnam - unique(c(nam1,nam2,nam3))返回结果为只剩下名字相同的行的数值和rownames 或者取一个向量中唯一一个值的数据,合并重复数据。unique(x, incomparables = FALSE, ...)在R中三个点…,表示可传递参数 11、对程序包里面的具体的函数源代码,通过安装包后直接输入函数名回车,可以看到函数;注意找到对应的子函数。也可以在R镜像网页中的packages中,下载package的数据包,减压后,看文件夹得R函数中,这个包含程序注释,更好。 12、t检验函数 t.test(x, ...) ## Default S3 method: t.test(x, y = NULL,alternative = c("two.sided", "less", "greater"), mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95, ...) ## S3 method for class 'formula' t.test(formula, data, subset, na.action, ...) 13、对于一个向量x中选择某个符合条件的数值出来(大于某个数或者是某个条件limit),直接利用表达式y-x 14、判断两个向量的交集部分选择%in% 1:10 %in% c(1,3,5,9) 15、帮助已经加载的程序包有哪些函数,可以用主界面的helphtml帮助 16、regression with damped exponential correlation回归的函数为rdec(),需要的函数包为RDEC 17、相关常用的R运算 计算 log(x) log10(x) exp(x) sin(x) cos(x) tan(x) asin(x) acos(x) min(x) max(x) range(x) length(x) 统计检验 mean(x) sd(x) var(x) median(x) quantile(x,p) cor(x,y) t.test() lm(y ~ x) wilcox.test() kruskal.test() 统计检验 lm(y ~ f+x) lm(y ~ x1+x2+x3) bartlett.test binom.test fisher.test chisq.test glm(y ~ x1+x2+x3, binomial) friedman.test ... 18、ls() 列出工作空间中的对象;rm() 删除工作空间中的对象 19、对象类型转换 as.numeric() #转换为数值型 as.logical() as.charactor() as.matrix() as.dataframe()
个人分类: R语言学习笔记|24177 次阅读|0 个评论
世界上最强大的编辑器 Emacs 学习笔记
lxping 2011-1-7 22:59
share_info.allow_share = 1 简介 Emacs 被很多人称作世界上最强大的编辑器。用户从无数高手到IT民工到普通文本编辑器用户,可以符合几乎所有人的需求。甚至可以在Emacs 里运行音乐播放器、网页浏览器等等,Emacs 更像是一个操作平台。 使用 Emacs 可以完全抛弃鼠标,不必在打字的同时把手移开键盘找鼠标,不必在一大堆深藏不露的菜单里寻找那些常用功能,也不必被一条条工具栏遮挡视线。大多数的 Windows 编辑器都有一条菜单栏,n条工具栏。菜单里有无数选项,很多选项都会弹出一个对话框,这个对话框又会带有层层叠叠的标签,每个标签里 又有很多输入框很多按钮。一个简单的把所有字母大写的命令就要在菜单里翻半天,说不定还找不到,而他们的帮助信息又总是不知所云。而 Emacs 的大多数操作都可以通过快捷键或直接输入命令完成,而且有着极好的帮助系统,可以通过多种方式找到你想要的命令或按键。 不要被 Emacs 简单的外观和与众不同的操作方式迷惑,上手 Emacs 并不是什么难事,看一遍 Tutorial 就可以了,Emacs23 已经带着多种语言版本的快速指南,包括中文。仍然觉得 Tutor 太长?那可以继续看本文。 按键说明 首先说明一下,Emacs 的按键表示方法。最常用的是 Ctrl 和 Alt 的组合键, 分别用 C 和 M 表示,比如: C-x 就是 Ctrl+x, M-x 就是 Alt+x, C-M-f 就是 Ctrl+Alt+f, M-% 就是 Alt+%,实际上是 Alt+Shift+5 C-x C-f 就是 Ctrl+x 然后再按 Ctrl+f,中间可以一直按着 Ctrl 也可以松 开,无所谓间隔多长时间。 这样你就可以简单的用 C 和 M 表示 ctrl 和 alt 了。Shift 可以用 S 表示。 键盘上的特殊按键用表示,比如 回车, 空格, 方向键上, 等等,一看就知道什么意思。 打开和保存文件 启动 Emacs 后,按 C-x C-f,minibuffer (就是 Emacs 最下面一条) 会提示路 径,你可以在这里输入路径名和文件名,或者 回车看到这个目录列表。可以 用方向键移动光标到文件名上 回车打开文件,或者在子目录上 进入子 目录,在 .. 上 进入上一层目录。 打开文件后像往常一样编辑,随便按字母键输入一些字符。按 C-x C-s 保存文件。按 C-x k 回车关闭这个 buffer。 小结:按键说明 这里可以看到很多 C-x 开头的组合键,这些通常都是 Emacs 预先定义,全局性 的命令。按了 C-x 不动,一秒钟后 minibuffer 提示 C-x- ,表示 Emacs 正在 等待用户按下一个键。如果你想取消这次按键,可以接下去按 C-g,minibuffer 提示 C-x C-g is undefined 也就是说 Emacs 什么都没有执行。C-g 一般都是取消命令,取消按键。如果按了 C-x C-h 就会出现一个帮助 buffer,里面是以 C-x 开头的按键帮助。C-h 是一个帮助按键。如何获得更多的帮助,会在之后的小节介绍。C-c 开头的按键通常是用户自定义的按键和扩展包或扩展模式定义的 按键,同样也可以获得帮助信息。 选定区域,剪切、复制、粘贴 你可以用鼠标拖选一块区域。当然,最好用键盘。按 C-@,minibuffer 提示 Mark set,设定了一个 mark。然后移动光标,这时候你就选定了光标和 Mark 之 间的区域。什么都看不到?你可以按 C-w,这块区域就消失了,C-w 是剪切。按 C-x u 可以撤销上一次的剪切,C-x u 是取消。你肯定想看到你到底选中了哪块 区域,可以按M-x 然后输入 transient-mark-mode ,回车。这次你就可以看到你选中了哪块区域了。M-x 是执行 Emacs 命令。 Emacs 有一个很有用的功能,在你选定了区域之后按 C-x C-x 可以交换光标 (point) 和 Mark 的位置,这样你就可以修改调整你选定的区域了。 按 C-g 取消选定的区域。 重新用 C-@ 选定一块区域,按 M-w,这是复制,移动光标到别处,按 C-y,这是粘贴。紧接着再按一次 M-y,这时可以看到粘贴的内容变成了上一次剪切的内容。 再按 M-y 又变成之前一次复制的内容。 C-k 可以剪切一行。连续的 C-k 会把剪切的内容放在一起,一次 C-y 就可以把之前的 n 行一起贴上。 C-x u 可以撤销,不过这个撤销和常规 windows 程序的撤销不太一样。按了 C-x u 撤销后,如果移动一下光标,再按一次 C-x u,可以撤销之前的撤销命令。 这样相当于是 redu。 小结: C-@ 选定区域 C-w 剪切 M-w 复制 C-y 粘贴 M-y 粘贴剪贴板之前的内容 C-k 剪切一行 C-x u 撤销 查找 其他 windows 程序的查找通常会跳出一个对话框,这很讨厌,会遮住文本内容, 有时候我就会忘了我到底要找什么。Emacs 就不会这样。按 C-s 是查找, minibuffer 提示 I-search: 接下来你可以输入你要找的词,比如想找 windows, 输入 w,Emacs 开始找到 w,光标移动到 w 上,接着输入 i,Emacs 找到 wi, 并注意到Emacs 会同时高亮所有的 wi,接着输入 n,Emacs 找到 win,等等。这 就是 incremetal search,它的好处是,你想要找 windows,但实际上你只要输 入 win 就能定位到 windows 上了,不需要继续输入 dows 了。继续按 C-s 找下一个匹配的。C-r 往回查找。按回车或者方向键结束本次查找,再按两次 C-s 重复上次查找,按 C-g 取消查找,光标回到原处。 C-s 或 C-r 也可以用作光标定位,比如想要移到前面 Emacs 处,就可以 C-r Emacs,效率很高,可以说是指哪打哪。 如果查找输入的全是小写,那么这次查找是大小写不敏感的,如果输入字符中有 大写字母,那么这次查找就是大小写敏感的。很智能吧。 C-M-s 或 C-M-r 是正则表达式查找。或者在 C-s 之后按 M-r 也可以切换到正则 表达式查找。这里不仔细讲 Emacs 的正则表达式是怎么样的。 替换 M-% 是 query-replace,输入查找内容和替换内容,然后 Emacs 会询问是否要 替换,y 替换,n 不替换,! 替换光标之后所有,q 结束,? 可以得到帮助。 Emacs 的替换有一个很好的特性,可以只在选定区域内进行替换。这样就可以放心大胆地使用 ! 替换所用,而不用担心超出范围了。 C-M-% 是正则表达式的替换。 小结: C-s 和 C-r 向前向后查找 C-% 替换 C-M-s 和 C-M-r 向前向后正则表达式查找 C-M-% 正则表达式替换 寻求帮助 Emacs 提供了极其强大的帮助系统。 C-h t 是一个 tutorial,现在也有不同语言的 tutorial。按 M-x 输入 help-with-tutorial-spec-language 可以选择不同的语言。按 Emacs 可 以帮你补全命令。按两次 会有补全的提示。 C-h a 是 apropos command,你可以输入几个简单的单词,Emacs 可以帮你找到 相应的命令,这个帮助非常好用。比如你想把一个单词全部大写,但不知道该怎 么做,可以 C-h a 输入 upcase word 或者 up word,Emacs 就会找到几个命令, 其中一个是 upcase-word,并且对应的按键是 M-u,你只要把光标移动到单词前按 M-u 就可以了。 C-h k 是描述某个按键会执行什么。例如你要看看 M-; 是干什么的,按 C-h k, 接着按 M-; 你就会看到 M-; 会运行 comment-dwim,dwim 是 do what i mean 的缩写,这个命令会注释或反注释你选定的区域,如果没有选定区域,会在这一行后面加上注释。很聪明的命令吧。 C-h c 简单描述某个按键执行什么。 C-h f 描述某个函数 C-h v 描述某个变量 C-h 会提供很多很多帮助信息,C-h ? 会显示有哪些帮助信息。 简单配置 Emacs 有超强的可配置性,1000个人可以有1000种配置,可以有自己的键绑定, 有自定义的函数,有自己喜欢的扩展包。配置放在 home 目录下的 .emacs 里, Emacs 启动的时候会自动读取这个文件。启动 Emacs 后,C-x C-f ~/.emacs 会 打开 .emacs 文件,如果不存在的话就是新建这个文件。home 目录在哪里呢? 可以 M-x getenv home 得到 home 的位置。Linux 系统很好理解。 Windows 系统,会默认放在 C:\Documents and Settings\username\Application Data 下,有几种方法可以指定 home 的位置: 在 我的电脑-属性-高级-环境变量 里添加一个 HOME 环境变量,指定位置。 在注册表 (如果没有 GNU 或 Emacs,添加一个即可) 添加 HOME 字符串变量,值为指定的 home 路径。 Emacs 配置使用的语言是 Elisp,Emacs 附带非常详细的 Elisp 手册,可以通 过 M-x info 得到。配置 .emacs 一般只需要几个简单语句,比如: (setq variable-name value) 设置变量值,例如 (setq transient-mark-mode t) 设置选定区域范围高亮 (require 'extension) 安装一个扩展包。 (load file-name) 使用一个 .el 文件 (global-set-key (kbd C-c f) 'function-name) 全局自定义键绑定 (define-key dired-mode (kbd j) 'dired-next-line) 局部键绑定,只在 dired-mode 起作用 (if ...) 一些简单的判断语句 这里提供一个简单的 .emacs 文件: quick.emacs.el 你可以把它复制到你的 home 目录下并改名为 .emacs 注意有个. 或者用 runemacs.exe -q -l quick.emacs.el 来指定 emacs 使用这个配置文件。 总结 介绍一些文本编辑的基本操作。只是为了说明上手 Emacs 其实很简单,而且几乎每一样操作都有比普通 Windows 文本编辑器更好的特性,比如可以任意调整已选定的区域,更好的复制粘贴机制,更好的撤销机 制,更好的 isearch 查找方式,可以在区域内替换,强大得多的帮助系统,没有任何限制的扩展性。用了几天或几个星期后就会觉得其他的编辑是多么麻烦和弱小。 本文摘自《30分钟Emacs入门》,特此声明。
个人分类: @emacs|5897 次阅读|2 个评论
量子力学无法计算机编程的一个根本性困难
wliming 2010-12-21 21:13
量子力学最核心的内容是不对易的算符运算。一般地,我们可以用矩阵来表达不对易。但是,困难的是,一个量子力学算符通常对应着无穷维的矩阵。比如,我们没有办法用计算机严格表达玻色子或者费米子的产生湮灭算符。所以,计算机实际上是不能严格地表达量子力学的。 严格的量子力学只能存在于人类的大脑中。有意思吧? 当然,对于简单的波函数之类的东西,计算机可以把它们足够准确地计算出来。 我见到过一个MATLAB的量子力学工具箱。我不知道它是不是真的能实现了算符的严格表达。
个人分类: 娱乐|1992 次阅读|2 个评论
我是如何读通别人的VC程序的,兼论教学
热度 1 dulizhi95 2010-12-19 09:31
我是如何读通别人的 VC 程序的,兼论教学 前文说过: 别人写的 VC 程序,十万条语句以上,我不要任何文档及注释行,任何介绍,硬读源代码,就能将软件结构,数据结构,数据库,算法思路,全部读通并推出来,而且时间很快,然后大动干戈,想怎么改就怎么改。以前曾经走过不少地方,不客气地说,尚难发现有人具有这样的功力。那么,这是如何做到的呢? 首先,数据结构、编程思路方面的功力必须强大,此功力不强,无论如何是无法读通别人大而复杂的程序的。再者,数据库、系统结构及其构思运用能力必须强大,否则不可能从系统的角度把握整个软件。 然后,对 VC 本身的结构及其思维逻辑必须掌握透彻。对此我不可能在此详谈,仅举一小例子。曾经遇到一位刚工作的研究生问我:在 VC 中如何做双文档。我当时忍不住笑了:竟有双文档这一概念 ? 其实都是由初学过来的,我当然明白他的意思,他是指如何在 VC 程序已有的 doc-view 对的基础上,再构造另一个具有同样效力、但功能方式完全不同的 doc-view 对。我当时告诉他:你将已有的 doc 类和 view 类各复制一份,改改名字,再将 initinstance 函数中相关 doc-view 对的代码复制一份,改改名字,你就可建立另一个 doc-view 对了。在这个对里,你想怎么设计数据结构及其储存,怎么在 view 里 show 出来,都行。 在具体读程序时,又有不同对待。 前面某博文说过,我自己做面向对象时,往往按面向过程来做:所有成员都是 public ,所有类都在同一平面上(系统构造的除外),而且一个大的函数往往近万条语句,这是典型的面向过程方式。但我能保证自己做的东东最后能运行流畅、性能优良,这才是最重要的!我发现国内的公司开发的软件普遍是面向过程方式,而老美所写的 VC 程序则结构层次严谨,从面向对象的角度非常精炼。所以我在读别人的 VC 程序时,对老美写的,主要从结构入手,搞清各个类的层次关系及其横向关联关系。而对国人所写的 VC ,集中精力读通一两个最大的类,对每个类,又是集中精力读通一两个最大的函数,这样整个程序也就差不多了。 这里我要特别强调,计算机软件专业的学生一个最重要的技能是:读懂别人和模仿别人! 例如,我教 JAVA 课时,我的理念是:学生大一开始学 C 语言,由于什么基础都没有,当然应从最简单的概念语法句型学起,而学 JAVA 的学生往往是大二大三了,此时已掌握了程序的思维方式,具备了一定的编程构思能力,具有了数据结构、数据库、系统构造方面的知识技能,此时再从基本句型学起就大大不高明了。而且, JAVA 作为一个大的开发平台,其拥有的类和函数的数目大得惊人,课堂上不可能一一讲解。所谓授人以鱼不如授人以渔,我的方法是:教学生如何读懂别人的程序,通过别人程序的总体功能及上下文来推敲理解 JAVA 类及其函数的功能及正确用法。即从大到小,由整体理解推敲出小的细节,而不是相反,这样不仅小的句型掌握了,而且别人的编程技巧也学会了,综合构思能力也得到了锻炼和提高。以此让学生先掌握 JAVA 最基本的类和函数,能力具备了,自己就可通过自学用此方法去掌握其他 JAVA 类和函数。
个人分类: 未分类|5549 次阅读|4 个评论
运行简单的IDL脚本
qianlivan 2010-11-8 14:28
没系统学过IDL,基本上是看着别人的程序学的,所以时常有一些最基本的知识都不知道,直到又看到新的例子。以前写一个IDL脚本总是一板一眼PRO xxx开头,END结尾,不管这个脚本如何简单,运行的时候还每每 IDL.com xxx 然后 IDLxxx 今天看到一个算暗晕质量函数的程序包,主程序是Fortran写的,画图用IDL。那个IDL脚本虽然是xxx.pro,不过运行的时候只是 IDL@xxx.pro 一下就可以了。我赶紧看了一下脚本的内容,里面就是些IDL命令,没有什么PRO,END之类的。而且还有shell命令,就以$开头就可以。我试了一下在一个文件test.pro里写 $ls 再在IDL里运行 IDL@test.pro 的时候就和在shell里 ls 一样。 我想这里基本的东西我必然还有忽略。慢慢补上吧。
个人分类: 总结|17024 次阅读|0 个评论
VC学习经验总结-------我的VC之路
dulizhi95 2010-10-31 09:36
VC 学习经验总结 ------- 我的 VC 之路 在美学计算机的中国学生,大都拿了个 Master 就去找工作,我也是如此。倒是面试过几家大公司,可人家与我口语一对话,就基本上准备否了(其实按我的情况,应很适合去包含复杂计算的大公司做算法设计,只是口语不行推销不了自己那也没办法)。后来去一小公司面试,不料碰到一在美同校比我早毕业的女同学,我曾对人称之为整个本地区中国女孩里的第一位。她马上告诉我,她先生在这里负责 VC 组,她先生是我在国内的校友,比我晚几届,但早到美国,他们肯定帮我的忙,录用应该问题不大。老板也是这样说, Chinese 之间好沟通,若录用以后就在他手下做。几天后有电话来通知我去上班。 我当时的情况是,复杂思路的构思能力很强大,用 C 编写调试很复杂的程序也很溜,但 VC 的确一窍不通。在我那位校友老弟(我称他为师傅)手下做 VC ,主要是几个软件的维护,每个软件约十万条语句大小。后来读通了那几个程序后,我发现老外的面向对象程序写得真漂亮、精炼!而我自己的面向对象程序往往按面向过程来写。刚开始,师傅几乎是一步一步教我学 VC 的,很快要我加一些小功能,告诉我在什么地方加代码,在什么地方取数据,将数据传给谁等。当然我进展飞快是自然的。但,半年之内,我一直离不开师傅,关键是出了较麻烦的 Bug 搞不动。最后多次到这样的地步:我说肯定不是我的问题,是系统的问题,我的程序不可能有问题,但师傅帮我一调,结果还是我的问题! 在师傅手下做一直很轻松愉快,也很自由,我是一有问题就跑到他办公室去找他,由于互相理解对方都极快,随后往往又谈笑一番,以至于旁边办公室的老美看到这两个老中这么快乐,都投来羡慕的目光。不过,也有过一次与师傅大吵的经历。那天他不知怎么心情不好,很粗暴地训斥我。尽管师傅有恩于我,且是我的顶头上级,但杜某从来受不得气,当即以粗暴和高声与他对干,他那位美丽出众的太太就在旁边办公室,同学近一年她当然很了解我:她先生 VC 厉害,但吵架绝不是我的对手。她赶忙跑过来,也不作声,只是微笑着望着我们俩,两个大男人立马熄了火。这是唯一一次受师傅训斥,他当然也明白,这样进展快的徒弟是不应挨训的。 总之,在这个小公司,我达到了能将 VC 掌控自如的地步,以及:别人写的 VC 程序,十万条语句以上,我不要任何文档及注释行,任何介绍,硬读源代码,就能将软件结构,数据结构,数据库,算法思路,全部读通并推出来,而且时间很快,然后大动干戈,想怎么改就怎么改。在此,向师傅夫妇表示永远的怀念并致祝福! 后来在国内一公司,有一软件,十万条语句大小,市场很火(加硬件后),我去后要我:解决 Bug 问题;加功能;改进性能。原开发组已有几人跳槽,没有文档,非结构化维护,但集成汇总的那位还在公司,在另一部门。我们的部门经理告诉我:先请那位汇总的来跟我详细讲一遍,再给我三个月的时间熟悉软件,再开始正式改。我当时根本不知道软件啥样,只是心想,什么不得了的软件我需要花三个月才能读懂。故当即脱口而出,讲解没有必要,只要他将运行环境给我装好,我硬读源代码就可以了,我最多三个星期就足够了(后只用了一个星期)。我举此例是想说明,读懂别人程序的能力是多么的重要,亦是自我培训的目标。 这里不可能详细谈 VC ,只给几点经验小结: 1, 首先,思路是核心的核心,有了思路能力一切都好办,否则概念背的再多也没用。 2, VC 几个主要类之间的关系,各个类之间复杂的数据传递,是基础,经常碰到一些高年级的学生 C++ 的这些都有困难。前面说的那个国内公司,一个刚毕业的研究生,叫他在程序中加一简单的小功能,他不知在哪里动手,长时间就是加不进。关键是不知在正确的地方取数据,并传递数据。 3, 学会读懂别人的程序是重中之重,有了这个能力就有了一切,关键是先集中精力读懂一两个较好的范例。 4, VC 的底层系统代码是可见的,能读懂它,并使他为你所用,是提高 VC 功力的重要一步。 5, 功力不强时,遇到大而复杂的程序,关键是 Bug 难处理,这时候,有一个好的师傅是非常必要的。
个人分类: 未分类|5238 次阅读|4 个评论
用IDL生成某个分布的二维数组
热度 1 qianlivan 2010-10-27 14:27
假定把一个多维(这里说二维的)数组的指标看作坐标,要让每个元素表示某个函数在相应坐标的值应该怎么办?循环当然是可以的,不过其实没有必要,因为这些坐标都是有规律地排列的,IDL自有处理的方法。 对于一维数组而言,IDL自然就可以生成一个数组,每个元素的值就是其指标值。 IDL a = lindgen(n) 有了这样一个数组,下面的操作就和操作一个元素是一样的,比如要生成一个存指标的平方值的数组。 IDL b = a^2 那么对于二维数组应该怎么办呢?我想到的办法是生成两个数组,一个数组的每个元素存其行指标,另外一个数组的每个元素存其列指标。具体实现可以作如下操作。 IDL a = lindgen(n,m) IDL y = a/n IDL x = a-y*n 如此之后将x和y两个和a大小相同的数组当作a的x坐标和y坐标处理就可以了。比如要生成一个高斯函数。 IDL gauss = exp(-(x^2+y^2)) 多维数组可以类推。这样处理可以比循环快很多,尤其是多维的时候,不过显而易见,存储量增大了很多,这就是代价。
个人分类: 总结|10396 次阅读|1 个评论
给学生的一封信
metanb 2010-10-18 15:41
【按:这是给学生的一封信,强调编程的若干方面。】 XXX: 你的程序(***)计算出的第一层误差很大,我暂时查不出问题出在 哪里。 目前,你需要进一步改善程序,之后才能查找问题的原因。你按照 以下的提示改写程序 test.m程序是用来调用其他子程序以及给出初始的参数,不要把计算 磁场的代码放在这里。 计算磁场的代码应当是单独的子程序!为了一时的方便而避开子程序 是很不明智的做法。 所谓子程序,无非是一个具有输入变量和输出变量的独立系统,这个 系统通过输入变量和输出变量来与外部世界交换信息。一个子程序也 可能会调用其他子程序。一般来说,如果一段程序比较长,就应考虑 将它变成子程序。特别是,重复的代码要用子程序来代替。 设计子程序只有三步: 1. 我们想得到什么,就把什么作为输出; 2. 给出这个子程序的名称,它要能告诉读者这个子程序可以做什么事情; 3. 开始编写子程序的代码,将需要的条件作为输入。 对于磁场计算来说: 1. 我们想得到磁场,这磁场是用边界元方法算出的, 可以给这磁变量场命名为:bxbem, bybem, bzbem。这就是输出 变量。 这里的磁场每个分量保存到一个三维数组中,它可以看作由若干层 二维数组构成。你可以参考read3d的输出变量的数据格式。 2. 这个子程序的名称可以定为get_lfffbem。 3. 计算磁场需要的条件有:边界条件、法向导数、alpha值、层数、 每层对应的高度,等等,这些都可以从外部输入,所以要作为输入变量。 子程序中的输入、输出变量都要给出注释,说明他们的用途。另外也要 扼要地说明子程序的用途。总之,要尽量使读者容易看懂程序。 最后,不要使用ss 或sss 这种变量。写程序也好,写文章也好,你 要把它当成是写诗或是谱曲,要把它当作你的作品。 总之,我希望你在做研究的时候是在追求某种美好的事物,它应该是高于 生活的东西,而完成这件事情后,顺便拿到毕业证和学位证。(如果你要找 工作,人们看重的将是你的作品,或者说,你应该去那个看重你的作品的 地方去工作。) 李毅伟
个人分类: 团队建设|3139 次阅读|1 个评论
NotePad++:记事本的替代程序
zjlcas 2010-9-18 16:13
Notepad++是开源的文本程序,是用C++编写的。目前只能在Windows上运行。NotePad++是小巧的编辑器,最新版本5.7.1的安装文件仅为3.88M.但是其功能确是十分强大的,占用系统资源很低而运行速度很快。 这个软件的特点,这里简要介绍一下: 首先,NotePad++支持几十种编程语言的高亮显示,如著名的C,C++,C#,Fortran,Java,Python,Perl,SQL,shell,PHP,javascript,Html,TeX等等。初次接触NotePad++是2009年5月。当时正准备找一个R程序脚本的编辑器,很多人推荐用TinnR,但是TinnR虽然具有R的语法高亮功能,但是编辑风格与记事本有较大不同,我很难适应其风格。后来看到论坛上有人介绍NotePad++与NppToR,不但能实现R的语法高亮功能,也能可以一键将当前脚本输送到R-console中。小巧的软件,完备的功能让人兴奋不已。应大量用户的要求,NotePad++新近增加了R语言的高亮显示,使得R用户能方便得编写R的脚本及程序。 NotePad++的TextFX具有出色的文本编辑和转换功能。TextFX是嵌入到NotePad++中的模块之一,能够十分方便的进行文本的大小写的转换,行转换,编码的转换,删除空白行,删除多余的空格等等,并且支持正则表达式。 NotePad++的Plugins具有扩展功能。其中Aspell模块具有检查拼写的功能,配合GNU的aspell软件,能将拼写错误的单词及时找出,并依据用户的选择作出相应的替换。NppExport能够将高亮显示的结果导出成rtf,html等多种格式。Compare模块可以比较两个文件的异同。如果对新版本的程序进行了修改,想知道修改在哪些地方,又不想用庞大的svn软件,Notepad++是一个不错的选择。 当然,NotePad++还有记录Macro的功能,同时搜寻打开的所有文件中的某一字段功能等,在此不一一列举了。 如果你还没有试过NotePad++,那么可以先试一试,估计大多数人,即使不是程序员,都会喜欢上这个小巧灵活,功能强大的软件。 NotePad++的地址 http://notepad-plus-plus.org/
个人分类: 科研笔记|11054 次阅读|5 个评论
跨学科工作笔记
zany 2010-8-1 21:05
高温假虽然还没有结束,但工作要正式开始了。做事没有计划性,虎头蛇尾是我的一大弊病,为了严格监督自己的进度,同时也考虑到与各老师同学交流,在此开辟工作笔记系列。 今天的任务是理清模型思路,收集各计算公式,对计算的每一个步骤理解精准。 以下为论文 Interfacial Forces, Average Pore Size, and Pore Size Distribution of Ultrafiltraction Membrane, Kam Chan, Takeshi Matsuura and S. Sourirajan, Ind. Eng. Chem. Prod. Res. Dev. 1982.21附录中提到。 介绍部分我认为重要的:孔流模型用在ployethylene glycol(聚乙二醇PEG)
个人分类: 科研路|13 次阅读|0 个评论
C++操作注册表
xirongguo 2010-7-30 10:47
今天终于把安装打包中的最后一步搞定了哈,写了个小程序实现注册表中环境变量的修改和创建,主要有以下几个关键步骤: 1.引入必要的头文件及库文件 #includeWindows.h #pragma comment( lib, advapi32.lib ) 2. 得到要操作的注册表键的句柄 HKEY hk; LONG flag = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, hk); 3.读取相应项的值 RegQueryValueEx(hk, keyName, 0, type, reinterpret_castLPBYTE(szResult), size); 需要注意szResult必须为WCHAR类型数据,才能保证数据传输的正确性 4.修改和创建相应的项 RegSetValueEx(hk, newKey, 0, type, reinterpret_castLPBYTE(path), MAX_LOADSTRING); RegSetValueEx(hk, keyName, 0, type, reinterpret_castLPBYTE(szResult), MAX_LOADSTRING); 注意最后的字符数一定要足够大,不然会写不全 在实现过程中,关于字符的转换花费了很大的精力,因此总结如下: 1.要传递字符数组要用WCHAR类型 2.键值最好用TCHAR类型 3.数值变量最好用DWORD类型 源码
个人分类: 系统工程|4305 次阅读|0 个评论
感受与收获
bliping 2010-7-26 15:35
在这里开博很久了,一直都没能动笔写点东西,总觉得自己太稚嫩,下不了笔。时间过得很快,读研究生已经一年了,从开学前的些许憧憬到现在对研究生生活的了解,收获也很多。读大学的时候大多数人应该都是很轻松的,原本以为研究生也会轻轻松松的过来,读了研才知道并不是这样的,忙碌勤奋让人的生活变得更加充实。接触了很多以前从没接触过的东西,学习怎么查找文献,看论文,利用网络资源,随着岁月经历的累积,生活方面也在慢慢提高成熟,体会怎样与同学老师很好的相处。 学习上感觉最大的收获就是编程。大学的时候也学过一些计算机语言,但觉得自己不太感兴趣,学的也不好,总觉得编程是件非常难的事情,一直挺发怵的。直到上个学期,开了两门数值计算方法的课,在课堂上需要把老师讲的算法掌握,课后再上机编程,进一步理解算法。一开始真的特别头疼,编程基础实在很差,现在又是开始自学,后来通过自己的一些摸索,加上 和同学 老师的讨论,慢慢的自己也能独立编出一些程序了。我的感受就是先把算法步骤理清楚,在纸上有个大概的想法,只要想法有了,编出来不会费太多时间,但是后面的调试程序可能要花很长时间,其中与同学老师讨论特别让我受益匪浅,有时自己看很久看不明白的问题,大家一起讨论一下,也许就很快领悟了,这也让我体会到团队精神的力量。由于我的导师这个方向只有我一个学生,能与同学讨论的机会并不多,因为我接触的问题他们没有学并不了解,所以有时一个问题会搁置很多天找不出答案,真的非常感谢我的导师,他花了很多时间精力来帮助我。印象最深的就是上次编的那个边界元解积分方程的程序,出来的结果总是不让人满意,我找了很久也找不出问题,老师不辞辛苦的帮助我调试,甚至有时会工作到深夜,后来找出错误,是个很小的转置的问题,越小才会越隐蔽越难调试出来,老师认真负责严谨的态度特别让我感动。让我领悟到以后编程一定要更加注意一些细节,不然会给后面的调试造成更大的麻烦。现在慢慢的也能体会到编程的一些乐趣了,每当工作有了一些的突破,就特别开心,觉得很有成就感,我觉得这是一个很好的状态。 现在有很多人觉得读研究生没用,我不这样认为,我觉得经历也是种财富,这种经历让我认识了很多优秀的人,从他们身上学到很多东西,对自己的素质学术修养也有一定的提升,要努力让自己充实忙碌起来,到毕业的时候不要因碌碌无为而后悔。
个人分类: 未分类|4804 次阅读|3 个评论
全国计算机教学和英语教学很失败
wliming 2010-7-21 18:09
当前,各大学基本上都为每个理科学生开设C语言之类的课程,有些大学生还要参加什么程序员考试。然而,从我们每年招收的研究生以及本科毕业论文的情况来看,会编程的学生几乎没有。 另一个彻底失败的教学是英语。全国学生在英语上花费的精力之大是世界罕见的,然而,掌握了英语口语和写作技术的学生少得可怜。 这两门课程的教学花费了巨大的国家教育资源,却收效甚微,如此失败的教育是不可容忍的。希望国家有关部门高度重视如此严峻的教育问题。 根据我个人的观察,我们这个社会有相当部分的人,是学不会计算机编程,学不会英语的。而且,有相当部分的人,其实根本不需要懂计算机编程和英语,比如,中小学教师,甚至相当数量的大学教师,一般工程师,一般的医生,政府工作人员,农民,工人等等。所以,国家不如把计算机教育和英语教育的资源投放到少数相关行业的人员身上,让他们真正掌握计算机编程,吃透英文。
个人分类: 社会|1842 次阅读|7 个评论
基础、机遇、勤奋和成功
热度 1 tangchangjie 2010-6-17 14:27
基础、机遇、勤奋和成功(唐常杰) (此文原名"毕业生寄语之数学、编程和心态版 ”,现根据博友建议,改为此较规范的名称)   六月的校园,鸟语花香,莺飞草长。图书馆旁、教学楼前,师生们正在拍毕业留念照;林荫道上,荷花池畔,学位服的红黄蓝白黑五彩缤纷。这一道特殊的风景线告诉人们,学生的盛大节日----学位授位典礼即将来临。      带着青春的笑意,带着美好的憧憬,带着天将降大任的信心,兴奋的毕业生们请老师们在纪念册上写几句寄语,写祝贺,写鼓励,写人生。现模拟古龙的七种武器,从不同视角,试写了七个版本。分成上下两篇,下篇稍后发出( 点击这里 )。 1 毕业生寄语之数学版:勉励成功   基础、勤奋和机遇,积分路径(人生路线)一个也不能少;千言万语,尽在公式中,不须细释。 2 计算机教师之程序设计语言版:人生---Pascal语言中过程 。 Procedure Life Begin   数据结构和变量定义 -- 今天的毕业;   //创新的编码和艰苦的debug从这里开始.   ….   成长的烦恼;   和熙的春风;   耕耘之辛苦;   丰收之喜悦; ….. End.       说明: 如如果采用C语言,则采用强调返回值的函数void Life( ) { ……..};   与之相比,人生更像Pascal语言的过程。一步步脚印,是一行行编码;践行者编织着憧憬、编织着理想。或并行,或交叉,苦中有乐,乐中含苦;或递归,或迭代,笑中有泪,泪中有笑;人生的过程通过修改全局变量或副作用(side effect )对外界发生影响,而不在End处追求返回的结果,人生的精采与平凡、失败与成功、欢乐与郁闷,全分布在过程中。 3 心理辅导老师之心态版:幸福感,可调可控 离开学校,初入社会,可能会对社会分配转型中的一些问题产生迷茫。需要有一个好的心态。送一个关于幸福感的公式:    幸福感 =∫{ ( 获得量函数(t)+Delta) / 欲望函数(t)} dt,    欲使得上式取值尽量大,须使分母的绝对值小一些,更重要的使得积分面积中没有负数段(如抄袭受罚,曲线是负值运行), 这样,幸福感总值就能积小成大。歌曲“祝你平安”中,“世上总有不平事,洒脱一些过得好”,颇有哲理,“洒脱”的表现方式之一,就是减小分母中的欲望函数绝对值。 评论中,王永林老师问Delta是什么,现解释如下,它是个小的正数,当 获得量函数(t)为负,但绝对值较小于Delta时,分子仍为正,因此,人生中偶尔上个小当,亏了小财等等,幸福感不扣大分。 这个心态版,曾作为片段出现在 “研究生导师的“两怕”及避防体会 --研教散记9” 中, 相关博文 毕业基础、机遇,勤奋和成功》,原名 毕业生寄语之数学、编程和心态版 (本文) 毕业生寄语之双亲版、少侠版及苦乐版 毕业生寄语之物理版和进化版 到了新团队,没有事情做才是最难最难的--兼毕业生赠言 兰花草、年轻朋友来相会与毕业生晚会 其它系列博文的入口 唐常杰博客主页 科学博客主页
个人分类: 人生哲理|13786 次阅读|20 个评论
关于画图软件Supermongo的一点总结
热度 1 qianlivan 2010-5-6 16:20
Supermongo是一些天文工作者常用的画图工具,曾经可以免费获取,但现在好像要收费了。我原来下载过一个版本,现在也不时用一下。 Supermongo的安装可以参考安装文件夹里的sm.install文件。基本就是 $ set_opts 这一步要选一些参数,设定安装路径(包括可被C和Fortran调用的库的路径)。 $ make $ make install 至此就安装完毕了。具体的使用没有太多可说的,用C和Fortran调用Supermongo的库有时候对计算有很大帮助,这样一来就可以在计算的同时可视化了,也就是可以监控计算的过程,出错了可以及时发现。我经常求解微分方程,这个功能对我比较有用。 下面就放一段程序作为示例。编译的时候要做如下操作(路径根据库的位置更改) $ g77 -c bs.f $ g77 -o g77 bs.o -L/home/lqian/local/lib/ -lplotsub -ldevices -lutils -L/usr/X11R6/lib/ -lX11 -o bs 然后就生成了可执行文件bs。 PROGRAM bs INTEGER nvar,nok,nbad REAL*8 EPS PARAMETER (EPS=1.d-12,nvar=4) REAL*8 hmin,h1,x1,x2,ystart(nvar) REAL smx,smmu,smnu,smsigma,smsigmap REAL*8 Omega,Lambda EXTERNAL bsstep,drv COMMON/para/ Omega, Lambda Omega=2.0d0 Lambda=0.0d0 cccccccccccc for plot on screen: if(sm_device(x11 -bg 0).lt.0)then cccccccccccc for plot in file test.ps: c if(sm_device(postfile :SY@: :OF@: equip.ps ). c 1 lt.0)then print*,'Cannot open required device' stop endif call sm_graphics call sm_defvar(TeX_strings,1) call sm_expand(1.2) call sm_limits(0.0,100.0,-0.1,0.1) ! set x,y axises call sm_location(3500,32000,3500,32000) call sm_box(1,2,0,0) call sm_xlabel('x') call sm_ylabel('...') call sm_alpha mu0=0.0d0 nu0=0.0d0 sigma0=0.1d0 sigmap0=0.0d0 x1=0.0D0 x2=0.01D0 ystart(1)=mu0 ystart(2)=nu0 ystart(3)=sigma0 ystart(4)=sigmap0 hmin=0.0D0 OPEN(1,FILE='bs.txt') DO 5 WHILE(x2.LT.1000.0D0) h1=(x2-x1)/10000.0 CALL odeint(ystart,nvar,x1,x2,EPS,h1,hmin,nok,nbad,drv,bsstep) PRINT *,x2,ystart(1),ystart(2),ystart(3),ystart(4) c WRITE(1,*)ystart(1),ystart(2) smx=x2 smmu=ystart(1) smnu=ystart(2) smsigma=ystart(3) smsigmap=ystart(4) call sm_ctype('blue') call sm_ptype(41.,0) call sm_points(smx,smmu,1) call sm_ctype('red') call sm_ptype(41.,0) call sm_points(smx,smnu,1) call sm_ctype('yellow') call sm_ptype(41.,0) call sm_points(smx,smsigma,1) call sm_ctype('green') call sm_ptype(41.,0) call sm_points(smx,smsigmap,1) x1=x2 x2=x1+0.01 5 CONTINUE CLOSE(1) PAUSE END SUBROUTINE odeint(ystart,nvar,x1,x2,eps,h1,hmin,nok,nbad,derivs, *rkqs) INTEGER nbad,nok,nvar,KMAXX,MAXSTP,NMAX REAL*8 eps,h1,hmin,x1,x2,ystart(nvar),TINY EXTERNAL derivs,rkqs PARAMETER (MAXSTP=100000,NMAX=50,KMAXX=200,TINY=1.e-30) INTEGER i,kmax,kount,nstp REAL*8 dxsav,h,hdid,hnext,x,xsav,dydx(NMAX),xp(KMAXX),y(NMAX), *yp(NMAX,KMAXX),yscal(NMAX) COMMON /path/ kmax,kount,dxsav,xp,yp x=x1 h=sign(h1,x2-x1) nok=0 nbad=0 kount=0 do 11 i=1,nvar y(i)=ystart(i) 11 continue if (kmax.gt.0) xsav=x-2.*dxsav do 16 nstp=1,MAXSTP call derivs(x,y,dydx) do 12 i=1,nvar yscal(i)=abs(y(i))+abs(h*dydx(i))+TINY 12 continue if(kmax.gt.0)then if(abs(x-xsav).gt.abs(dxsav)) then if(kount.lt.kmax-1)then kount=kount+1 xp(kount)=x do 13 i=1,nvar yp(i,kount)=y(i) 13 continue xsav=x endif endif endif if((x+h-x2)*(x+h-x1).gt.0.) h=x2-x call rkqs(y,dydx,nvar,x,h,eps,yscal,hdid,hnext,derivs) if(hdid.eq.h)then nok=nok+1 else nbad=nbad+1 endif if((x-x2)*(x2-x1).ge.0.)then do 14 i=1,nvar ystart(i)=y(i) 14 continue if(kmax.ne.0)then kount=kount+1 xp(kount)=x do 15 i=1,nvar yp(i,kount)=y(i) 15 continue endif return endif if(abs(hnext).lt.hmin) pause *'stepsize smaller than minimum in odeint' h=hnext 16 continue pause 'too many steps in odeint' return END SUBROUTINE bsstep(y,dydx,nv,x,htry,eps,yscal,hdid,hnext,derivs) INTEGER nv,NMAX,KMAXX,IMAX REAL*8 eps,hdid,hnext,htry,x,dydx(nv),y(nv),yscal(nv),SAFE1,SAFE2, *REDMAX,REDMIN,TINY,SCALMX PARAMETER (NMAX=50,KMAXX=8,IMAX=KMAXX+1,SAFE1=.25D0,SAFE2=.7D0, *REDMAX=1.d-5,REDMIN=.7D0,TINY=1.d-30,SCALMX=.1D0) CU USES derivs,mmid,pzextr INTEGER i,iq,k,kk,km,kmax,kopt,nseq(IMAX) REAL*8 eps1,epsold,errmax,fact,h,red,scale,work,wrkmin,xest,xnew, *a(IMAX),alf(KMAXX,KMAXX),err(KMAXX),yerr(NMAX),ysav(NMAX), *yseq(NMAX) LOGICAL first,reduct SAVE a,alf,epsold,first,kmax,kopt,nseq,xnew EXTERNAL derivs DATA first/.true./,epsold/-1.D0/ DATA nseq /2,4,6,8,10,12,14,16,18/ if(eps.ne.epsold)then hnext=-1.d29 xnew=-1.d29 eps1=SAFE1*eps a(1)=nseq(1)+1 do 11 k=1,KMAXX a(k+1)=a(k)+nseq(k+1) 11 continue do 13 iq=2,KMAXX do 12 k=1,iq-1 alf(k,iq)=eps1**((a(k+1)-a(iq+1))/((a(iq+1)-a(1)+1.)*(2*k+ *1))) 12 continue 13 continue epsold=eps do 14 kopt=2,KMAXX-1 if(a(kopt+1).gt.a(kopt)*alf(kopt-1,kopt))goto 1 14 continue 1 kmax=kopt endif h=htry do 15 i=1,nv ysav(i)=y(i) 15 continue if(h.ne.hnext.or.x.ne.xnew)then first=.true. kopt=kmax endif reduct=.false. 2 do 17 k=1,kmax xnew=x+h if(xnew.eq.x)pause 'step size underflow in bsstep' call mmid(ysav,dydx,nv,x,h,nseq(k),yseq,derivs) xest=(h/nseq(k))**2 call pzextr(k,xest,yseq,y,yerr,nv) if(k.ne.1)then errmax=TINY do 16 i=1,nv errmax=max(errmax,abs(yerr(i)/yscal(i))) 16 continue errmax=errmax/eps km=k-1 err(km)=(errmax/SAFE1)**(1./(2*km+1)) endif if(k.ne.1.and.(k.ge.kopt-1.or.first))then if(errmax.lt.1.)goto 4 if(k.eq.kmax.or.k.eq.kopt+1)then red=SAFE2/err(km) goto 3 else if(k.eq.kopt)then if(alf(kopt-1,kopt).lt.err(km))then red=1./err(km) goto 3 endif else if(kopt.eq.kmax)then if(alf(km,kmax-1).lt.err(km))then red=alf(km,kmax-1)*SAFE2/err(km) goto 3 endif else if(alf(km,kopt).lt.err(km))then red=alf(km,kopt-1)/err(km) goto 3 endif endif 17 continue 3 red=min(red,REDMIN) red=max(red,REDMAX) h=h*red reduct=.true. goto 2 4 x=xnew hdid=h first=.false. wrkmin=1.d35 do 18 kk=1,km fact=max(err(kk),SCALMX) work=fact*a(kk+1) if(work.lt.wrkmin)then scale=fact wrkmin=work kopt=kk+1 endif 18 continue hnext=h/scale if(kopt.ge.k.and.kopt.ne.kmax.and..not.reduct)then fact=max(scale/alf(kopt-1,kopt),SCALMX) if(a(kopt+1)*fact.le.wrkmin)then hnext=h/fact kopt=kopt+1 endif endif return END SUBROUTINE mmid(y,dydx,nvar,xs,htot,nstep,yout,derivs) INTEGER nstep,nvar,NMAX REAL*8 htot,xs,dydx(nvar),y(nvar),yout(nvar) EXTERNAL derivs PARAMETER (NMAX=50) INTEGER i,n REAL*8 h,h2,swap,x,ym(NMAX),yn(NMAX) h=htot/nstep do 11 i=1,nvar ym(i)=y(i) yn(i)=y(i)+h*dydx(i) 11 continue x=xs+h call derivs(x,yn,yout) h2=2.*h do 13 n=2,nstep do 12 i=1,nvar swap=ym(i)+h2*yout(i) ym(i)=yn(i) yn(i)=swap 12 continue x=x+h call derivs(x,yn,yout) 13 continue do 14 i=1,nvar yout(i)=0.5*(ym(i)+yn(i)+h*yout(i)) 14 continue return END SUBROUTINE pzextr(iest,xest,yest,yz,dy,nv) INTEGER iest,nv,IMAX,NMAX REAL*8 xest,dy(nv),yest(nv),yz(nv) PARAMETER (IMAX=13,NMAX=50) INTEGER j,k1 REAL*8 delta,f1,f2,q,d(NMAX),qcol(NMAX,IMAX),x(IMAX) SAVE qcol,x x(iest)=xest do 11 j=1,nv dy(j)=yest(j) yz(j)=yest(j) 11 continue if(iest.eq.1) then do 12 j=1,nv qcol(j,1)=yest(j) 12 continue else do 13 j=1,nv d(j)=yest(j) 13 continue do 15 k1=1,iest-1 delta=1./(x(iest-k1)-xest) f1=xest*delta f2=x(iest-k1)*delta do 14 j=1,nv q=qcol(j,k1) qcol(j,k1)=dy(j) delta=d(j)-q dy(j)=f1*delta d(j)=f2*delta yz(j)=yz(j)+dy(j) 14 continue 15 continue do 16 j=1,nv qcol(j,iest)=dy(j) 16 continue endif return END SUBROUTINE drv(X,Y,DYDX) IMPLICIT NONE INTEGER NMAX PARAMETER (NMAX=50) REAL*8 X,DYDX(NMAX),Y(NMAX) REAL*8 mu,nu,sigma,sigmap REAL*8 dmudx,dnudx,dsigmadx,dsigmapdx REAL*8 Omega,Lambda COMMON/para/ Omega, Lambda mu=Y(1) nu=Y(2) sigma=Y(3) sigmap=Y(4) IF(DABS(X).LT.1.0d-8) THEN dmudx=(Omega**2*dexp(-nu)*sigma**2+sigma**2+Lambda/2.0*sigma**4) 1*x*dexp(mu) dmudx=(Omega**2*dexp(-nu)*sigma**2-sigma**2-Lambda/2.0*sigma**4) 1*x*dexp(mu) dsigmadx=sigmap dsigmapdx=-dexp(mu-nu)*Omega**2*sigma+dexp(mu)*(1+Lambda*sigma** 12)*sigma ELSE dmudx=(Omega**2*dexp(-nu)*sigma**2+dexp(-mu)*sigmap**2+sigma**2 1+Lambda/2*sigma**4)*x*dexp(mu)-(dexp(mu)-1)/x dnudx=(Omega**2*dexp(-nu)*sigma**2+dexp(-mu)*sigmap**2-sigma**2 1-Lambda/2*sigma**4)*x*dexp(mu)+(dexp(mu)-1)/x dsigmadx=sigmap dsigmapdx=((sigma**2+Lambda/2*sigma**4)*x*dexp(mu)-(dexp(mu)-1) 1/x-2/x)*sigmap-dexp(mu-nu)*Omega**2*sigma+dexp(mu)*(1+Lambda* 2sigma**2)*sigma; ENDIF DYDX(1)=dmudx DYDX(2)=dnudx DYDX(3)=dsigmadx DYDX(4)=dsigmapdx RETURN END 有耐性看完此文的人的福利: http://www.lamost.org/~yzhao/soft/plotsoft/sm-2.3.1.tar.gz
个人分类: 总结|8469 次阅读|2 个评论
贝塞尔函数及其编程和书籍
热度 3 zuozw 2010-5-1 22:49
贝塞尔 函数 ( Bessel function, 又称柱函数 ) 是一类在各工程领域中有着广泛应用的特殊函数。贝塞尔函数是贝塞尔方程 ( 一个二阶常微分方程 ) 的解。 一般有三类贝塞尔函数 1 、第一类贝塞尔函数 (Bessel function of the first kind) J v (x) 2 、第二类贝塞尔函数 (Bessel function of the second kind), 又称诺依曼函数( Neumann function ) :Y v (x)( 或 N v (x)) 3 、第三类贝塞尔函数( Bessel function of the third kind ),又称汉克尔函数( Hankel function ) : H 1 v (x) 和 H 2 v (x) 。 当贝塞尔方程为变形贝塞尔方程 ( 虚宗量贝塞尔方程 ) 时,方程的解一般有两类 1、 变形第一类贝塞尔函数( modified Bessel function of the first kind ) I v (x) 2、 变形第二类贝塞尔函数( modified Bessel function of the second kind ) K v (x) 另外应用比较多的函数还有球贝塞尔函数 (Spherical Bessel functions) 、艾里函数 (Airy functions )等等。由于贝塞尔函数的广泛应用,很多软件都提供了现成的函数供用户使用。 Mathematics :提供了比较多的 Bessel 函数。如: Bessel 函数 BesselJ BesselY BesselI BesselK 球体 Bessel 函数 SphericalBesselJ SphericalBesselY Hankel 函数 HankelH1 HankelH2 SphericalHankelH1 SphericalHankelH2 Airy 函数 AiryAi AiryAiPrime AiryBi AiryBiPrime Kelvin 函数 KelvinBer KelvinBei KelvinKer KelvinKei Struve 函数 StruveH StruveL AngerJ WeberE 零函数 BesselJZero BesselYZero AiryAiZero AiryBiZero Matlab :提供了五个函数 besselj 、 bessely 、 besselh 、 besseli 和 besselk 分别对应第一类 Bessel 函数、第二类 Bessel 函数、第三类 Bessel 函数、第一类变形 Bessel 函数和第二类变形 Bessel 函数。语法 besselj(nu,z) : nu 为函数的阶次,可以不为整数但必须为实数。 z 为函数的变量,可以为复数。还有 besselj(nu,z,1) 语法,可查询帮助。其他函数除了 besselh 有些不同外,基本类似。至于球函数、 Airy 函数等可通过这个函数来构造实现。 Excel :提供了四个函数,即: BESSELJ 、 BESSELY 、 BESSELI 、 BESSELK 。 语法: BESSELJ (x,n) ;其中, x 为参数值, n 为函数的阶数。如果 n 非整数,则截尾取整。即 Excel 中只能计算整数阶次的 Bessel 函数。其他函数类似。 关于贝塞尔函数的专业书籍有: 中文 刘颖,《圆柱函数》国防工业出版社, 1983 。 奚定平,《贝塞尔函数》高等教育出版社和施普林格出版社, 1998. 英文 George Neville Watson 《 A Treatise on the Theory of Bessel Functions 》 Cambridge University Press , 1995(1944 , 1922) 最经典的一本书。 BG Korenev 《 Bessel Functions and Their Applications 》 CRC 2002. Milton Abramowitz, and Irene A. Stegun 《 Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables 》 Dover Publications 1964. I.S. Gradshteyn, I.M. Ryzhik, A Jeffrey, D Zwillinger 《 Table of integrals, series and products 》 (Seventh Edition) Academic Press 2007.
个人分类: 科研心得|12512 次阅读|7 个评论
数值逼近求解线性常微分方程
qianlivan 2010-4-26 10:51
线性微分方程的求解方法很多,直接积分可以得到很高的精度。但是尝试一下用数值逼近的方法也是很有意思的。 下面以用Chebyshev多项式展开求解方程(x= 的一段) dy/dx=y y(0)=1 为例说明这个方法。 n阶Chebyshev定义为T(n,x)=cos(n arccos(x))。假设函数y(x)可以近似为 y(x)=\sum^{n}_{i=1} a_i T(i,x) 那么,取需要求解的区间内的n-1个点,加上初始条件,方程可以表示为n元线性方程组,用线性代数的方法可以求解展开系数a_i。 下面是实现这个方法的一段代码 function trychebyshev2(n,t0,t1)% use first n Chebyshev polinomial to approximate % t0:lower boundary; t1: upper boundary A=zeros(n,n); h=t0:(t1-t0)/n:t1; t=h(2:end); for j=1:n-1 for i=1:n A(j,i)=chebT(i,t(j))-chebQ(i,t(j)); % the differential equation is y'=y, y(0)=1 end end for i=1:n A(n,i)=chebT(i,0); end B=zeros(n,1); B(n)=1; x=linsolve(A,B); z=0:0.05:1; f1=0; for i=1:n f1=f1+x(i)*chebT(i,z); end f2=exp(z); plot(z,f1,'r',z,f2,'b'); function y=chebT(n,x) y=cos(n.*acos(x)); function y=chebQ(n,x) y=sin(n.*acos(x)).*n./sqrt(1-x.^2); 用5阶Chebyshev多项式时误差可以达到百分之几。 用10阶Chebyshev多项式近误差就小得多了。 不过,可以看到,在近似区间之外,近似函数和真实函数就完全不同了。
个人分类: 总结|6209 次阅读|2 个评论
简单的flex-java的程序
putin24 2010-4-13 14:48
使用 myeclipse 6.5.1 、 flex builder3.0做一个简单的flex-java的程序。 1 、创建 flex 项目: file - new - flex project 如下图1 Application type 中选 第一个 web application ; Server technology 中选择 j2ee, 勾选 user remote object access service ( 否则无法调用 java) 2 、点 next 按钮 ,下一界面如图2示。 在 J2EE Settings 中, 1) 选择一个 tomcat 服务器,点击 new- 到电脑安装过的 tomcat 安装目录; 2)Context root 设置为 MyFlex( 项目名称 ) ; 3) 指定 flex war file 文件 blazeds.war 的路径,(其作用是用来实现 java 和 flex 间的通信),可从网络上下载 blazeds.war ,然后选择 blazeds.war 存在的目录路径; 4)Compilation options 编译方式中选择 第一个可以节省服务器的开销; 5 ) output folder 与 Content folder 都一样,设置为 Webroot ; 3 、点 next 如图3,然后点 finish 。 4 、在项目上右键 myeclipse - add web project capabilities ,项目已经建好,现在做个 flex 访问 java 的例子。 在 MyFlex.mxml 中添加: mx:Script ! ] /mx:Script !-- mx:RemoteObject destination=Hello id=hlo endpoint=http://localhost:8080/FlexTest/messagebroker/amf result=show(event) /-- mx:RemoteObject destination= Hello id= hlo endpoint= http://localhost:8080/FlexText/messagebroker/amf mx:method name= sayHello result=show(event) / /mx:RemoteObject mx:Panel title= 调用 java width= 415 height= 278 mx:FormItem label= 输入: mx:TextInput id= input / /mx:FormItem mx:FormItem mx:Button label= 调用 click=say() / /mx:FormItem mx:FormItem label= 输出为: height= 79 mx:TextArea id= output width= 262 height= 78 /mx:TextArea /mx:FormItem /mx:Panel 5 、创建 java 文件 package com.test; public class Hello { /** * * @param name * @return */ public String sayHello(String name){ System. out .println(name+ say hello! ); return name+ say hello! ; } } 6 、配置 remote-config.xml 文件,添加: destination id = Hello properties source com.test.Hello / source / properties / destination 7 、通过 tomcat 发布项目 8 、在 myflex.mxml 文件上右键, run as - flex application : 输入 aaaa 点调用 如图4: 图1 图2 图3 图4
个人分类: 生活点滴|3615 次阅读|0 个评论
笔记(十一)IDL三维可视化
qianlivan 2010-4-2 09:56
笔记(十一)IDL三维可视化的一种方法 用TV命令画等值面 pro three fitsname='../gaussfit.fits' a=mrdfits(fitsname) head=headfits(fitsname);read the header of the fits file to a vector nx = fxpar(head,'NAXIS1'); number of elements in the first dimension ny = fxpar(head,'NAXIS2'); nv = fxpar(head,'NAXIS3'); ;a=read_binary('/home/qianl/Software/idl_6.2/examples/data/head.dat',$ ; data_dims= ,data_type=1) b=lindgen(nx,ny,nv) bnz0=b/nx/ny bny0=(b-bnz0*nx*ny)/nx bnx0=b-bnz0*nx*ny-bny0*nx bx=bnx0*1.0d0 by=bny0*1.0d0 bv=bnz0*1.0d0 ;a=exp(-((bx-30.0)/10.0)^2-((by-30.0)/10.0)^2-((bv-30.0)/10.0)^2) shade_volume,a,max(a)/2.0,v,p,/low scale3,xrange= ,yrange= ,zrange= set_plot,'PS' filename='3d_TV.ps' ; set the file name of the output ps file device,file=filename,/COLOR, BITS=8 tv,polyshade(v,p,/t3d) device,/CLOSE end
个人分类: 总结|5810 次阅读|0 个评论
笔记(十)
qianlivan 2010-4-1 23:00
笔记(十)二维高斯分布和高斯聚类的程序 生成两个二维高斯分布随机数样本的组合样本,用混合高斯模型聚类,算出每个点属于每个高斯成分的概率,代码如下,结果如图所示。 %testcluster.m: z1= ; z2= ; z= ; x=gmm(z,2); hold on scatter3(z(:,1),z(:,2),x(:,1),'.'); scatter3(z(:,1),z(:,2),x(:,2),'.'); %axis( ) %view( ); view(-162,-13); hold off print -dpng gmm.png %gmm.m function varargout = gmm(X, K_or_centroids) % ============================================================ % Expectation-Maximization iteration implementation of % Gaussian Mixture Model. % % PX = GMM(X, K_OR_CENTROIDS) % = GMM(X, K_OR_CENTROIDS) % % - X: N-by-D data matrix. % - K_OR_CENTROIDS: either K indicating the number of % components or a K-by-D matrix indicating the % choosing of the initial K centroids. % % - PX: N-by-K matrix indicating the probability of each % component generating each point. % - MODEL: a structure containing the parameters for a GMM: % MODEL.Miu: a N-by-K matrix. % MODEL.Sigma: a D-by-D-by-K matrix. % MODEL.Pi: a 1-by-K vector. % ============================================================ threshold = 1e-15; = size(X); if isscalar(K_or_centroids) % judge if K_or_centroids is a scalar K = K_or_centroids; % K is the number of Gaussian components % randomly pick centroids rndp = randperm(N); % randomly permute the index array 1:N centroids = X(rndp(1:K), :); % centers of the Gaussian components else K = size(K_or_centroids, 1); % size of the first dimension (number of rows) centroids = K_or_centroids; end % initial values = init_params(); Lprev = -inf; while true Px = calc_prob(); % new value for pGamma pGamma = Px .* repmat(pPi, N, 1); % (N by K) matrix pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K); % (N by K) matrix % new value for parameters of each Component Nk = sum(pGamma, 1); % add to a single row (1 by K) pMiu = diag(1./Nk) * pGamma' * X; % (K by D) pPi = Nk/N; for kk = 1:K Xshift = X-repmat(pMiu(kk, :), N, 1); % (N by D) pSigma(:, :, kk) = (Xshift'* ... (diag(pGamma(:, kk)) * Xshift))/ Nk(kk); % (D by D) end % check for convergence L = sum(log(Px*pPi')); if L-Lprev threshold break; end Lprev = L; end if nargout == 1 varargout = {Px}; else model = = init_params() pMiu = centroids; % set the centers of Gaussian components pPi = zeros(1, K); pSigma = zeros(D, D, K); % hard assign x to each centroids distmat = repmat(sum(X.*X, 2), 1, K) + ... repmat(sum(pMiu.*pMiu, 2)', N, 1) - ...% (N by K) matrix 2*X*pMiu'; % pMiu' (D by K) % add the columns to a single column % and creat a large % matrix (N by K) by % tiling % X*pMiu' (N by K) % distmat is an (N by K) % to specify the % distance of every data % point to the K centers = min(distmat, [], 2); % return minimum of every row % labels is the column % numbers for k=1:K Xk = X(labels == k, :); pPi(k) = size(Xk, 1)/N; pSigma(:, :, k) = cov(Xk); % if Xk is a vector, cov(Xk)is % the variance,just set the % K initial (D by D matrix) to the same value end end function Px = calc_prob() Px = zeros(N, K); for k = 1:K Xshift = X-repmat(pMiu(k, :), N, 1); % N by D matrix inv_pSigma = inv(pSigma(:, :, k)); % invert the matrix (D by D) tmp = sum((Xshift*inv_pSigma) .* Xshift, 2); % N element vector coef = (2*pi)^(-D/2) * sqrt(det(inv_pSigma)); Px(:, k) = coef * exp(-0.5*tmp); % the probability end end end
个人分类: 总结|167 次阅读|0 个评论
笔记(九)
qianlivan 2010-4-1 14:52
笔记(九) 一点Matlab知识 isscalar(a)用于判断变量a是不是标量,可以处理多种类型的函数的输入值。 randperm(N)产生一个将数组1:N元素随机排列的数组。 repmat(a,m,n)将a作为一个分块,排列成一个大的矩阵,这个矩阵是a和矩阵ones(m,n)的直积。 cov(A)计算矩阵A的列向量的协方差矩阵,如果A有m列,则cov(A)是m×m矩阵。 画二维高斯函数: mu1= ; Sigma2= ; % 输入均值向量和协方差矩阵 =meshgrid(-3:0.1:1,-2:0.1:4); xy= ; %产生网格数据 p=mvnpdf(xy,mu1,Sigma2); P=reshape(p,size(X)); %求取联合概率密度 surf(X,Y,P)
个人分类: 总结|2524 次阅读|0 个评论
笔记(八)
qianlivan 2010-3-27 20:42
笔记(八)高斯拟合分子云中的团块 function newtfunc,t common temp,a,x,y,v,nx,ny,nv,crpixx,crpixy,crpixv,maxa,$ cdeltax,cdeltay,cdeltav,crvalx,crvaly,crvalv,nx0,ny0,nv0,dbeam,$ vres,offset a0=t phi=t x10=t x20=t delx1=t delx2=t delv=t v0=t alf1=t alf2=t ;;;;;;;;;;;;;;;;;; ;b0=t b0=offset ;;;;;;;;;;;;;;;;;; b=lindgen(nx,ny,nv) bnz0=b/nx/ny bny0=(b-bnz0*nx*ny)/nx bnx0=b-bnz0*nx*ny-bny0*nx bx=bnx0*1.0d0 by=bny0*1.0d0 bv=bnz0*1.0d0 ;weight=exp(-((bx-nx0)/10.0)^2-((by-ny0)/10.0)^2-$ ; ((bv-nv0)/10.0)^2) weight=bx*0.0+1.0 normal=nx*ny*nv*1.0d0-11.0d0 value=a0*exp(-(bx*cos(phi)+by*sin(phi)-x10)^2/(dbeam^2+delx1^2)-$ (-bx*sin(phi)+by*cos(phi)-x20)^2/(dbeam^2+delx2^2)-4.0*alog(2.0)/delv^2$ *(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2)+b0 chi2=total(weight*(value-a)^2+exp(value-a))/normal+$ (((x10-nx0)/dbeam)^2+((x20-ny0)/dbeam)^2+$ ((v0-nv0)/vres)^2)+(a0+b0-maxa)^2 print,'chi2 a0 b0 maxa',chi2,a0,b0,maxa print,'x10 x20 v0',x10,x20,v0 return,chi2 end function grad,t common temp,a,x,y,v,nx,ny,nv,crpixx,crpixy,crpixv,maxa,$ cdeltax,cdeltay,cdeltav,crvalx,crvaly,crvalv,nx0,ny0,nv0,dbeam,$ vres,offset a0=t phi=t x10=t x20=t delx1=t delx2=t delv=t v0=t alf1=t alf2=t ;;;;;;;;;;;;;;;;;;;; ;b0=t b0=offset ;;;;;;;;;;;;;;;;;;;; b=lindgen(nx,ny,nv) bnz0=b/nx/ny bny0=(b-bnz0*nx*ny)/nx bnx0=b-bnz0*nx*ny-bny0*nx bx=bnx0*1.0d0 by=bny0*1.0d0 bv=bnz0*1.0d0 ;weight=exp(-((bx-nx0)/10.0)^2-((by-ny0)/10.0)^2-$ ; ((bv-nv0)/10.0)^2) weight=bx*0.0+1.0 normal=nx*ny*nv*1.0d0-11.0d0 H1=exp(-(bx*cos(phi)+by*sin(phi)-x10)^2/(dbeam^2+delx1^2)-$ (-bx*sin(phi)+by*cos(phi)-x20)^2/(dbeam^2+delx2^2)-4.0*alog(2.0)/delv^2$ *(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2) Yfit=a0*H1+b0 deviate=Yfit-a H2=2.0*deviate H3=(bx*cos(phi)+by*sin(phi)-x10) H4=(-bx*sin(phi)+by*cos(phi)-x20) H5=bv-v0-alf1*(bx-x10)-alf2*(by-x20) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;for test ;H6=(-(bx*cos(phi)+by*sin(phi)-x10)^2/(dbeam^2+delx1^2)-$ ; (-bx*sin(phi)+by*cos(phi)-x20)^2/(dbeam^2+delx2^2)-4.0*alog(2.0)/delv^2$ ; *(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2) ;H6=-4.0*alog(2.0)/delv^2*(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;for test da0=H1 dphi=a0*H1*(-(2.0*H3*((-bx*sin(phi)+by*cos(phi))/(dbeam^2+delx1^2))+$ 2.0*H4*((-bx*cos(phi)-by*sin(phi))/(dbeam^2+delx2^2)))) dx10=a0*H1*(-2.0*H3*(-1.0/(dbeam^2+delx1^2))-4.0*alog(2.0)/delv^2*H5*(-alf1)) dx20=a0*H1*(-2.0*H4*(-1.0/(dbeam^2+delx2^2))-4.0*alog(2.0)/delv^2*H5*(-alf2)) ddelx1=a0*H1*(-2.0*H3^2/(-(dbeam^2+delx1^2)^2)*delx1) ddelx2=a0*H1*(-2.0*H4^2/(-(dbeam^2+delx2^2)^2)*delx2) ddelv=a0*H1*(-4.0*alog(2.0)/delv^3*(-2.0)*H5^2) dv0=a0*H1*(-4.0*alog(2.0)/delv^2*2.0*H5*(-1)) dalf1=a0*H1*(-4.0*alog(2.0)/delv^2*2.0*H5*(-(bx-x10))) dalf2=a0*H1*(-4.0*alog(2.0)/delv^2*2.0*H5*(-(by-x20))) db0=1.0d0 fda0=total(weight*H2*da0+exp(Yfit-a)*da0)/normal $ +2.0*(a0+b0-maxa) fdphi=total(weight*H2*dphi+exp(Yfit-a)*dphi)/normal fdx10=total(weight*H2*dx10+exp(Yfit-a)*dx10)/normal $ +2.0*(x10-nx0)/dbeam^2 fdx20=total(weight*H2*dx20+exp(Yfit-a)*dx20)/normal $ +2.0*(x20-ny0)/dbeam^2 fddelx1=total(weight*H2*ddelx1+exp(Yfit-a)*ddelx1)/normal fddelx2=total(weight*H2*ddelx2+exp(Yfit-a)*ddelx2)/normal fddelv=total(weight*H2*ddelv+exp(Yfit-a)*ddelv)/normal fdv0=total(weight*H2*dv0+exp(Yfit-a)*dv0)/normal $ +2.0*(v0-nv0)/vres^2 fdalf1=total(weight*H2*dalf1+exp(Yfit-a)*dalf1)/normal fdalf2=total(weight*H2*dalf2+exp(Yfit-a)*dalf2)/normal fdb0=total(weight*H2*db0+exp(Yfit-a)*db0)/normal $ +2.0*(a0+b0-maxa) ;print,'grad ',fda0,fdphi,fdx10,fdx20,fddelx1,fddelx2,fddelv,$ ; fdv0,fdalf1,fdalf2,fdb0 return, ;,$ ; fdb0] end function eval,t common temp,a,x,y,v,nx,ny,nv,crpixx,crpixy,crpixv,maxa,$ cdeltax,cdeltay,cdeltav,crvalx,crvaly,crvalv,nx0,ny0,nv0,dbeam,$ vres,offset a0=t phi=t x10=t x20=t delx1=t delx2=t delv=t v0=t alf1=t alf2=t ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;b0=t b0=offset ;;;;;;;;;;;;;;;;;;;;;;;;;;;; b=lindgen(nx,ny,nv) bnz0=b/nx/ny bny0=(b-bnz0*nx*ny)/nx bnx0=b-bnz0*nx*ny-bny0*nx bx=bnx0*1.0d0 by=bny0*1.0d0 bv=bnz0*1.0d0 value=a0*exp(-(bx*cos(phi)+by*sin(phi)-x10)^2/(dbeam^2+delx1^2)-$ (-bx*sin(phi)+by*cos(phi)-x20)^2/(dbeam^2+delx2^2)-4.0*alog(2.0)/delv^2$ *(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2); gaussian component ; without the offset term! ;print,'max gaussian',max(value),a0,$ ; max(exp(-(bx*cos(phi)+by*sin(phi)-x10)^2/(dbeam^2+delx1^2))*$ ; exp(-(-bx*sin(phi)+by*cos(phi)-x20)^2/(dbeam^2+delx2^2))*$ ; exp(-4.0*alog(2.0)/delv^2*(bv-v0-alf1*(bx-x10)-alf2*(by-x20))^2)) return,value end pro gaussclumps4 common temp,a,x,y,v,nx,ny,nv,crpixx,crpixy,crpixv,maxa,$ cdeltax,cdeltay,cdeltav,crvalx,crvaly,crvalv,nx0,ny0,nv0,dbeam,$ vres,offset fitsname='../co12_2.fits' a=mrdfits(fitsname) head=headfits(fitsname);read the header of the fits file to a vector bw = fxpar(head,'BW'); band width freq = fxpar(head,'LINEFREQ'); central frequency nx = fxpar(head,'NAXIS1'); number of elements in the first dimension ny = fxpar(head,'NAXIS2'); nv = fxpar(head,'NAXIS3'); crvalx = fxpar(head,'CRVAL1'); reference value of the first dimension cdeltax = fxpar(head,'CDELT1'); increasement of the first dimension ; in units of degree, when calculate physical ; scale, must changed to arcdegree crpixx = fxpar(head,'CRPIX1'); reference position of the first dimension crvaly = fxpar(head,'CRVAL2'); cdeltay = fxpar(head,'CDELT2'); crpixy = fxpar(head,'CRPIX2'); crvalv = fxpar(head,'CRVAL3'); cdeltav = fxpar(head,'CDELT3'); crpixv = fxpar(head,'CRPIX3'); x=dindgen(nx); y=dindgen(ny); v=dindgen(nv); ;print,1.0/(nx*ny*nv*1.0d0) b=lindgen(nx,ny,nv) bnz0=b/nx/ny bny0=(b-bnz0*nx*ny)/nx bnx0=b-bnz0*nx*ny-bny0*nx bx=bnx0*1.0d0 by=bny0*1.0d0 bv=bnz0*1.0d0 print,max(b) ;a=exp(-((bx-30.0)/10.0)^2-((by-30.0)/10.0)^2-((bv-30.0)/10.0)^2) dbeam=1.0 vres=1.0 for iloop=1,10 do begin maxa=max(a) index=where(a eq maxa) nv0=index /nx/ny ny0=(index -nv0*nx*ny)/nx nx0=index -nv0*nx*ny-ny0*nx print,'maxa nx0 ny0 nv0 ',maxa,nx0,ny0,nv0 a0=maxa phi=0.0 x10=nx0*1.0d0 x20=ny0*1.0d0 delx1=10*1.0d0 delx2=10*1.0d0 delv=10.0d0 v0=nv0*1.0d0 alf1=0.1 alf2=0.1 b0=0.1 ;;;;;;;;;;;;;;;;;;;;;; offset=b0 ;set a constant offset ;;;;;;;;;;;;;;;;;;;;;; t=dindgen(10) t =a0 t =phi t =x10 t =x20 t =delx1 t =delx2 t =delv t =v0 t =alf1 t =alf2 ; t =b0 ;r=amoeba(1.0e-2,SCALE=t,P0=t,FUNCTION_NAME='newtfunc') ;xi=transpose( ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ,$ ; ]) ;powell,t,xi,1.0e-4,fmin,'newtfunc' ; print,'a0, phi, x10, x20 ',t ; print,'delx1, delx2, delv, v0 ',t ; print,'alf1, alf2, b0 ',t dfpmin,t,1.0e-2,fmin,'newtfunc','grad',/DOUBLE,ITMAX=1000 ;print,newtfunc(t) print,'loop ',iloop,' max ',maxa print,'a0, phi, x10, x20 ',t print,'delx1, delx2, delv, v0 ',t print,'alf1, alf2, b0 ',t ,offset print,'residue ',newtfunc(t) a=a-eval(t); substract the gaussian component print,'max component',max(eval(t)) ;print,a if iloop eq 1 then begin para= ] endif else begin para= ] endelse endfor print,para save,file='parameters',para end
个人分类: 读书|240 次阅读|0 个评论
笔记(七)关于命令行直接运行IDL脚本
qianlivan 2010-3-22 09:29
笔记(七)关于命令行直接运行IDL脚本 假设有一个IDL脚本test.pro,内容为 pro test print,1+1 end 现在想直接在shell里运行而不先启动IDL,怎么办?我的土办法是另写一个文件test,内容为 #!/usr/local/idl test 再变为可执行文件。然后,把test.pro里的pro test和end两行注释掉。这样就可以直接敲test了。IDL自动启动,运行test.pro。 如果想执行完直接退出IDL,那么在test.pro中再加一行 exit 就可以了。
个人分类: 总结|14504 次阅读|0 个评论
Matlab和Excel混合编程
zuozw 2010-3-18 17:16
Matlab具有强大的数据计算和处理、图形显示能力;Excel则具有强大的表格处理同时也有强大的数据统计和显示能力。在科研过程中常会同时使用这两款软件,如果实现Matlab和Excel的链接,可以满足实际要求。实现Matlab和Excel的混合编程主要有以下几种方法: 1、 利用 Excel Link (最常用方法 ) Excel Link 是一个在 Windows 环境下实现 Excel 与 Matlab 进行链接的插件。通过连接 Excel 和 Matlab ,实现 Excel 和 Matlab 的数据共享。使用 Excel Link 时,不脱离 Excel 环境直接在 Excel 中调用 Matlab 函数。 具体可参见Matlab帮助或 Excel Link手册 。 2、 利用Excel生成器(Matlab作COM服务器) COM(通用对象模型)是一组面向对象的技术和工具的集合。利用Matlab提供的COM生成器,把Matlab的算法程序生成组件,这些组件可作为独立的COM对象被Excel的Visual Basic使用。具体可参见Matlab COM Builder或者Matlab Builder for Excel工具。 3、 利用Active X控制(Matlab作COM客户端) ActiveX是 Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型。主要利用Matlab中的actxserver函数:actxserver('progid');progid为程序的ActiveX部件的标识符,针对不同的程序有不同的progid。如actxserver('Excel.Application'),然后可利用invoke函数进行一系列操作。 4、 文件导入方法 利用xlsread和xlswrite函数读写Excel文件(也可用fopen、fread和fwrite函数),然后进行数据处理操作。另外,还可以通过菜单File-Import data方法。
个人分类: 科研心得|14763 次阅读|2 个评论
笔记(五)
qianlivan 2010-3-10 16:23
笔记(五)模拟中性氢质量函数 在这里附上模拟某个极限流量时观测到的河外星系中性氢的质量函数的代码。 z=0.1; %redshift rmax=zD(z);% maximum distance corresponding to maximum redshift thetastar=8.6e-3;% normalization of the mass function V=200.0; % line width in km/s f=0.7; % factor accounting for the line shape Slim=3.0e-5; % flux limit, in Jy dx=3.906; % length of side of a volume element, in Mpc dy=3.906; dz=3.906; volume=dx*dy*dz; % volume element, in Mpc^3 local=26.0; % local latitude dec1=local+30.0; % range of relevant declination dec2=local-30.0; %a=load('densmap_250_G10.0.dat'); x=a(:,1); % coordinate y=a(:,2); z=a(:,3); b=a(:,4); % % %max(b); % % %maxb=23.5072;% the maximum of the density contrast % % b=b./maxb; % = meshgrid(-250:1:250, -250:1:250, -250:1:250); % % v = x .* exp(-x.^2 - y.^2 - z.^2); % slice(x,y,z,a, ,2, ) n=length(b); MHI= ; NHI=zeros(1,5); M=6:10; M=M+0.5; for i=1:n if mod(i,1000)==0 i end V=sgc2ec(x(i),y(i),z(i)); ra=V(1); dec=V(2); r=sqrt(x(i).^2+y(i).^2+z(i).^2); if decdec1decdec2rrmax % if in the right dec and redshift range ngal=volume*(b(i)+1.0)*thetastar; if ngal~=0 mgal=floor(ngal); xgal=mgal+((ngal-mgal)rand());% if the number is not integer % the decimal part is treated as % probability if xgal0 temp=GenRanNum2(xgal); % generate a sample with the distribution of the mass function for i=1:xgal S=temp(i)./(2.356e5.*r.^2.*V.*f); if SSlim % if can be detected MHI= ; % add to the whole sample Dist= ; j=ceil(log10(temp(i))-6); NHI(j)=NHI(j)+1; end end end end end end save simulation_NHI.txt NHI -ascii %plot(M,NHI,'*'); bar(M,NHI); % histogram title(strcat('redshift:',num2str(z),' Slim:',num2str(Slim))); xlabel('\fontname{times New Toman}\fontsize{16}log(M_{HI}/M_{sun})'); ylabel('\fontname{times New Toman}\fontsize{16}N'); print -depsc2 simulation.eps
个人分类: 总结|224 次阅读|0 个评论
笔记(四)
qianlivan 2010-3-10 15:09
红移距离转换也是常用的一个操作。现把代码放在下面 function y=zD(z) % z-distance relation, distance in units of Mpc h=0.72; DH=3000./h; % in Mpc OmegaM=0.274; OmegaLam=0.726; %fun=strcat('',num2str(OmegaM),'*(1+x)^3+',num2str(OmegaLam),'') DC=DH.*comdis(OmegaM,OmegaLam,z); DM=DC; % for zero curvature y=DM.*(1+z); %================================================= function y=comdis(OmegaM,OmegaLam,z0) function f=E(z) f=1.0./sqrt(OmegaM.*(1+z).^3+OmegaLam); end y=quadl(@E,0,z0); end
个人分类: 总结|2361 次阅读|0 个评论
笔记(三)
qianlivan 2010-3-10 14:38
笔记(三)产生某个分布的随机数的matlab脚本 function y=GenRanNum2(n) %本函数产生n个指定概率分布的随机数,本例中的 %概率密度函数为f(x)=(1-x*x)/(1+x*x)/(pi-2) |x|1 thetastar=8.6e-3; alpha=-1.30; MHIstar=10.0^9.79; min=1.0e6;% 概率密度区间的左边界 max=1.0e10; %概率密度区间的右边界 uper=thetastar.*(min./MHIstar).^alpha.*exp(-min./MHIstar);%概率密度函数的上确界 step=(max-min)./10.0; %rand('state',0);sum(100*clock) stat=zeros(10); mass=1:10; mass=min+mass*step for k=1:n x1= min + (max-min).*rand(1); x2=uper*rand(1); x3=thetastar.*(x1./MHIstar).^alpha.*exp(-x1./MHIstar); %此处为指定的概率密度函数f(x)的位置 while x2x3 x1= min + (max-min).*rand(1); x2=uper*rand(1); x3=thetastar.*(x1./MHIstar).^alpha.*exp(-x1./MHIstar); end y(k)=x1; j=ceil(y(k)./step); stat(j)=stat(j)+1; end plot(log10(mass),log10(stat));
个人分类: 总结|198 次阅读|0 个评论
笔记(二)几个matlab脚本
qianlivan 2010-3-10 13:53
笔记(二)几个matlab脚本 经常需要做一些不同坐标系中坐标的变换,已经折腾了不止一两次了。把脚本放这儿,以备不时之需。 1. 赤道坐标变换为银道坐标 %north pole R.A. 12h 51m 26.282s , Dec. +27° 07′ 42.01″ %zero point R.A. 17h 45m 37.224s , Dec. -28° 56′ 10.23″ %Galactic Coordinate - Equitorial Coordinate %Galactic pole (b=90 deg) RA=12.8573 h=192.859508 deg Dec=+27.128336 deg %zero point (b=0 deg, l=0 deg) RA=17.7603 h=266.405100 deg Dec=-28.936175 deg function V=ec2gc(Ra,Dec) % Theta=(90.0-27.128336)./180.0.*pi; % Phi=(192.859508-270.0)./180.0.*pi; % Theta1=(90.0-(-28.936175))./180.0.*pi; % Phi1=266.405100./180.0.*pi; % xs= ; % M1= ; % M2= ; % RotMz=M2*M1; % xp= ']'; % zt= ']'; % Phip=asin(cross(xp,xs)*zt'); % M3= ; % RotM=RotMz*M3; % Rotation Matrix for coordinate system: RotM= ; ra=Ra./24.0.*2.0.*pi; dec=Dec./180.0.*pi; H = ; Pos= '; xp=Pos(1); yp=Pos(2); zp=Pos(3); if abs(xp)1.e-8 if yp0 b=pi./2.0; end if yp0 || yp==0 b=3.0.*pi./2.0; end else if yp0 if xp0 b=atan(yp./xp); else b=atan(yp./xp)+pi; end else if xp0 b=atan(yp./xp)+2.0.*pi; else b=atan(yp./xp)+pi; end end end l=asin(zp); b=b./2.0./pi.*24.0; l=l./pi.*180.0; V= ; 2. 银道坐标变换为赤道坐标 %north pole R.A. 12h 51m 26.282s , Dec. +27° 07′ 42.01″ %zero point R.A. 17h 45m 37.224s , Dec. -28° 56′ 10.23″ %Galactic Coordinate - Equitorial Coordinate %Galactic pole (b=90 deg) RA=12.8573 h=192.859508 deg Dec=+27.128336 deg %zero point (b=0 deg, l=0 deg) RA=17.7603 h=266.405100 deg Dec=-28.936175 deg function V=gc2ec(b,l) % Theta=(90.0-27.128336)./180.0.*pi; % Phi=(192.859508-270.0)./180.0.*pi; % Theta1=(90.0-(-28.936175))./180.0.*pi; % Phi1=266.405100./180.0.*pi; % xs= ; % M1= ; % M2= ; % RotMz=M2*M1; % xp= ']'; % zt= ']'; % Phip=asin(cross(xp,xs)*zt'); % M3= ; % RotM=RotMz*M3; % Rotation Matrix for coordinate vector: RotM= ; b=b./24.0.*2.0.*pi; l=l./180.0.*pi; H = ; Pos= '; xp=Pos(1); yp=Pos(2); zp=Pos(3); if abs(xp)1.e-8 if yp0 ra=pi./2.0; end if yp0 || yp==0 ra=3.0.*pi./2.0; end else if yp0 if xp0 ra=atan(yp./xp); else ra=atan(yp./xp)+pi; end else if xp0 ra=atan(yp./xp)+2.0.*pi; else ra=atan(yp./xp)+pi; end end end dec=asin(zp); Ra=ra./2.0./pi.*24.0; Dec=dec./pi.*180.0; V= ; 3. 赤道坐标变换为超星系坐标 %north pole R.A. 18h 55m 01s, Dec. +15deg 42' 32" %zero point R.A. 2h 49m 14s, Dec. +59deg 31' 42" %Supergalactic Coordinate - Equitorial Coordinate %Supergalactic pole (SGB=90 deg) RA=18.9169 h=283.7535 deg Dec=+15.7089 deg %zero point (SGB=0 deg, SGL=0 deg) RA=2.8206 h=42.3090 deg Dec=+59.5283 deg function V=ec2sgc(Ra,Dec) % Theta=(90.0-15.7089)./180.0.*pi; % Phi=(283.7535-270.0)./180.0.*pi; % Theta1=(90.0-59.5283)./180.0.*pi; % Phi1=42.3090./180.0.*pi; % xs= ; % M1= ; % M2= ; % RotMz=M2*M1; % xp= ']'; % zt= ']'; % Phip=asin(cross(xp,xs)*zt'); % M3= ; % RotM=RotMz*M3; % Rotation Matrix for coordinate system: RotM= ; ra=Ra./24.0.*2.0.*pi; dec=Dec./180.0.*pi; Pos = ; V= '; 4. 超星系坐标变换为赤道坐标 %north pole R.A. 18h 55m 01s, Dec. +15deg 42' 32" %zero point R.A. 2h 49m 14s, Dec. +59deg 31' 42" %Supergalactic Coordinate - Equitorial Coordinate %Supergalactic pole (SGB=90 deg) RA=18.9169 h=283.7535 deg Dec=+15.7089 deg %zero point (SGB=0 deg, SGL=0 deg) RA=2.8206 h=42.3090 deg Dec=+59.5283 deg function V=sgc2ec(x,y,z) % Theta=(90.0-15.7089)./180.0.*pi; % Phi=(283.7535-270.0)./180.0.*pi; % Theta1=(90.0-59.5283)./180.0.*pi; % Phi1=42.3090./180.0.*pi; % xs= ; % M1= ; % M2= ; % RotMz=M2*M1; % xp= ']'; % zt= ']'; % Phip=asin(cross(xp,xs)*zt'); % M3= ; % RotM=RotMz*M3; % Rotation Matrix for coordinate vector: RotM= ; H= ./sqrt(x.^2+y.^2+z.^2); Pos= '; xp=Pos(1); yp=Pos(2); zp=Pos(3); if abs(xp)1.e-8 if yp0 ra=pi./2.0; end if yp0 ra=3.0.*pi./2.0; end else if yp0 ra=atan(yp./xp)+pi./2.0; else ra=atan(yp./xp)+3.0.*pi./2.0; end end dec=asin(zp); Ra=ra./2.0./pi.*24.0; Dec=dec./pi.*180.0; V= ;
个人分类: 总结|4256 次阅读|0 个评论
[转载]101条伟大的计算机编程名言
JRoy 2010-3-6 21:47
boxi 编译 人们总是害怕改变。电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车。无知无所不在,并导致恐惧。但随着时间推移,人们终究会接受最新的科技。 正如比尔盖茨曾经警告过一样,计算机已经真正成为我们的最新科技,几乎遍布我们日常生活的每一方面。所以,我们这个时代的某些最伟大的头脑开始思索起计算机和软件对于人类的重要性来了。以下就是101条有关计算机的伟大名言,并且,既然我们这个网站是一个软件开发网站,我们尤其关注编程方面的。 计算机 1、计算机没什么用。他们只会告诉你答案。 (巴勃罗毕加索,画家) 2、 计算机就跟比基尼一样,省去了人们许多的胡思乱想。 (萨姆尤因,作家) 3、他们拥有计算机,他们也还可能拥有其他的大规模杀伤性武器。 (珍内特雷诺,美国前女司法部长) 4、跟计算机工作酷就酷在这里,它们不会生气,能记住所有东西,还有,它们不会喝光你的啤酒。 (保罗利里,吉他手) 5、如果汽车能赶上计算机的发展周期的话,一辆今天的劳斯莱斯仅值100美元,每加仑要跑100万英里,每年还得爆炸一次,把里面的人杀个精光。 (Robert X. Cringely,技术作家) 计算机智能 6、计算机总是越来越智能的。科学家告诉我们说不久它们就能跟我们对话了。(这里的它们,我指的是计算机。我怀疑科学家永远都不能跟我们对话。) (Dave Barry,幽默作家) 7、我最近注意到,在共同文化中,那种对计算机变得智能化并最终掌控世界的妄想恐惧症几乎彻底消失了。据我所知,这跟MS-DOS的发布基本是同步的。 (Larry DeLuca) 8、计算机会不会思考这个问题就像问潜水艇会不会游泳一样。 (Edsger W. Dijkstra,图灵奖获得者) 9、活了一百年却只能记住30M字节是荒谬的。你知道,这比一张压缩盘还要少。人类境况正在变得日趋退化。 (Marvin Minsky,人工智能研究的奠基人) 信任 10、这座城市的中央计算机告诉你的?R2D2,你不该相信一台陌生的计算机! (C3PO,星球大战中的翻译机器人) 11、不要信赖那些大到不能扔出窗外的计算机 (斯蒂夫沃兹尼亚克,苹果联合创始人) *译者:游戏《文明4》中的科技引言,实际上沃兹尼亚克自己也不记得自己是否确切讲过这样的话。 硬件 12、硬件:计算机系统中可被踢的部分。 (Jeff Pesis) 软件 13、今天大部分的软件都很像上百万块砖堆叠在一起组成的埃及金字塔,缺乏结构完整性,只能靠强力和成千上万的奴隶完成。 (阿伦凯,图灵奖获得者,面向对象创始人) 14、我终于明白向上兼容性是怎么回事了。这是指我们得保留所有原有错误。 (Dennie van Tassel) 操作系统 15、有两样重要产品出自伯克利:LSD和BSD*。我们不相信这是个巧合。 (Jeremy S. Anderson) *译者:LSD是一种药力至强的迷幻剂,BSD- BSD ( Berkeley Software Distribution ,伯克利软件套件)是Unix的衍生系统 16、2038年1月19日,凌晨3点14分07秒 (UNIX中的世界末日*1970年1月1号之后的2^32秒) *译者:word跟world发音类似,UNIX用有符号整形数(WORD)表示时间,所以最多只能计时2^31秒,原文的2^32应为错误。 17、每个操作系统都差不多 我们都一样的烂。 (微软的高级副总裁布莱恩瓦伦蒂尼这样描述操作系统的安全状况,2003) 18、微软出了个新版本,Windows XP,据大家说是有史以来最稳定的Windows,对我而言, 这就好像是在说芦笋是有史以来发音最清脆的蔬菜一样 (Dave Barry) 互联网 19、互联网?那个东西还在吗? (Homer Simpson) 20、网络就像是个母夜叉。我每转到一处都会看见小个的按钮命令我提交*。 (Nytwind) *译者注:Submit:提交,另一层意思是要求屈服 21、想想看吧,已经有一百万只猴子坐在一百万台打字机旁,可Usenet就是不像莎士比亚。 (Blair Houghton) 软件产业 22、计算机软件产业最为惊人的成就,是其持续不断地放弃硬件产业的惊人成果和稳定性。 (Henry Petroski) 23、真正的创新经常来自于那些贴近市场、但无力拥有市场的的小型初创公司。 (Timm Martin) 24、人们常说,伟大的科学学科就像是站在其它巨人肩膀上的巨人。人们也说过,软件产业正如站在其他侏儒脚上的侏儒。 (Alan Cooper,交互设计之父) 25、这无关比特、字节和协议,而关乎利润和损益。 (郭士纳,IBM前CEO) 26、我们是微软。反抗是徒劳的。你会被同化的。 (保险杠贴纸) 软件演示 27、不管演示在彩排的时候有多好,一旦在观众面前展示时,演示的不出错几率为投资总额的观众人数次方的倒数。 (Mark Gibbs) 软件专利 28、专利大多数都是垃圾。浪费时间去阅读这些专利是愚蠢的。只有专利持有人才会这么干,还得强迫自己才会看。 (Linus Torvalds,LINUX创始人) 复杂性 29、控制复杂性是计算机编程的本质。 (Brian Kernigan) 30、复杂性杀死一切。它把程序员的生活给搞砸了,它令产品难以规划、创建和测试,带来了安全挑战,并导致最终用户和管理员沮丧不已。 (Ray Ozzie) 31、进行软件设计有两种方式。一种是让它尽量简单,明显没有不足。另一种是弄得尽量复杂,没有明显缺陷。 (C.A.R. Hoare) 32、好的软件的作用是让复杂的东西看起来简单。 (Grady Booch,UML创始人之一) 易用性 33、不管那些计算机书怎么说,只需记住,你不是傻瓜。真正的傻瓜是那些所谓的技术专家,因为他们设计不出普通消费者赖以生活的易于使用的软硬件。 (Walter Mossberg,科技专栏记者) 34、软件供应商在努力尝试让他们的软件更易于操作 迄今为止,他们最好的办法就是翻出所有的老手册,然后在封面盖上易于操作这几个字。 (比尔盖茨) 35、有个老套的故事说有人希望他的计算机能像他的电话机一样好用。他的愿望实现了,因为我已经不知道该如何使用自己的电话了。 (Bjarne Stroustrup,C++之父) 用户 36、任何一个傻瓜都会用电脑。的确有很多傻瓜在用。 (Ted Nelson) 37、只有两个行业把客户称为用户*。 (Edward Tufte,信息设计大师) *译者注:一个是计算机设计,另一个是毒品交易 ,computer design and drug dealing 程序员 38、程序员在跟宇宙赛跑,他们在努力开发出更大更好的傻瓜程序,而宇宙则努力培养出更大更好的白痴。到目前为止,宇宙领先。 (Rich Cook) 39、你们当中很多人都知道程序员的美德。当然啦,有三种:那就是懒惰、急躁以及傲慢。 (Larry Wall,Perl发明者) 40、程序员的问题是你永远都不知道他在做什么,直到为时已晚。 (Seymour Cray,超级计算机之父) 41、那就是这些自认为痛恨计算机的人的真实面目。他们实际上真正痛恨的是糟糕的程序员。 (拉瑞尼文,科幻作家) 42、很长时间以来我一直困惑不已,为什么一些又贵又先进的东西会一点用都没有。直到我突然想起,计算机不就是一台愚蠢之至却拥有难以置信的做聪明事能力的机器嘛,而程序员不就是聪明绝顶却拥有难以置信的干蠢事的能力的人嘛。一句话,他们简直就是天生绝配。 (比尔布莱森,旅游文学作家) 43、正如研究画笔和颜料无法让人成为绘画大师,计算机科学的教育不会让任何人成为一名编程大师。 (埃里克雷蒙,开源运动领袖) 44、一个程序员是经历以下事情后仍能证明自己是严格的专家的人:他可以历经数不清的捶打,可取材于无关紧要的文档,用上面的争议数据作出模糊假设,并以此计算出测微精度的无数片面理解的答案,并由一个不可靠、脑袋充满质疑、公开宣称要让一个倒霉透顶、没有指望、毫无防备,要求第一时间获得信息的部门狼狈不堪、令人生厌的人使用一台准确度有问题的仪器去实施。 (IEEE网格新闻杂志) 45、运气好的黑客能用几个月的时间 - 生产出一个小规模的开发团体(比如说,7-8人)历尽艰辛一起工作了一年多才能做出来的东西。IBM经常报告说某些程序员的生产力要比其它工人高百倍,甚至更多。 (Peter Seebach,黑客) 46、最好的程序员跟好的程序员相比可不止好那么一点点。无论用那种标准去衡量:概念创造性、速度、设计的独创性或者解决问题的能力,这种好都不是一个数量级的。 (兰德尔 E 斯特劳斯,科技作家) 47、伟大的车工值得给他几倍于普通车工的薪水,但一个伟大的软件代码作家,其价值则要等同于一个普通的软件写手的价格的1万倍。 (比尔盖茨) 编程 48、就算它工作不正常也别担心。如果一切正常,你早该失业了。 (Mosher的软件工程定律) 49、靠代码行数来衡量开发进程就好比用重量来衡量飞机制造的进度。 (比尔盖茨) 50、写代码的社会地位比盗墓的高,比管理的低。 (杰拉尔德温伯格,软件与系统思想家) 51、首先学习计算机科学及理论。接着形成自己编程的风格。然后把这一切都忘掉,尽管改程序就是了。 (George Carrette,杰出软件工程师,开源推广者) 52、先解决问题再写代码。 (John Johnson) 53、乐观主义是编程行业的职业病;用户反馈则是治疗方法。 (Kent Beck) 54、迭代者为人,递归者为神。 (L. Peter Deutsch) 55、布尔值最好的一点是,就算你错了,也顶多错了一位而已。 (无名氏) 56、数组的下标是从0开始好还是从1开始好呢?我的0.5的折衷方案,以我之见,没有经过适当考虑就被否决掉了。 (Stan Kelly-Bootle) 编程语言 57、只有两种编程语言:一种是天天挨骂的,另一种是没人用的。 (Bjarne Stroustrup,C++之父) 58、PHP是不合格的业余爱好者创建的,他们犯了个小恶;Perl是娴熟而堕落的专家创建的,他们犯了阴险狡诈的大恶。 (Jon Ribbens) 59、COBOL的使用摧残大脑;其教育应被视为刑事犯罪。 (E.W. Dijkstra) 60、把良好的编程风格教给那些之前曾经接触过BASIC的学生几乎是不可能的。作为可能的程序员,他们已精神残废,无重塑的可能了。 (E. W. Dijkstra) 61、我想微软之所以把它叫做.Net,是因为这样它就不会在Unix的目录里显示出来了。 (Oktal) 62、没有一种编程语言能阻止程序员写出糟糕的程序来,不管这种语言结构有多良好。 (Larry Flon) 63、计算机语言设计犹如在公园里漫步。我是说侏罗纪公园。 (Larry Wall) C/C++ 64、搞了50年的编程语言的研究,最后就出了个C++? (Richard A. OKeefe) 65、写C或者C++就像是在用一把卸掉所有安全防护装置的链锯。 (Bob Gray) 66、在C++里你想搬起石头砸自己的脚更为困难了,不过一旦你真的做了,整条腿都要报销。 (Bjarne Stroustrup) 67、C++ : 友人可造访你的私有成员之地也。 (Gavin Russell Baker) 译者:Friends:C++的友元,是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 68、罗马帝国灭亡的其中一个主要原因是他们没有0 - 这样他们就没法给自己的C程序指明成功退出的路径了。 (Robert Firth) Java 69、Java从许多方面来说就是C++。 (Michael Feldman) 70、说Java好就好在运行于所有操作系统之上,就好比说肛交好就好在无论男女都行。 (Alanna) 71、好吧,Java也许是编程语言的好榜样。但Java应用则是应用程序的坏榜样。 (pixadel) 72、要是Java真的有垃圾回收的话,大部分程序在执行之前就会把自己干掉了。 (Robert Sewell) 开源 73、软件就像性事:免费/自由更好。 (Linus Torvalds) 74、唯一对免费软件感到害怕的人,是自己的产品还要不值钱的人。 (David Emery) 代码 75、好代码本身就是最好的文档。 (Steve McConnell,《代码大全》的作者) 76、你自己的代码如果超过6个月不看,再看的时候也一样像是别人写的。 (伊格尔森定律) 77、前面90%的代码要占用开发时间的前90%。剩下的10%的代码要占用开发时间的另一90%。 (Tom Cargill,C++领域中公认的专家) 软件开发 78、好的程序员绞尽脑汁,务求考虑各种场景,幸得好的指南拯救我们,不必面面俱到。 (Francis Glassborow,C和C++领军人物之一) 79、在软件里面,我们鲜有有意义的需求。就算有,衡量成功的唯一尺度,也取决于我们的解决方案是不是搞定了客户的想法 - 那飘忽不定的、对问题是什么的想法。 (Jeff Atwood,Coding Horror Developer Blog的创始人) 80、想想我们计算机程序的糟糕现状吧,很显然软件开发仍是黑箱艺术,还不能称之为工程学科。 (Bill Clinton,前美国总统) 81、没有伟大的团队就没有伟大的软件,可大部分的软件团队举止就像是支离破碎的家庭。 (吉姆麦卡锡,微软VC++总监) 调试 82、一旦我们开始编程,就会惊讶地发现让程序正常没想象中那么简单。调试不可避免。那一刻我认记忆犹新,当时我就意识到,从今往后我生活的大部分时间都要花在寻找自己程序的错误上面了。 (莫里斯威尔克斯调试探索, 1949) 83、调试难度本来就是写代码的两倍。因此,如果你写代码的时候聪明用尽,根据定义,你就没有能耐去调试它了。 (Brian Kernighan,《C 程序设计语言》的作者之一) 84、如果调试是除虫的过程,那么编程就一定是把臭虫放进来的过程。 (Edsger W. Dijkstra) 质量 85、 我才不管它 能 不 能 在你的机器上运行呢!我们又没装到你的机器上 ! (Vidiu Platon,罗马尼亚的微软最佳学生合作伙伴MSP) 86、编程就像性一样:一时犯错,终生维护。 (Michael Sinz) 87、有两种写出无错程序的办法;只有第三种有用。 (Alan J. Perlis) 88、软件质量与指针算法不可兼得。 (Bertrand Meyer) 89、如果麦当劳像软件公司那样运作的话,每一百个巨无霸就会有一个令你食物中毒,而他们的回应是,真对不起,这是一张额外附送两个的赠券。 (Mark Minasi) 90、永远要这样写代码,好像最终维护你代码的人是个狂暴的、知道你住在哪里的精神病患者。 (Martin Golding) 91、是人都会犯错,不过要想把事情彻底搞砸还得请电脑出马。 (Paul Ehrlich) 92、计算机比人类历史上的任何发明都更快速地导致你犯更多的错误可能除了手枪和龙舌兰酒是例外。 (Mitch Radcliffe) 预测 93、能发明的东西都发明出来了。 (查尔斯杜埃尔, 美国专利局局长,1899年) 94、我认为全球市场约需5台计算机。 (托马斯沃森,IBM董事长, 约1948年) 95、看上去我们已经到达了利用计算机技术可能获得的极限了,尽管下这样的结论得小心,因为不出五年这听起来就会相当愚蠢。 (约翰冯诺伊曼,约1949年) 96、但这又有什么好处呢? (IBM先进计算机系统部的工程师对微芯片的评论, 1968年) 97、没理由人人都放台电脑到家里面去。 (肯奥尔森,数据设备公司(DEC)总裁,1977年) 98、640K对每一个人来说都已足够。 (比尔 盖茨,1981年) 99、Windows NT的RAM寻址空间可达2G,这比任何应用程序所需都要多。 (微软, 谈及Windows NT的开发时所言, 1992年) 100、我们永远也无法真正成为无纸化社会,直到掌上电脑一族发布擦我1.0*(WipeMe 1.0)为止。 (安迪皮尔逊,商界领袖) *译者注:意思是说难道你大便不用纸吗? 101、长此以往,除了按键的手指外,人类的肢体将全部退化。 (弗兰克劳埃德赖特,建筑师)
个人分类: 知识杂谈|2154 次阅读|0 个评论
笔记(一)一些IDL语句
qianlivan 2010-3-3 15:56
笔记(一)一些IDL语句 时常会用IDL写点小程序,有些语句常用,但无奈自己记忆力太差,每次都上网查一次。鉴于有些语句我常用而别人常用的语句我不一定常用,为了节省每次上网查找的时间,特在这里做一些记录。 1. 替换数组中的NaN 数组中的NaN时常会造成计算中的麻烦,所以一般把它们替换为一些特别的数,比如-999.9。 IDLbad=where(finite(data) eq 0,count) IDLif(count gt 0) then data(bad)=-999.9 2.获得数组中最大元素的标号 IDLmaxr=max(r) IDLindex=where(r eq maxr) 3.处理.sav文件 IDLrestore,'data.sav'
个人分类: 总结|10247 次阅读|0 个评论
Java学习体会2
putin24 2010-1-15 14:06
一直还不知道个所以然的我,慢慢的开始不再厌恶这些代码,可能是因为自己反抗抵触的时间过了吧,原来学习走入了误区,总认为喜欢先进的,软件也更新到最新的,但是后来想想还是很奇怪,现在才从基础的一点一点小问题去解决,反而进步很快,渐渐地可能会忘记一些,但是比起以前的那种空对空要显得实在。 写 JSP 的时候很多都已经是 CSS 来控制页面的时候,我还是用 table 来处理。 1.Table 一些札记 table width=90% border=0 cellspacing=0 cellpadding=0 bordercolor=black bordercolorlight=black bordercolordark=white //table 的属性 tr align=center // 行 td height=25 colspan=2 bgcolor=005ece align=center STYLE=font-size:11pt; background=%=request.getContextPath()%/image/tablebanner.gif // 列 /td/tr a href=%=request.getContextPath()%/person/person_myself_look.do /a img src= 图片地址 width=300 height=400 / // 图片的引用 input type=image src= onclick=javascript:return(confirm(' 添加成功! ')) // 使用图片按钮 a href=%=request.getContextPath()%%=pagepath%?page=%=currentpage-1% 上一页 /a // 使用翻页 input type=text name=type value='%=node.getType()%' // 修改 %if( i%2==0) {%bgcolor=#f2F595% }% %if( i%2!=0) {%bgcolor=#f2b695% }% // 使用简单的 js 语言控制表格各行不一样颜色 . 2. 测试类札记 public static void main(String[] args){ //java 中测试实例 TreeJDBC tree=new TreeJDBC(); tree.deleteRecord(1); Collection col=tree.getAllnodesfromdatabase(); Iterator it=col.iterator(); while(it.hasNext()){ Treenode node=(Treenode)it.next(); System.out.println(node.getId()+, +node.getParentid()+, +node.getName()); } } node.setId(rs.getString(ID)); //set 方法 String manager =(String)request.getParameter(manager); //get 页面传输过来的参数 manager 3. 样式札记 head style type=text/css .button { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; color: #3573CA; } input{ height:20px; border-color:blue; } select{ BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #FFFFFF 1px solid; FONT-SIZE: 15px; BORDER-LEFT: #FFFFFF 1px solid; COLOR:#003366; BORDER-BOTTOM: #000000 1px solid; BACKGROUND-COLOR: #f4f4f4; } /style/head // 页面直接调用样式,流行的是写在 CSS 文件中;在 head 中添加, link rel=stylesheet type=text/css href=%=contentPath%/css/input.css / input name=project_name class=inputstyle type=text // 调用样式类名称 inputstyle 希望新年里自己不断努力。 补充一点struts检验时间格式抛出异常笔记: String timeerrors = Change.checkdate(portfolio_time); if (!(timeerrors.equals(success))) { errors.add(ActionErrors.GLOBAL_ERROR, new ActionError( timeerrors)); saveErrors(request, errors); return mapping.findForward(false); } if (!mark) { saveErrors(request, errors); return mapping.findForward(false); }
个人分类: 生活点滴|3150 次阅读|0 个评论
Java学习总结
putin24 2009-12-31 01:42
实时总结,可能会有所收获吧,讲下 Servlet 与 struts1.x 的区别吧,最近在开发一个系统,系统由于前期规划不好,导致既有 Servlet 与 struts1.x 在作用,显得很不协调,但也很快的让我看出了其中一些区别。 1.Servlet 在 web.xml 里定义一个 servlet 的 name 和 mapping 的路径 /servlet/DisplayTemplate servlet description 显示模板的 servlet/description display-name 显示模板的 servlet/display-name servlet-nameDisplayTemplate/servlet-name servlet-classorg.example.servlet.DisplayTemplate/servlet-class /servlet servlet-mapping servlet-nameDisplayTemplate/servlet-name url-pattern/servlet/DisplayTemplate/url-pattern /servlet-mapping 而相比 struts 定义的方式却显得简化了,首先在 struts-config.xml 中定义一个 bean ,对应一个 form 。 form-beans form-bean name=xxxform type=com.office.actionform.xxxxxForm / /form-beans 在 mapping 中定义映射,指向的路径和 forward 的页面。 action-mappings action name=treeform parameter=xxx path=/project/xxx scope=request type=com.office.action.TreenodeAction forward name=add path=/project/addsuccessfully.jsp/ forward name=success path=/project/addsuccessfully.jsp / /action /action-mappings 其实从这点上看还是有很多的相似之处,但是 struts1.x 最大的好处是把这些零散的东西整理成一堆组织性更强的文件。 2. 稍微大一点的项目用 servlet 要写很多的 servlet.class 文件和很多的 doPost 和 doGet ,而用 struts 1.x 好在可以把相似的这些 servlet 写到一个 Action 里,通过 struts-config.xml 不同参数的选择,调用不同的方法来实现 jsp 与 java/DB 的通信,确实减少了很多文件的冗余; 3. struts 1.x 能在 jsp 页面大量使用比较简洁的 Struts 标签,减少了很多用 JavaScript 写的代码,但在页面中需要引入定义好的标签。 %@ taglib uri=struts-html prefix=html % %@ taglib uri=struts-bean prefix=bean% %@ taglib uri=struts-logic prefix=logic% 注释: Servlet 是一个标准服务器端程序,执行商务逻辑,处理 HTTP 请求 =Server+let e.g. MIDlet=MIDP+let ; Applet=Application+let Javax.servlet.Servlet Servlet 的生命周期对应的三个方法: init() 初始化方法, service (), destroy() JS 部分代码 script function ok(){ var nodeid='%=nodeid%'; document.forms .action=document.forms .action+?nodeid=+nodeid; document.forms .submit(); } /script action=%=path%/Addnode tdselect name=task_resource % List grouplist = (List) request.getAttribute(grouplist); for (int i = 0; i grouplist.size(); i++) { ResourceForm tt = (ResourceForm) grouplist.get(i); % option value=%=tt.getGroup_id()%%=tt.getGroup_id()+tt.getGroup_name()%/option % } % /select /td trtdinput type=button onclick=javascript:ok(); name= 确定 value= 确定 //td/tr Struts 标签 html:form action=/project/add_node.do?addtype=link html:options collection=grouplist property=value labelProperty=label //html:select /td html:submit value= 添加 styleClass=button/html:select property=task_resource
个人分类: 学术笔记|2381 次阅读|1 个评论
【转载】语录:101条伟大的计算机编程名言
freton 2009-9-27 17:42
语录:101条伟大的计算机编程名言 HACKER 2009-05-23 18:50 阅读 17 评论 1 字号: 大 大 中 中 小 小 人们总是害怕改变。电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车。无知无所不在,并导致恐惧。但随着时间推移,人们终究会接受最新的科技。 正如比尔盖茨曾经警告过一样,计算机已经真正成为我们的最新科技,几乎遍布我们日常生活的每一方面。所以,我们这个时代的某些最伟大的头脑开始思索起计算机和软件对于人类的重要性来了。以下就是101条有关计算机的伟大名言,并且,既然我们这个网站是一个软件开发网站,我们尤其关注编程方面的。 计算机 1、计算机没什么用。他们只会告诉你答案。 (巴勃罗毕加索,画家) 2、计算机就跟比基尼一样,省去了人们许多的胡思乱想。 (萨姆尤因,作家) 3、他们拥有计算机,他们也还可能拥有其他的大规模杀伤性武器。 (珍内特雷诺,美国前女司法部长) 4、跟计算机工作酷就酷在这里,它们不会生气,能记住所有东西,还有,它们不会喝光你的啤酒。 (保罗利里,吉他手) 5、如果汽车能赶上计算机的发展周期的话,一辆今天的劳斯莱斯仅值100美元,每加仑要跑100万英里,每年还得爆炸一次,把里面的人杀个精光。 (RobertX.Cringely,技术作家) 计算机智能 6、计算机总是越来越智能的。科学家告诉我们说不久它们就能跟我们对话了。(这里的它们,我指的是计算机。我怀疑科学家永远都不能跟我们对话。) (DaveBarry,幽默作家) 7、我最近注意到,在共同文化中,那种对计算机变得智能化并最终掌控世界的妄想恐惧症几乎彻底消失了。据我所知,这跟MS-DOS的发布基本是同步的。 (LarryDeLuca) 8、计算机会不会思考这个问题就像问潜水艇会不会游泳一样。 (EdsgerW.Dijkstra,图灵奖获得者) 9、活了一百年却只能记住30M字节是荒谬的。你知道,这比一张压缩盘还要少。人类境况正在变得日趋退化。 (MarvinMinsky,人工智能研究的奠基人) 信任 10、这座城市的中央计算机告诉你的?R2D2,你不该相信一台陌生的计算机! (C3PO,星球大战中的翻译机器人) 11、永远不要相信一台不能扔掉一扇窗户*的计算机 (斯蒂夫沃兹尼亚克,苹果联合创始人) *译者:暗指微软的wINDOWS操作系统 硬件 12、硬件:计算机系统中可被踢的部分。 (JeffPesis) 软件 13、今天大部分的软件都很像上百万块砖堆叠在一起组成的埃及金字塔,缺乏结构完整性,只能靠强力和成千上万的奴隶完成。 (阿伦凯,图灵奖获得者,面向对象创始人) 14、我终于明白向上兼容性是怎么回事了。这是指我们得保留所有原有错误。 (DennievanTassel) 操作系统 15、有两样重要产品出自伯克利:LSD和BSD*。我们不相信这是个巧合。 (JeremyS.Anderson) *译者:LSD是一种药力至强的迷幻剂,BSD-BSD(BerkeleySoftwareDistribution,伯克利软件套件)是Unix的衍生系统 16、2038年1月19日,凌晨3点14分07秒 (UNIX中的世界末日*1970年1月1号之后的2^32秒) *译者:word跟world同音,UNIX用4个字节(WORD)表示时间,所以最多只能计时2^32秒 17、每个操作系统都差不多我们都一样的烂。 (微软的高级副总裁布莱恩瓦伦蒂尼这样描述操作系统的安全状况,2003) 18、微软有出了个新版本,WindowsXP,据大家说是有史以来最稳定的Windows,对我而言,这就好像是在说芦笋是有史以来发音最清脆的蔬菜一样 (DaveBarry) 互联网 19、互联网?那个东西还在吗? (HomerSimpson) 20、网络就像是个母夜叉。我每转到一处都会看见小个的按钮命令我提交*。 (Nytwind) *译者注:Submit:提交,另一层意思是要求屈服 21、想想看吧,已经有一百万只猴子坐在一百万台打字机旁,可Usenet就是比不上莎士比亚。 (BlairHoughton) 软件产业 22、计算机软件产业最为惊人的成就,是其持续不断地放弃硬件产业的惊人成果和稳定性。 (HenryPetroski) 23、真正的创新经常来自于那些贴近市场、但无力拥有市场的的小型初创公司。 (TimmMartin) 24、人们常说,伟大的科学学科就像是站在其它巨人肩膀上的巨人。人们也说过,软件产业正如站在其他侏儒脚上的侏儒。 (AlanCooper,交互设计之父) 25、这无关比特、字节和协议,而关乎利润和损益。 (郭士纳,IBM前CEO) 26、我们是微软。反抗是徒劳的。你会被同化的。 (保险杠贴纸) 软件演示 27、不管演示在彩排的时候有多好,一旦在观众面前展示时,演示不出错的几率与观众人数成反比,与投入的金钱总额成正比。 (MarkGibbs) 软件专利 28、专利大多数都是垃圾。浪费时间去阅读这些专利是愚蠢的。只有专利持有人才会这么干,还得强迫自己才会看。 (LinusTorvalds,LINUX创始人) 复杂性 29、控制复杂性是计算机编程的本质。 (BrianKernigan) 30、复杂性杀死一切。它把程序员的生活给搞砸了,它令产品难以规划、创建和测试,带来了安全挑战,并导致最终用户和管理员沮丧不已。 (RayOzzie) 31、进行软件设计有两种方式。一种是让它尽量简单,让人看不出明显的不足。另一种是弄得尽量复杂,让人看不出明显的缺陷。 (C.A.R.Hoare) 32、好的软件的作用是让复杂的东西看起来简单。 (GradyBooch,UML创始人之一) 易用性 33、不管那些计算机书籍如何宣称,只需记住,你并非傀儡。真正的傀儡是那些无法设计出易于使用的硬件和软件的那些人,尽管他们是技术专家,因为这是普通消费者赖以生活的东西。 (WalterMossberg,科技专栏记者) 34、软件供应商在努力尝试让他们的软件更易于操作迄今为止,他们最好的办法就是翻出所有的老手册,然后在封面盖上易于操作这几个字。 (比尔盖茨) 35、有个老套的故事说有人希望他的计算机能像他的电话机一样好用。他的愿望实现了,因为我已经不知道该如何使用自己的电话了。 (BjarneStroustrup,C++之父) 用户 36、任何一个傻瓜都会用电脑。很多都会。 (TedNelson) 37、只有两个行业把客户称为用户*。 (EdwardTufte,信息设计大师) *译者注:一个是计算机设计,另一个是毒品交易,computerdesignanddrugdealing 程序员 38、程序员在跟宇宙赛跑,他们在努力开发出更大更好的傻瓜程序,而宇宙则努力培养出更大更好的白痴。到目前为止,宇宙领先。 (RichCook) 39、你们当中很多人都知道程序员的美德。当然啦,有三种:那就是懒惰、急躁以及傲慢。 (LarryWall,Perl发明者) 40、程序员的问题是你无法预料他在做什么,直到为时已晚。 (SeymourCray,超级计算机之父) 41、那就是这些自认为痛恨计算机的人的真实面目。他们实际上真正痛恨的是糟糕的程序员。 (拉瑞尼文,科幻作家) 42、很长时间以来我一直困惑不已,为什么一些又贵又先进的东西会一点用都没有。直到我突然想起,计算机不就是一台愚蠢之至却拥有难以置信的做聪明事能力的机器嘛,而程序员不就是聪明绝顶却拥有难以置信的干蠢事的能力的人嘛。一句话,他们简直就是天生绝配。 (比尔布莱森,旅游文学作家) 43、不像学学涂涂画画也能让某人成为专家级画家,计算机科学教育不会让任何人成为一名编程大师。 (埃里克雷蒙,开源运动领袖) 44、一个程序员是经历以下事情后仍能证明自己是严格的专家的人:他可以历经数不清的捶打,可取材于无关紧要的文档,用上面的争议数据作出模糊假设,并以此计算出测微精度的无数片面理解的答案,并由一个不可靠、脑袋充满质疑、公开宣称要让一个倒霉透顶、没有指望、毫无防备,要求第一时间获得信息的部门狼狈不堪、令人生厌的人使用一台准确度有问题的仪器去实施。 (IEEE网格新闻杂志) 45、运气好的黑客能用几个月的时间-生产出一个小规模的开发团体(比如说,7-8人)历尽艰辛一起工作了一年多才能做出来的东西。IBM经常报告说某些程序员的生产力要比其它工人高百倍,甚至更多。 (PeterSeebach,黑客) 46、最好的程序员跟好的程序员相比可不止好那么一点点。这种好不是一个数量级的,取决于标准怎么定:概念创造性、速度、设计的独创性或者解决问题的能力。 (兰德尔E斯特劳斯,科技作家) 47、伟大的车工值得给他几倍于普通车工的薪水,但一个伟大的软件代码作家,其价值则要等同于一个普通的软件写手的价格的1万倍。 (比尔盖茨) 编程 48、就算它工作不正常也别担心。如果一切正常,你早该失业了。 (Mosher的软件工程定律) 49、靠代码行数来衡量开发进程就好比用重量来衡量飞机制造的进度。 (比尔盖茨) 50、写代码的社会地位比盗墓的高,比管理的低。 (杰拉尔德温伯格,软件与系统思想家) 51、首先学习计算机科学及理论。接着形成自己编程的风格。然后把这一切都忘掉,尽管改程序就是了。 (GeorgeCarrette,杰出软件工程师,开源推广者) 52、先解决问题再写代码。 (JohnJohnson) 53、乐观主义是编程行业的职业病;用户反馈则是治疗方法。 (KentBeck) 54、迭代者为人,递归者为神。 (L.PeterDeutsch) 55、布尔值最好的一点是,就算你错了,也顶多错了一位而已。 (无名氏) 56、数组的下标是从0开始好还是从1开始好呢?我的0.5的折衷方案,以我之见,没有经过适当考虑就被否决掉了。 (StanKelly-Bootle) 编程语言 57、只有两种编程语言:一种是天天挨骂的,另一种是没人用的。 (BjarneStroustrup,C++之父) 58、PHP是不合格的业余爱好者创建的,他们犯做了个小恶;Perl是娴熟而堕落的专家创建的,他们犯了阴险狡诈的大恶。 (JonRibbens) 59、COBOL的使用摧残大脑;其教育应被视为刑事犯罪。 (E.W.Dijkstra) 60、把良好的编程风格教给那些之前曾经接触过BASIC的学生几乎是不可能的。作为可能的程序员,他们已精神残废,无重塑的可能了。 (E.W.Dijkstra) 61、我想微软之所以把它叫做.Net,是因为这样它就不会在Unix的目录里显示出来了。 (Oktal) 62、Thereisnoprogramminglanguagenomatterhowstructuredthatwillpreventprogrammersfrommakingbadprograms. (LarryFlon) 63、计算机语言设计犹如在公园里漫步。我是说侏罗纪公园。 (LarryWall) C/C++ 64、搞了50年的编程语言的研究,我们难道就以C++告终啦? (RichardA.OKeefe) 65、写C或者C++就像是在用一把卸掉所有安全防护装置的链锯。 (BobGray) 66、在C++里你想搬起石头砸自己的脚更为困难了,不过一旦你真的做了,整条腿都要报销。 (BjarneStroustrup) 67、C++:友人可造访你的私有成员之地也。 (GavinRussellBaker) 译者:Friends:C++的友元,是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 68、罗马帝国灭亡的其中一个主要原因是他们没有0-这样他们就没法给自己的C程序指明成功退出的路径了。 (RobertFirth) Java 69、Java从许多方面来说就是C++。 (MichaelFeldman) 70、说Java好就好在运行于多个操作系统之上,就好像说肛交好就好在不管男女都行。 (Alanna) 71、好吧,Java也许是编程语言的好榜样。但Java应用则是应用程序的坏榜样。 (pixadel) 72、要是Java真的有垃圾回收的话,大部分程序在执行的时候就会把自己干掉了。 (RobertSewell) 开源 73、软件就像性事:免费/自由更好。 (LinusTorvalds) 74、唯一对免费软件感到害怕的人,是自己的产品还要不值钱的人。 (DavidEmery) 代码 75、好代码本身就是最好的文档。 (SteveMcConnell) 76、你自己的代码如果超过6个月不看,再看的时候也一样像是别人写的。 (伊格尔森定律) 77、前面90%的代码要占用开发时间的前90%。剩下的10%的代码要占用开发时间的另一90%。 (TomCargill) 软件开发 78、好的程序员会用脑,但是好的向导救我们于样样都要想到。 (FrancisGlassborow) 79、在软件里面,我们鲜有有意义的需求。就算有,衡量成功的唯一尺度也取决于我们的解决方案是否解决了客户对问题是什么的观念的转变。 (JeffAtwood) 80、想想我们计算机程序的糟糕现状吧,很显然软件开发仍是黑箱艺术,还不能称之为工程学科。 (BillClinton,前美国总统) 81、没有伟大的团队就没有伟大的软件,可大部分的软件团队举止就像是支离破碎的家庭。 (吉姆麦卡锡,微软VC++总监) 调试 82、一旦我们开始编程,就会惊讶地发现让程序正常没想象中那么简单。调试不可避免。那一刻我认记忆犹新,当时我就意识到,从今往后我生活的大部分时间都要花在寻找自己程序的错误上面了。 (莫里斯威尔克斯调试探索,1949) 83、调试难度本来就是写代码的两倍。因此,如果你写代码的时候聪明用尽,根据定义,你就没有能耐去调试它了。 (BrianKernighan) 84、如果调试是除虫的过程,那么编程就一定是把臭虫放进来的过程。 (EdsgerW.Dijkstra) 质量 85、我才不管它能不能在你的机器上运行呢!我们又没装到你的机器上! (VidiuPlaton,罗马尼亚的微软最佳学生合作伙伴MSP) 86、编程就像性一样:一时犯错,终生维护。 (MichaelSinz) 87、有两种写出无错程序的办法;只有第三种有用。 (AlanJ.Perlis) 88、软件质量与指针算法不可兼得。 (BertrandMeyer) 89、如果麦当劳像软件公司那样运作的话,每一百个巨无霸就会有一个令你食物中毒,而他们的回应是,真对不起,这是一张额外附送两个的赠券。 (MarkMinasi) 90、永远要这样写代码,好像最终维护你代码的人是个狂暴的、知道你住在哪里的精神病患者。 (MartinGolding) 91、是人都会犯错,不过要想把事情彻底搞砸还得请电脑出马。 (PaulEhrlich) 92、计算机比人类历史上的任何发明都更快速地导致你犯更多的错误可能除了手枪和龙舌兰酒是例外。 (MitchRadcliffe) 预测 93、能发明的东西都发明出来了。 (查尔斯杜埃尔,美国专利局局长,1899年) 94、我认为全球市场约需5台计算机。 (托马斯沃森,IBM董事长,约1948年) 95、看上去我们已经到达了利用计算机技术可能获得的极限了,尽管下这样的结论得小心,因为不出五年这听起来就会相当愚蠢。 (约翰冯诺伊曼,约1949年) 96、但这又有什么好处呢? (IBM先进计算机系统部的工程师对微芯片的评论,1968年) 97、我们没有理由让每一个人在家都拥有一台电脑。 (肯奥尔森,数据设备公司(DEC)总裁,1977年) 98、640K对每一个人来说都已足够。 (比尔盖茨,1981年) 99、WindowsNT的RAM寻址空间可达2G,这比任何应用程序所需都要多。 (微软,谈及WindowsNT的开发时所言,1992年) 100、我们永远也无法真正成为无纸化社会,直到掌上电脑一族发布擦我1.0*(WipeMe1.0)为止。 (安迪皮尔逊,商界领袖) *译者注:意思是说难道你大便不用纸吗? 101、长此以往,除了按键的手指外,人类的肢体将全部退化。 (弗兰克劳埃德赖特,建筑师) 附:英文版 2009 - 05 - 24 101 Great Computer Programming Quotes 关键字: 精彩转载 People always fear change. People feared electricity when it was invented, didnt they? People feared coal, they feared gas-powered engines. There will always be ignorance, and ignorance leads to fear. But with time, people will come to accept their silicon masters. As Bill Gates once warned, computers have indeed become our silicon masters, pervading nearly every aspect of our modern lives. As a result, some of the greatest minds of our time have pondered the significance of computers and software on the human condition. Following are 101 great quotes about computers, with an emphasis on programming, since after all this is a software development site. Computers Computers are useless. They can only give you answers. (Pablo Picasso) Computers are like bikinis. They save people a lot of guesswork. (Sam Ewing) They have computers, and they may have other weapons of mass destruction. (Janet Reno) Thats whats cool about working with computers. They dont argue, they remember everything, and they dont drink all your beer. (Paul Leary) If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside. (Robert X. Cringely) Computer Intelligence Computers are getting smarter all the time. Scientists tell us that soon they will be able to talk to us. (And by they, I mean computers. I doubt scientists will ever be able to talk to us.) (Dave Barry) Ive noticed lately that the paranoid fear of computers becoming intelligent and taking over the world has almost entirely disappeared from the common culture. Near as I can tell, this coincides with the release of MS-DOS. (Larry DeLuca) The question of whether computers can think is like the question of whether submarines can swim. (Edsger W. Dijkstra) Its ridiculous to live 100 years and only be able to remember 30 million bytes. You know, less than a compact disc. The human condition is really becoming more obsolete every minute. (Marvin Minsky) Trust The citys central computer told you? R2D2, you know better than to trust a strange computer! (C3PO) Never trust a computer you cant throw out a window. (Steve Wozniak) Hardware Hardware: The parts of a computer system that can be kicked. (Jeff Pesis) Software Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves. (Alan Kay) Ive finally learned what upward compatible means. It means we get to keep all our old mistakes. (Dennie van Tassel) Operating Systems There are two major products that come out of Berkeley: LSD and UNIX. We dont believe this to be a coincidence. (Jeremy S. Anderson) 19 Jan 2038 at 3:14:07 AM (End of the word according to Unix2^32 seconds after January 1, 1970) Every operating system out there is about equal We all suck. (Microsoft senior vice president Brian Valentine describing the state of the art in OS security, 2003) Microsoft has a new version out, Windows XP, which according to everybody is the most reliable Windows ever. To me, this is like saying that asparagus is the most articulate vegetable ever. (Dave Barry) Internet The Internet? Is that thing still around? (Homer Simpson) The Web is like a dominatrix. Everywhere I turn, I see little buttons ordering me to Submit. (Nytwind) Come to think of it, there are already a million monkeys on a million typewriters, and Usenet is nothing like Shakespeare. (Blair Houghton) Software Industry The most amazing achievement of the computer software industry is its continuing cancellation of the steady and staggering gains made by the computer hardware industry. (Henry Petroski) True innovation often comes from the small startup who is lean enough to launch a market but lacks the heft to own it. (Timm Martin) It has been said that the great scientific disciplines are examples of giants standing on the shoulders of other giants. It has also been said that the software industry is an example of midgets standing on the toes of other midgets. (Alan Cooper) It is not about bits, bytes and protocols, but profits, losses and margins. (Lou Gerstner) We are Microsoft. Resistance Is Futile. You Will Be Assimilated. (Bumper sticker) Software Demos No matter how slick the demo is in rehearsal, when you do it in front of a live audience, the probability of a flawless presentation is inversely proportional to the number of people watching, raised to the power of the amount of money involved. (Mark Gibbs) Software Patents The bulk of all patents are crap. Spending time reading them is stupid. Its up to the patent owner to do so, and to enforce them. (Linus Torvalds) Complexity Controlling complexity is the essence of computer programming. (Brian Kernigan) Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges, and it causes end-user and administrator frustration. (Ray Ozzie) There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies. (C.A.R. Hoare) The function of good software is to make the complex appear to be simple. (Grady Booch) Ease of Use Just remember: youre not a dummy, no matter what those computer books claim. The real dummies are the people whothough technically expertcouldnt design hardware and software thats usable by normal consumers if their lives depended upon it. (Walter Mossberg) Software suppliers are trying to make their software packages more user-friendly Their best approach so far has been to take all the old brochures and stamp the words user-friendly on the cover. (Bill Gates) Theres an old story about the person who wished his computer were as easy to use as his telephone. That wish has come true, since I no longer know how to use my telephone. (Bjarne Stroustrup) Users Any fool can use a computer. Many do. (Ted Nelson) There are only two industries that refer to their customers as users. (Edward Tufte) Programmers Programmers are in a race with the Universe to create bigger and better idiot-proof programs, while the Universe is trying to create bigger and better idiots. So far the Universe is winning. (Rich Cook) Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris. (Larry Wall) The trouble with programmers is that you can never tell what a programmer is doing until its too late. (Seymour Cray) Thats the thing about people who think they hate computers. What they really hate is lousy programmers. (Larry Niven) For a long time it puzzled me how something so expensive, so leading edge, could be so useless. And then it occurred to me that a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are, in short, a perfect match. (Bill Bryson) Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter. (Eric Raymond) A programmer is a person who passes as an exacting expert on the basis of being able to turn out, after innumerable punching, an infinite series of incomprehensive answers calculated with micrometric precisions from vague assumptions based on debatable figures taken from inconclusive documents and carried out on instruments of problematical accuracy by persons of dubious reliability and questionable mentality for the avowed purpose of annoying and confounding a hopelessly defenseless department that was unfortunate enough to ask for the information in the first place. (IEEE Grid newsmagazine) A hacker on a roll may be able to producein a period of a few monthssomething that a small development group (say, 7-8 people) would have a hard time getting together over a year. IBM used to report that certain programmers might be as much as 100 times as productive as other workers, or more. (Peter Seebach) The best programmers are not marginally better than merely good ones. They are an order-of-magnitude better, measured by whatever standard: conceptual creativity, speed, ingenuity of design, or problem-solving ability. (Randall E. Stross) A great lathe operator commands several times the wage of an average lathe operator, but a great writer of software code is worth 10,000 times the price of an average software writer. (Bill Gates) Programming Dont worry if it doesnt work right. If everything did, youd be out of a job. (Moshers Law of Software Engineering) Measuring programming progress by lines of code is like measuring aircraft building progress by weight. (Bill Gates) Writing code has a place in the human hierarchy worth somewhere above grave robbing and beneath managing. (Gerald Weinberg) First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. (George Carrette) First, solve the problem. Then, write the code. (John Johnson) Optimism is an occupational hazard of programming; feedback is the treatment. (Kent Beck) To iterate is human, to recurse divine. (L. Peter Deutsch) The best thing about a boolean is even if you are wrong, you are only off by a bit. (Anonymous) Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. (Stan Kelly-Bootle) Programming Languages There are only two kinds of programming languages: those people always bitch about and those nobody uses. (Bjarne Stroustrup) PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil perpetrated by skilled but perverted professionals. (Jon Ribbens) The use of COBOL cripples the mind; its teaching should therefore be regarded as a criminal offense. (E.W. Dijkstra) It is practically impossible to teach good programming style to students that have had prior exposure to BASIC. As potential programmers, they are mentally mutilated beyond hope of regeneration. (E. W. Dijkstra) I think Microsoft named .Net so it wouldnt show up in a Unix directory listing. (Oktal) There is no programming languageno matter how structuredthat will prevent programmers from making bad programs. (Larry Flon) Computer language design is just like a stroll in the park. Jurassic Park, that is. (Larry Wall) C/C++ Fifty years of programming language research, and we end up with C++? (Richard A. OKeefe) Writing in C or C++ is like running a chain saw with all the safety guards removed. (Bob Gray) In C++ its harder to shoot yourself in the foot, but when you do, you blow off your whole leg. (Bjarne Stroustrup) C++ : Where friends have access to your private members. (Gavin Russell Baker) One of the main causes of the fall of the Roman Empire was thatlacking zerothey had no way to indicate successful termination of their C programs. (Robert Firth) Java Saying that Java is nice because it works on all OSes is like saying that anal sex is nice because it works on all genders. (Alanna) Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDNT be like. (pixadel) If Java had true garbage collection, most programs would delete themselves upon execution. (Robert Sewell) Open Source Software is like sex: Its better when its free. (Linus Torvalds) The only people who have anything to fear from free software are those whose products are worth even less. (David Emery) Code Good code is its own best documentation. (Steve McConnell) Any code of your own that you havent looked at for six or more months might as well have been written by someone else. (Eaglesons Law) The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. (Tom Cargill) Software Development Good programmers use their brains, but good guidelines save us having to think out every case. (Francis Glassborow) In software, we rarely have meaningful requirements. Even if we do, the only measure of success that matters is whether our solution solves the customers shifting idea of what their problem is. (Jeff Atwood) Considering the current sad state of our computer programs, software development is clearly still a black art, and cannot yet be called an engineering discipline. (Bill Clinton) You cant have great software without a great team, and most software teams behave like dysfunctional families. (Jim McCarthy) Debugging As soon as we started programming, we found to our surprise that it wasnt as easy to get programs right as we had thought. Debugging had to be discovered. I can remember the exact instant when I realized that a large part of my life from then on was going to be spent in finding mistakes in my own programs. (Maurice Wilkes discovers debugging, 1949) Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you areby definitionnot smart enough to debug it. (Brian Kernighan) If debugging is the process of removing bugs, then programming must be the process of putting them in. (Edsger W. Dijkstra) Quality I dont care if it works on your machine! We are not shipping your machine! (Vidiu Platon) Programming is like sex: one mistake and youre providing support for a lifetime. (Michael Sinz) There are two ways to write error-free programs; only the third one works. (Alan J. Perlis) You can either have software quality or you can have pointer arithmetic, but you cannot have both at the same time. (Bertrand Meyer) If McDonalds were run like a software company, one out of every hundred Big Macs would give you food poisoning, and the response would be, Were sorry, heres a coupon for two more. (Mark Minasi) Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. (Martin Golding) To err is human, but to really foul things up you need a computer. (Paul Ehrlich) A computer lets you make more mistakes faster than any invention in human historywith the possible exceptions of handguns and tequila. (Mitch Radcliffe) Predictions Everything that can be invented has been invented. (Charles H. Duell, Commissioner, U.S. Office of Patents, 1899) I think theres a world market for about 5 computers. (Thomas J. Watson, Chairman of the Board, IBM, circa 1948) It would appear that we have reached the limits of what it is possible to achieve with computer technology, although one should be careful with such statements, as they tend to sound pretty silly in 5 years. (John Von Neumann, circa 1949) But what is it good for? (Engineer at the Advanced Computing Systems Division of IBM, commenting on the microchip, 1968) There is no reason for any individual to have a computer in his home. (Ken Olson, President, Digital Equipment Corporation, 1977) 640K ought to be enough for anybody. (Bill Gates, 1981) Windows NT addresses 2 Gigabytes of RAM, which is more than any application will ever need. (Microsoft, on the development of Windows NT, 1992) We will never become a truly paper-less society until the Palm Pilot folks come out with WipeMe 1.0 . (Andy Pierson) If it keeps up, man will atrophy all his limbs but the push-button finger. (Frank Lloyd Wright)
个人分类: 转载随记|5290 次阅读|1 个评论
【转载】22条经典的编程引言
freton 2009-9-27 17:38
22条经典的编程引言 HACKER 2009-05-24 15:08 阅读 51 评论 6 字号: 大 大 中 中 小 小 下面的这些经典的引言来自英文,也许有些我翻译的是不很好,所以,我提供了中英对照,如果有问题,请大家指正。 过早的优化是万恶之源。Premature optimization is the root of all evil! - Donald Knuth 在水里行走和以一个需求规格进行软件开发,有一点是相同的,那就是如果水或需求都被冻住不了,那么行走和软件开发都会变得容易。Walking on water and developing software from a specification are easy if both are frozen - Edward V Berard Hofstadter 定理:一件事情总是会花费比你预期更多的时间,就算是你已经考虑过本条Hofstadter 定理。It always takes longer than you expect, even when you take into account Hofstadters Law. - Hofstadters Law 有些遇到问题的人总是会说我知道,我会使用正则表达式,那么,你现在有两个问题了。(意思是:你本想用正则表达式来解决你已有问题,但实际上你又引入了正则表达式的一个新问题)Some people, when confronted with a problem, think I know, Ill use regular expressions. Now they have two problems - Jamie Zawinski 调试程序的难度是写代码的两倍。因此,只要你的代码写的尽可能的清楚,那么你在调试代码时就不需要那么地有技巧。Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. - Brian Kernighan 用代码行来衡量开发进度,无异于用重量来衡量制造飞机的进度。Measuring programming progress by lines of code is like measuring aircraft building progress by weight. - Bill Gates PHP被一些不合格的业余人员造就成了一个小恶魔;而Perl则是被一些熟练的但不正当的专业人员造就成了一个超级大恶魔。PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals. - Jon Ribbens 在两个场合我被问到:请你告诉我,如果你给机器输入了错误的数字,那么,是否还能得到正确的答案?我并不能正确领会这类想法。(意思是:程序需要有纠错的能力吗?)On two occasions I have been asked, Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out? I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. - Charles Babbage 在编程的时候,我们一定要想像一下,以后维护我们自己的代码的那个人会成为一个强烈的精神病人,并且,他还知道我们住在哪里?Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. - Rick Osborne 现代的编程是程序员努力建一个更大更傻的程序和世界正在尝试创造更多更傻的人之间的一种竞赛,目前为止,后者是赢家。Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. - Rich Cook 我才不关于我的代码是否能在你的机器上工作!我们不会给你提供机器。I dont care if it works on your machine! We are not shipping your machine! - Ovidiu Platon 我总是希望我的电脑能够像电话一样容易使用;我的这个希望正在变成现实,因为我现在已经不知道怎么去使用我的电话了。I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone. - Bjarne Stroustrup 计算机是一种在人类历史上所有发明中,可以让你比以前更快地犯更多的错误的发明,同样,其也包括了手枪和龙舌兰酒这两种发明的缺陷。A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila. - Mitch Ratcliffe 如果调试程序是一种标准的可以铲除BUG的流程,那么,编程就是把他们放进来的流程。If debugging is the process of removing software bugs, then programming must be the process of putting them in. - E. W. Dijkstra 教一群被BASIC先入为主的学生,什么是好的编程风格简直是一件不可能的事。对于一些有潜力的程序员,他们所受到的智力上的伤害远远超过了重建他们的信心。It is practically impossible to teach good programming style to students that have had prior exposure to BASIC. As potential programmers, they are mentally mutilated beyond hope of regeneration. - E. W. Dijkstra 理论上来说,理论和实际是一样的。但实际上来说,他们则不是。In theory, theory and practice are the same. In practice, theyre not. - Unknown 只有两个事情是无穷尽的:宇宙和人类的愚蠢。当然,我现在还不能确定宇宙是无穷尽的。Two things are infinite: the universe and human stupidity; and Im not sure about the universe. - Albert Einstein Perl这种语言就好像是被RSA加密算法加密过的一样。Perl - The only language that looks the same before and after RSA encryption. - Keith Bostic 我爱最终期限,我喜欢嗖嗖嗖的声音就像他们在飞一样。I love deadlines. I like the whooshing sound they make as they fly by. - Douglas Adams 说Java好的是因为它跨平台就像好像说肛交好是因为其可以适用于一切性别。Saying that Java is good because it works on all platforms is like saying **** sex is good because it works on all genders - Unknown XML就像是一种强暴如果它不能解决你的问题,那只能说明你没有用好它。XML is like violence - if it doesnt solve your problems, you are not using enough of it. - Unknown 爱因期坦说,自然界中的一切一定会有一个简单的解释,因为上帝并不是反复无常和独裁的。当然,不会有什么信仰能程序员像爱因期坦那样感到舒服。Einstein argued that there must be simplified explanations of nature, because God is not capricious or arbitrary. No such faith comforts the software engineer. - Fred Brooks
个人分类: 转载随记|299 次阅读|0 个评论
70年代:为了学术而放弃金钱的徐迎晓【转载】
maywuyi 2009-3-5 11:24
最近看到一篇介绍IT人生的文章,感觉很有代表性,转载如下: 一.请先介绍你的出生日期、籍贯、现任工作单位和职务、参与工作时间,还有历年来的工作履历。 徐迎晓 出生于1973年,籍贯:江苏淮阴,1996年开始参加工作。1993年保送东南大学机械系硕士研究生,经过激烈竞争,成功地进入该系最偏向计算机的计算机集成制造研究方向,完成了由本科的机械专业向计算机方向转移的第一小步。1996年来到上海大学网络中心,算是正式跨入IT界,之间经历了多家IT公司的兼职,做培训、写技术文章、出书和做研究,日趋成熟,游刃有余。1999年考入复旦大学计算机软件与理论专业,2002年7月获博士学位,最终摆脱非科班出生的帽子。2002年破格评上上海大学副研究员,圆了部分学术梦想。 二、请回答填写下列问题。根据自己的真实情况和感受作答,长短不限,但必须全部属实。 1、进来IT业界这么久,对你个人的改变或发展影响最大的是什么?   进入网络中心做网管,并在当时其下的Leap公司做IT培训,使我从一个网络的门外汉成为不折不扣的网络专家。伴随着公司一起长大,成为公司的骨干,相继获取了CAN/CNE/CNI/SCJP/CCNA一大堆证书,摆脱了毕业时惶惶然不知能够做什么的心境,在讲台上获得了绝对的自信,在做工程项目中发现IT界没有我做不了的事情。 2、在这行干到现在,你对钱有什么看法?   受传统思想毒害太深,一直以为钱是身外之物,一心追求学术发展,因而找工作时也全部在高校中求职。工作以后曾经有多个月薪两万又很轻松的工作摆在我面前,但是我主动放弃了,只是为了心中的学术梦想。但当我的父母为居无定所而苦恼,母亲住院期间因为现金没跟上而被突然停药,岳母住院时因为手头没有足够的住院押金而在走廊中呻吟着等待筹集现金时,我知道对于生于70年代的我们,金钱已经不仅仅是个人的事情。我们的父母是被时代牺牲的一代,生于70年代的我们无法置之度外,对金钱的潇洒或许只能等待下一代。年近30,才发现为了学术而放弃金钱的想法也是很傻的。学术的背后仍是金钱:没有钱,就没有学术助手,只有孤军奋战;写出来的学术论文水平再高,交不出钱仍无法发表;没有钱也无法参加国际会议进行学术交流。而即使在学术机构,争取到多少科研经费仍比个人的学术水平更重要。事实上,至少在目前的社会,个人的成就感更多地来自金钱的多少而非学术的高下,而金钱的多少在很多时候更决定着学术声誉的高下。如果上天再给我一次机会,我会先去挣足足够的钱。 3、你觉得入行以后你做的最成功的一件事是什么?请详细说来听听。(请交待事情发生的时间、地点、人物、事情经过、结果) 在南京读硕士研究生后不久,导师课题很少,连使用计算机的机会都很少,我总觉得吃不饱,谁给我用一用计算机我愿意一分钱工钱不要,甚至倒贴。但那时大学生兼职主要还是家教,技术类的兼职机会还很少。经过漫长的等待,终于在学校门口的树干上看到了一个小广告,是南京师范大学下面的一个公司招C++程序员,那时C++刚开始热门,图书馆只有清华出版社出版的一套书,我忙借过来狂看。图书馆阅览室是当天借当天还的,因此每天早上都急急地去抢书,生怕被别人借去了。狂看三天后,以前只听过面向对象这一个词的我终于初步知道了类、对象、方法之类的概念了,赶在截止之前最后一天去面试,面对诸多高手,居然凭自己的东南大学的牌子而和另一个校友一起胜出。这是我的第一个计算机类的兼职,一个月的不舍昼夜和废寝忘食,终于赚来了近500元钱。现在如果还有机会像那时那么辛苦,足够我赚好几万了,但那时研究生的补贴只有几十元,各种加起来100元上下就是我一个月全部的收入了。500元虽不是天文数字,但也像现在的几万元足够让我心狂跳了。觉得赚钱真是容易,又给我电脑用又给我这么多钱。拿出100多元给家里买了个微型缝纫机,其余的存起来。买缝纫机时走在新街口百货商店和鼓楼百货商店,第一次发现店里的东西真便宜,大部分东西我的500元都可以买得起。 4、在未来的日子里,你最看重什么,最渴望得到什么?   最看重生活质量。荣誉、地位、学术、金钱一切都是假的,这些东西只有能够提高自己的生活质量才是活生生的让自己和家人受益。最渴望宽敞的住房,安静的书房和自由的工作。 5、你觉得生在70年代的IT人有什么特征是其他年代的人没有的?   不论是计算机还是国家,生于70年代的IT人都经历了从简单到复杂,从贫乏到丰富,从困苦到小康的过程。因此,我们能够适应最艰苦的物质生活和最原始的计算机操作,也能够享受最富足的小康生活和手写/语音输入、网络会议。我们是历史的见证人和参与者。但生在70年代初的IT人极可能是被牺牲的一代,在终于等到了Internet所带来的与国际接轨、各尽所能的时代时,最富有创造力的年华已经快要过去。我在最具有创造力的年龄没有计算机使用,只有在教室的桌子上闭着眼睛练键盘指法。生于80年代的IT人将跳过我们十几年的弯路,直接与国际接轨。生于70年代初的IT人赶上了末班车,而生于70年代末和80年代的IT人将出现一批真正的大师。 三、你对同龄人和后辈还有什么话要说的?   发展是硬道理。不要为了讨好任何人做牺牲。做任何事情都是有人喝彩有人说风凉话,只要一件事有助于自己的发展,那就去做,不管周围的舆论和冠冕堂皇的宣传。 转载地址: http://arch.pconline.com.cn/news/subjectnews/xl/10212/118702.html
个人分类: 读书笔记|6488 次阅读|2 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-15 15:48

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部