Python标准库参考手册


Share/Save/Bookmark

*********************************************
* 日期: 2009年11月23日 - *
* 版本: v 0.0.1 *
* 平台: python 2.6 *
* 翻译: xenos *
* 邮件: xenoszh@gmail.com *
* 版权: 欢迎转载,请保留署名. *
*全手工翻译,个人学习之用,如果有错误,欢迎指正*
*********************************************
google也不知道搞个置顶功能,为了置顶个帖子,还要改成将来时间.得了,既然玛雅人预言2012年12月21日黑夜降临后,22日白昼永不到来,人类也将在22日那天灭绝.我就改成2009年12月23日吧.21日永夜,22日灭绝,23日该新生了吧.


Python标准库参考手册
版本: Python 2.6
日期: 2009年11月23日
翻译: xenoszh@gmail.com


Python语言参考手册描述了Python的确切语法和Python语言的定义,这个Python标准库参考手册描述了随Python分发的标准库。另外,它也介绍了那些经常在Python发行时包括一些可选组件。

Python标准库涵盖内容非常广泛,如下面这个很长的目录列表显示。该库包含内置的模块(C语言编写),如文件输入输出,为Python程序员提供访问系统功能;也包含了Python编写解决编程时经常碰到的很多问题的标准解决方法。库中的一些模块明确将一些平台相关的APIs抽象出来,代之以平台原生APIs,旨在加强Python程序的可移植性。

Windows平台的Python的安装通常包括整个标准库,而且还包含许多其他组件。对于Unix-like操作系统的Python通常作为软件包而提供,因此它可能需要使用操作系统提供的包安装工具来获取部分或所有的可选组件。

除了标准库,还有成千上万与日俱增的软件包组件(从单独的程序和模块到整个程序开发框架),这些可从Python软件包目录获得。


Python标准库参考手册




    * 1. 简介
    * 2. 内置函数    1:A-H    2:I-R    3:S-Z
    * 3. 次要内置函数
    * 4. 内置常量
          o 4.1. site模块增加的内置常量
    * 5. 内置对象
    * 6. 内置类型
          o 6.1. 真值检测
          o 6.2. 布尔运算符 — and, or, not
          o 6.3. 比较运算
          o 6.4. 数值类型 — int, float, long, complex
          o 6.5. 迭代类型
          o 6.6. 序列类型 — str, unicode, list, tuple, buffer, xrange
          o 6.7. 集合类型 — set, frozenset
          o 6.8. 映射类型 — dict
          o 6.9. 文件对象
          o 6.10. 上下文管理类型
          o 6.11. 其他内置类型
          o 6.12. 特殊属性
    * 7. 内置异常
          o 7.1. 异常层次结构
    * 8. 字符串服务
          o 8.1. string — 常用字符串操作
          o 8.2. re — 正则表达式操作
          o 8.3. struct — 用二进制数据包表示字符串
          o 8.4. difflib — 帮助监测程序变化
          o 8.5. StringIO — 象文件一样读写字符串
          o 8.6. cStringIO — StringIO的高速(效率?)版本
          o 8.7. textwrap — 文本折叠和填充
          o 8.8. codecs — 基类和编解码注册
          o 8.9. unicodedata — Unicode数据库
          o 8.10. stringprep — 网络字符串预备
          o 8.11. fpformat — 浮点转换
    * 9. 数据类型
          o 9.1. datetime — 基本时间日期类型
          o 9.2. calendar — 通用日期相关函数
          o 9.3. collections — 高性能容器数据类型
          o 9.4. heapq — 堆队列算法
          o 9.5. bisect — 数组分半算法
          o 9.6. array — 高效数值数组
          o 9.7. sets — 元素具有唯一性的无序集合
          o 9.8. sched — 事件调度
          o 9.9. mutex — 互斥现象的支持
          o 9.10. queue — 同步队列类
          o 9.11. weakref — 弱引用
          o 9.12. UserDict — 字典对象的wrapper类
          o 9.13. UserList — 列表对象的wrapper类
          o 9.14. UserString — 字符串对象的wrapper类
          o 9.15. types — 内置类型的名称
          o 9.16. new — 运行时内部对象的创建
          o 9.17. copy — 深拷贝和浅拷贝
          o 9.18. pprint — 数据的优美打印
          o 9.19. repr — repr()的替代实现
    * 10. 数值与数学模块
          o 10.1. numbers — 数值抽象基类
          o 10.2. math — 数学计算函数
          o 10.3. cmath — 复数数学计算函数
          o 10.4. decimal — 十进制定点与浮点运算
          o 10.5. fractions — 有理数
          o 10.6. random — 生成伪随机数
          o 10.7. itertools — 高效循环迭代函数
          o 10.8. functools — 可调用对象的高阶函数与运算
          o 10.9. operator — 标准运算符的函数样式
    * 11. 文件与目录存取
          o 11.1. os.path — 常用路径操作
          o 11.2. fileinput — 遍历多个输入流
          o 11.3. stat — 解释stat()结果
          o 11.4. statvfs — os.statvfs()使用的常量
          o 11.5. filecmp — 文件与目录比较
          o 11.6. tempfile — 生成临时文件与目录
          o 11.7. glob — Unix类型的路径格式扩展
          o 11.8. fnmatch — Unix类型的文件名格式匹配
          o 11.9. linecache — 文本行的随机存取
          o 11.10. shutil — 高级文件操作符
          o 11.11. dircache — 缓存的目录列表
          o 11.12. macpath — Mac OS 9路径处理函数
    * 12. 数据持久化
          o 12.1. pickle — Python对象序列化
          o 12.2. cPickle — 快速(高效?)的pickle
          o 12.3. copy_reg — 注册pickle支持函数
          o 12.4. shelve — Python对象持久化
          o 12.5. marshal — Python内部对象序列化
          o 12.6. anydbm — 访问DBM类型数据库
          o 12.7. whichdb — 猜测数据库的DBM模块
          o 12.8. dbm — 简明数据库接口
          o 12.9. gdbm — GNU的dbm解释
          o 12.10. dbhash — BSD数据库库的DBM类型接口
          o 12.11. bsddb — Berkeley DB库的接口
          o 12.12. dumbdbm — 轻便的DBM实现
          o 12.13. sqlite3 — SQLite数据库的DB-API 2.0接口
    * 13. 数据压缩与归档
          o 13.1. zlib — 兼容gzip的压缩方法
          o 13.2. gzip — 支持gzip文件
          o 13.3. bz2 — 兼容bzip2的压缩方法
          o 13.4. zipfile — 处理ZIP档案文件
          o 13.5. tarfile — 读写tar档案文件
    * 14. 文件格式
          o 14.1. csv — CSV文件读写
          o 14.2. ConfigParser — 配置文件分析
          o 14.3. robotparser — robots.txt分析
          o 14.4. netrc — netrc文件处理
          o 14.5. xdrlib — XDR数据编解码
          o 14.6. plistlib — Mac OS X .plist文件的生成与分析
    * 15. 密码服务
          o 15.1. hashlib — 安全哈希表与消息摘要
          o 15.2. hmac — 消息认证的Keyed-Hashing
          o 15.3. md5 — MD5消息摘要算法
          o 15.4. sha — SHA-1消息摘要算法
    * 16. 通用操作系统服务
          o 16.1. os — 庞杂的操作系统接口
          o 16.2. io — 流处理的核心工具
          o 16.3. time — 时间处理和转换
          o 16.4. optparse — 更强的命令行参数分析
          o 16.5. getopt — 命令行参数分析
          o 16.6. logging — Python的日志功能
          o 16.7. getpass — 轻便的密码输入
          o 16.8. curses — 字符元显示的终端处理器
          o 16.9. curses.textpad — curses程序的文本输入部件
          o 16.10. curses.wrapper — curses程序的终端处理器
          o 16.11. curses.ascii — ASCII字符应用
          o 16.12. curses.panel — curses的面板堆栈扩展
          o 16.13. platform — 操作系统底层数据访问
          o 16.14. errno — 标准errno系统符号
          o 16.15. ctypes — Python的外部函数库
    * 17. 可选的操作系统服务
          o 17.1. select — 等待I/O完成
          o 17.2. threading — 高级线程接口
          o 17.3. thread — 多线程控制
          o 17.4. dummy_threading — threading模块的简易替代
          o 17.5. dummy_thread — thread模块的简易替代
          o 17.6. multiprocessing — 基于处理器的threading接口
          o 17.7. mmap — 内存映射文件支持
          o 17.8. readline — GNU行 readline接口
          o 17.9. rlcompleter — GNU readline的完整函数
    * 18. 进程间通讯与网络
          o 18.1. subprocess — 子进程管理
          o 18.2. socket — 底层网络接口
          o 18.3. ssl — socket对象的SSL包
          o 18.4. signal — 设置异步事件处理器
          o 18.5. popen2 — 可存取的I/O流子进程
          o 18.6. asyncore — 异步socket处理器
          o 18.7. asynchat — 异步socket命令/应答处理器
    * 19. 网络数据处理
          o 19.1. email — 邮件与MIME处理包
          o 19.2. json — JSON编码器与解码器
          o 19.3. mailcap — Mailcap文件处理
          o 19.4. mailbox — 操作多种格式邮件箱
          o 19.5. mhlib — 存取MH邮件箱
          o 19.6. mimetools — MIME消息分析工具
          o 19.7. mimetypes — 映射文件名到MIME格式
          o 19.8. MimeWriter — 通用MIME文件写入
          o 19.9. mimify — MIME处理邮件消息
          o 19.10. multifile — 包含多个部分的文件支持
          o 19.11. rfc822 — 分析RFC 2822邮件头
          o 19.12. base64 — RFC 3548: Base16, Base32, Base64数据编码
          o 19.13. binhex — 编/解码binhex4文件
          o 19.14. binascii — 二进制与ASCII转换
          o 19.15. quopri — 编/解码MIME编码数据
          o 19.16. uu — 编/解码uuencode文件
    * 20. 结构化标记处理工具
          o 20.1. HTMLParser — 简易HTML/XHTML分析器
          o 20.2. sgmllib — 简易SGML分析器
          o 20.3. htmllib — HTML文档分析器
          o 20.4. htmlentitydefs — HTML通用实体定义
          o 20.5. xml.parsers.expat — 利用Expat实现快速XML分析
          o 20.6. xml.dom — 文件对象模型API
          o 20.7. xml.dom.minidom — 轻量级DOM实现
          o 20.8. xml.dom.pulldom — 建立DOM子树的支持
          o 20.9. xml.sax — SAX2分析器支持
          o 20.10. xml.sax.handler — SAX处理器的基类
          o 20.11. xml.sax.saxutils — SAX工具
          o 20.12. xml.sax.xmlreader — XML分析器接口
          o 20.13. xml.etree.ElementTree — ElementTree XML API
    * 21. 网络通讯协议与支持
          o 21.1. webbrowser — 方便的网络浏览器控制器
          o 21.2. cgi — CGI支持
          o 21.3. cgitb — CGI脚本回溯管理器
          o 21.4. wsgiref — WSGI功用与参考实现
          o 21.5. urllib — 根据URL打开任意资源
          o 21.6. urllib2 — 打开URLs的可扩展库
          o 21.7. httplib — HTTP协议客户端
          o 21.8. ftplib — FTP协议客户端
          o 21.9. poplib — POP3协议客户端
          o 21.10. imaplib — IMAP4协议客户端
          o 21.11. nntplib — NNTP协议客户端
          o 21.12. smtplib — SMTP协议客户端
          o 21.13. smtpd — SMTP服务
          o 21.14. telnetlib — Telnet客户端
          o 21.15. uuid — UUID对象(参照RFC 4122)
          o 21.16. urlparse — 分析URLs得到不同部分
          o 21.17. SocketServer — 网络服务框架
          o 21.18. BaseHTTPServer — 基础HTTP服务
          o 21.19. SimpleHTTPServer — 简易HTTP请求处理器
          o 21.20. CGIHTTPServer — 兼容CGI的HTTP请求处理器
          o 21.21. cookielib — HTTP客户端的Cookie处理
          o 21.22. Cookie — HTTP状态管理
          o 21.23. xmlrpclib — XML-RPC客户端存取
          o 21.24. SimpleXMLRPCServer — 基础XML-RPC服务
          o 21.25. DocXMLRPCServer — 自我文档化的XML-RPC服务
    * 22. 多媒体服务
          o 22.1. audioop — 操作原始音频数据
          o 22.2. imageop — 操作原始图像数据
          o 22.3. aifc — 读写AIFF和AIFC文件
          o 22.4. sunau — 读写Sun AU文件
          o 22.5. wave — 读写WAV文件
          o 22.6. chunk — 读取IFF块数据
          o 22.7. colorsys — 不同颜色系统之间转换
          o 22.8. imghdr — 确定图像类型
          o 22.9. sndhdr — 确定声音文件类型
          o 22.10. ossaudiodev — 访问OSS兼容的音频设备
    * 23. 国际化
          o 23.1. gettext — 多种语言的国际化服务
          o 23.2. locale — 国际化服务
    * 24. 程序框架
          o 24.1. cmd — 面向行的命令解释程序支持
          o 24.2. shlex — 简易语法分析
    * 25. 图形用户接口(GUI) - Tk
          o 25.1. Tkinter — Tcl/Tk的Python接口
          o 25.2. Tix — Tk的扩充部件
          o 25.3. ScrolledText — 卷动文本部件
          o 25.4. turtle — Tk的海龟图(?)
          o 25.5. IDLE
          o 25.6. 其他图形用户接口包
    * 26. 开发工具
          o 26.1. pydoc — 文档生成器宇在线帮助系统
          o 26.2. doctest — 测试交互式Pythono例子
          o 26.3. unittest — 单元测试框架
          o 26.4. 2to3 — 自动转化Python 2代码到Python 3
          o 26.5. test — Python的回归测试包
          o 26.6. test.test_support — 测试的效用函数
    * 27. 调试与程序概要分析
          o 27.1. bdb — 调试器框架
          o 27.2. pdb — Python调试器
          o 27.3. 调试器命令
          o 27.4. Python分析器
          o 27.5. hotshot — 高性能日志分析器
          o 27.6. timeit — 测量小代码段的执行时间
          o 27.7. trace — Python语句执行跟踪
    * 28. Python运行时服务
          o 28.1. sys — 系统相关的参数和函数
          o 28.2. __builtin__ — 内置对象
          o 28.3. future_builtins — Python 3内置
          o 28.4. __main__ — 顶层脚本环境
          o 28.5. warnings — 警告控制
          o 28.6. contextlib — with语句上下文应用
          o 28.7. abc — 抽象基类
          o 28.8. atexit — Exit处理器
          o 28.9. traceback — 打印或检索栈回溯
          o 28.10. __future__ — 未来版本的语句定义
          o 28.11. gc — 垃圾回收接口
          o 28.12. inspect — 审查活动对象
          o 28.13. site — 站点相关配置钩子
          o 28.14. user — 用户相关配置钩子
          o 28.15. fpectl — 浮点异常控制
    * 29. 定制Python解释器
          o 29.1. code — 解释器基类
          o 29.2. codeop — 编译Python代码
    * 30. 限制执行
          o 30.1. rexec — 限制执行框架
          o 30.2. Bastion — 对象的限定访问
    * 31. 导入模块
          o 31.1. imp — 访问import内部
          o 31.2. imputil — 导入功能
          o 31.3. zipimport — 从zip归档文件导入模块
          o 31.4. pkgutil — 包扩展功能
          o 31.5. modulefinder — 搜索脚本使用的模块
          o 31.6. runpy — 定位/执行Python模块
    * 32. Python语言服务
          o 32.1. parser — 访问Python分析树
          o 32.2. 抽象语法树
          o 32.3. symtable — 访问编译器符号表
          o 32.4. symbol — Python分析树使用的常量
          o 32.5. token — Python分析树使用的常量
          o 32.6. keyword — Python关键字检测
          o 32.7. tokenize — Python源文件语法分析器
          o 32.8. tabnanny — 缩进检测
          o 32.9. pyclbr — Python类浏览支持
          o 32.10. py_compile — 编译Python源文件
          o 32.11. compileall — 字节编译Python库
          o 32.12. dis — 反编译Python字节码
          o 32.13. pickletools — pickle开发人员工具
          o 32.14. distutils — 建立/安装Python模块
    * 33. Python编译器包
          o 33.1. 基础接口
          o 33.2. 局限
          o 33.3. Python抽象语法
          o 33.4. 利用访问模式漫步ASTs
          o 33.5. 生成字节码
    * 34. 其他服务
          o 34.1. formatter — 通用输出格式化
    * 35. 微软Windows系统特殊服务
          o 35.1. msilib — 读写微软安装文件
          o 35.2. msvcrt — 来自微软VC++运行时的有用程序
          o 35.3. _winreg — Windows注册表访问
          o 35.4. winsound — Windows声音播放接口
    * 36. Unix系统特殊服务 (是否翻译待定)
          o 36.1. posix — 最常用的POSIX系统调用
          o 36.2. pwd — 密码数据库
          o 36.3. spwd — 隐藏式密码数据库
          o 36.4. grp — 群组数据库
          o 36.5. crypt — Unix密码检测函数
          o 36.6. dl — 在共享对象中调用C函数
          o 36.7. termios — POSIX风格的tty控制
          o 36.8. tty — 终端控制函数
          o 36.9. pty — 伪终端功能
          o 36.10. fcntl — fcntl()ioctl()系统调用
          o 36.11. pipes — 管道共享接口
          o 36.12. posixfile — 类文件对象锁定支持
          o 36.13. resource — 资源利用信息
          o 36.14. nis — Sun’s NIS (黄页)接口
          o 36.15. syslog — Unix系统日志库程序
          o 36.16. commands — 命令执行功能
    * 37. Mac OS X系统特殊服务 (是否翻译待定)
          o 37.1. ic — 访问Mac OS X网络配置
          o 37.2. MacOS — 访问Mac OS解释器特性
          o 37.3. macostools — 方便的文件操作程序
          o 37.4. findertools — finder的苹果事件接口
          o 37.5. EasyDialogs — 基础苹果对话框
          o 37.6. FrameWork — 交互式程序框架
          o 37.7. autoGIL — 事件循环的全局解释器锁定处理
          o 37.8. Mac OS工具箱模块
          o 37.9. ColorPicker — 颜色选择对话框
    * 38. MacPython OSA模块  (是否翻译待定)
          o 38.1. gensuitemodule — 生成OSA stub包
          o 38.2. aetools — OSA客户端支持
          o 38.3. aepack — Python变量与AppleEvent数据容器的互相转换
          o 38.4. aetypes — AppleEvent对象
          o 38.5. MiniAEFrame — 开放式脚本架构服务支持
    * 39. SGI IRIX系统特殊服务 (是否翻译待定)
          o 39.1. al — SGI上的音频函数
          o 39.2. AL — al模块使用的常量
          o 39.3. cd — SGI系统的CD-ROM访问
          o 39.4. fl — 图形用户接口的窗体库
          o 39.5. FL — fl模块使用的常量
          o 39.6. flp — 加载已存的窗体设计函数
          o 39.7. fm — 字体管理接口
          o 39.8. gl — 图形库接口
          o 39.9. DEVICE — gl模块使用的常量
          o 39.10. GL — gl模块使用的常量
          o 39.11. imgfile — SGI系统的imglib文件支持
          o 39.12. jpeg — 读写JPEG文件
    * 40. SunOS系统特殊服务 (是否翻译待定)
          o 40.1. sunaudiodev — 访问Sun音频硬件
          o 40.2. SUNAUDIODEV — sunaudiodev模块使用的常量
    * 41. 未公开模块
          o 41.1. 大量的实用功能
          o 41.2. 平台相关的模块
          o 41.3. 多媒体
          o 41.4. 未公开的Mac OS模块
          o 41.5. 过时的
          o 41.6. SGI相关的特殊模块

More......

[转] 理解矩阵(一,二,三)


Share/Save/Bookmark

来自CSDN大牛孟岩的<理解矩阵> (一,二,三),写的深入浅出,经典至极,收藏之.
原文请见:
http://blog.csdn.net/myan/archive/2006/04/02/647511.aspx
http://blog.csdn.net/myan/archive/2006/04/03/649018.aspx
http://blog.csdn.net/myan/archive/2007/11/03/1865397.aspx

理解矩阵(一)
线性代数课程,无论你从行列式入手还是直接从矩阵入手,从一开始就充斥着莫名其妙。比如说,在全国一般工科院系教学中应用最广泛的同济线性代数教材(现在到了第四版),一上来就介绍逆序数这个“前无古人,后无来者”的古怪概念,然后用逆序数给出行列式的一个极不直观的定义,接着是一些简直犯傻的行列式性质和习题——把这行乘一个系数加到另一行上,再把那一列减过来,折腾得那叫一个热闹,可就是压根看不出这个东西有嘛用。大多数像我一样资质平庸的学生到这里就有点犯晕:连这是个什么东西都模模糊糊的,就开始钻火圈表演了,这未免太“无厘头”了吧!于是开始有人逃课,更多的人开始抄作业。这下就中招了,因为其后的发展可以用一句峰回路转来形容,紧跟着这个无厘头的行列式的,是一个同样无厘头但是伟大的无以复加的家伙的出场——矩阵来了!多年之后,我才明白,当老师犯傻似地用中括号把一堆傻了吧叽的数括起来,并且不紧不慢地说:“这个东西叫做矩阵”的时候,我的数学生涯掀开了何等悲壮辛酸、惨绝人寰的一幕!自那以后,在几乎所有跟“学问”二字稍微沾点边的东西里,矩阵这个家伙从不缺席。对于我这个没能一次搞定线性代数的笨蛋来说,矩阵老大的不请自来每每搞得我灰头土脸,头破血流。长期以来,我在阅读中一见矩阵,就如同阿Q见到了假洋鬼子,揉揉额角就绕道走。


事实上,我并不是特例。一般工科学生初学线性代数,通常都会感到困难。这种情形在国内外皆然。瑞典数学家Lars Garding在其名著Encounter with Mathematics中说:“如果不熟悉线性代数的概念,要去学习自然科学,现在看来就和文盲差不多。”,然而“按照现行的国际标准,线性代数是通过公理化来表述的,它是第二代数学模型,...,这就带来了教学上的困难。”事实上,当我们开始学习线性代数的时候,不知不觉就进入了“第二代数学模型”的范畴当中,这意味着数学的表述方式和抽象性有了一次全面的进化,对于从小一直在“第一代数学模型”,即以实用为导向的、具体的数学模型中学习的我们来说,在没有并明确告知的情况下进行如此剧烈的paradigm shift,不感到困难才是奇怪的。

大部分工科学生,往往是在学习了一些后继课程,如数值分析、数学规划、矩阵论之后,才逐渐能够理解和熟练运用线性代数。即便如此,不少人即使能够很熟练地以线性代数为工具进行科研和应用工作,但对于很多这门课程的初学者提出的、看上去是很基础的问题却并不清楚。比如说:

* 矩阵究竟是什么东西?向量可以被认为是具有n个相互独立的性质(维度)的对象的表示,矩阵又是什么呢?我们如果认为矩阵是一组列(行)向量组成的新的复合向量的展开式,那么为什么这种展开式具有如此广泛的应用?特别是,为什么偏偏二维的展开式如此有用?如果矩阵中每一个元素又是一个向量,那么我们再展开一次,变成三维的立方阵,是不是更有用?

* 矩阵的乘法规则究竟为什么这样规定?为什么这样一种怪异的乘法规则却能够在实践中发挥如此巨大的功效?很多看上去似乎是完全不相关的问题,最后竟然都归结到矩阵的乘法,这难道不是很奇妙的事情?难道在矩阵乘法那看上去莫名其妙的规则下面,包含着世界的某些本质规律?如果是的话,这些本质规律是什么?

* 行列式究竟是一个什么东西?为什么会有如此怪异的计算规则?行列式与其对应方阵本质上是什么关系?为什么只有方阵才有对应的行列式,而一般矩阵就没有(不要觉得这个问题很蠢,如果必要,针对m x n矩阵定义行列式不是做不到的,之所以不做,是因为没有这个必要,但是为什么没有这个必要)?而且,行列式的计算规则,看上去跟矩阵的任何计算规则都没有直观的联系,为什么又在很多方面决定了矩阵的性质?难道这一切仅是巧合?

* 矩阵为什么可以分块计算?分块计算这件事情看上去是那么随意,为什么竟是可行的?

* 对于矩阵转置运算AT,有(AB)T = BTAT,对于矩阵求逆运算A-1,有(AB)-1 = B-1A-1。两个看上去完全没有什么关系的运算,为什么有着类似的性质?这仅仅是巧合吗?


* 为什么说P-1AP得到的矩阵与A矩阵“相似”?这里的“相似”是什么意思?

* 特征值和特征向量的本质是什么?它们定义就让人很惊讶,因为Ax =λx,一个诺大的矩阵的效应,竟然不过相当于一个小小的数λ,确实有点奇妙。但何至于用“特征”甚至“本征”来界定?它们刻划的究竟是什么?

这样的一类问题,经常让使用线性代数已经很多年的人都感到为难。就好像大人面对小孩子的刨根问底,最后总会迫不得已地说“就这样吧,到此为止”一样,面对这样的问题,很多老手们最后也只能用:“就是这么规定的,你接受并且记住就好”来搪塞。然而,这样的问题如果不能获得回答,线性代数对于我们来说就是一个粗暴的、不讲道理的、莫名其妙的规则集合,我们会感到,自己并不是在学习一门学问,而是被不由分说地“抛到”一个强制的世界中,只是在考试的皮鞭挥舞之下被迫赶路,全然无法领略其中的美妙、和谐与统一。直到多年以后,我们已经发觉这门学问如此的有用,却仍然会非常迷惑:怎么这么凑巧?

我认为,这是我们的线性代数教学中直觉性丧失的后果。上述这些涉及到“如何能”、“怎么会”的问题,仅仅通过纯粹的数学证明来回答,是不能令提问者满意的。比如,如果你通过一般的证明方法论证了矩阵分块运算确实可行,那么这并不能够让提问者的疑惑得到解决。他们真正的困惑是:矩阵分块运算为什么竟然是可行的?究竟只是凑巧,还是说这是由矩阵这种对象的某种本质所必然决定的?如果是后者,那么矩阵的这些本质是什么?只要对上述那些问题稍加考虑,我们就会发现,所有这些问题都不是单纯依靠数学证明所能够解决的。像我们的教科书那样,凡事用数学证明,最后培养出来的学生,只能熟练地使用工具,却欠缺真正意义上的理解。

自从1930年代法国布尔巴基学派兴起以来,数学的公理化、系统性描述已经获得巨大的成功,这使得我们接受的数学教育在严谨性上大大提高。然而数学公理化的一个备受争议的副作用,就是一般数学教育中直觉性的丧失。数学家们似乎认为直觉性与抽象性是矛盾的,因此毫不犹豫地牺牲掉前者。然而包括我本人在内的很多人都对此表示怀疑,我们不认为直觉性与抽象性一定相互矛盾,特别是在数学教育中和数学教材中,帮助学生建立直觉,有助于它们理解那些抽象的概念,进而理解数学的本质。反之,如果一味注重形式上的严格性,学生就好像被迫进行钻火圈表演的小白鼠一样,变成枯燥的规则的奴隶。

对于线性代数的类似上述所提到的一些直觉性的问题,两年多来我断断续续地反复思考了四、五次,为此阅读了好几本国内外线性代数、数值分析、代数和数学通论性书籍,其中像前苏联的名著《数学:它的内容、方法和意义》、龚昇教授的《线性代数五讲》、前面提到的Encounter with Mathematics(《数学概观》)以及Thomas A. Garrity的《数学拾遗》都给我很大的启发。不过即使如此,我对这个主题的认识也经历了好几次自我否定。比如以前思考的一些结论曾经写在自己的blog里,但是现在看来,这些结论基本上都是错误的。因此打算把自己现在的有关理解比较完整地记录下来,一方面是因为我觉得现在的理解比较成熟了,可以拿出来与别人探讨,向别人请教。另一方面,如果以后再有进一步的认识,把现在的理解给推翻了,那现在写的这个snapshot也是很有意义的。

因为打算写得比较多,所以会分几次慢慢写。也不知道是不是有时间慢慢写完整,会不会中断,写着看吧。

--------------------------------------------------------------------------


今天先谈谈对线形空间和矩阵的几个核心概念的理解。这些东西大部分是凭着自己的理解写出来的,基本上不抄书,可能有错误的地方,希望能够被指出。但我希望做到直觉,也就是说能把数学背后说的实质问题说出来。

首先说说空间(space),这个概念是现代数学的命根子之一,从拓扑空间开始,一步步往上加定义,可以形成很多空间。线形空间其实还是比较初级的,如果在里面定义了范数,就成了赋范线性空间。赋范线性空间满足完备性,就成了巴那赫空间;赋范线性空间中定义角度,就有了内积空间,内积空间再满足完备性,就得到希尔伯特空间。

总之,空间有很多种。你要是去看某种空间的数学定义,大致都是“存在一个集合,在这个集合上定义某某概念,然后满足某些性质”,就可以被称为空间。这未免有点奇怪,为什么要用“空间”来称呼一些这样的集合呢?大家将会看到,其实这是很有道理的。

我们一般人最熟悉的空间,毫无疑问就是我们生活在其中的(按照牛顿的绝对时空观)的三维空间,从数学上说,这是一个三维的欧几里德空间,我们先不管那么多,先看看我们熟悉的这样一个空间有些什么最基本的特点。仔细想想我们就会知道,这个三维的空间:1. 由很多(实际上是无穷多个)位置点组成;2. 这些点之间存在相对的关系;3. 可以在空间中定义长度、角度;4. 这个空间可以容纳运动,这里我们所说的运动是从一个点到另一个点的移动(变换),而不是微积分意义上的“连续”性的运动,

上面的这些性质中,最最关键的是第4条。第1、2条只能说是空间的基础,不算是空间特有的性质,凡是讨论数学问题,都得有一个集合,大多数还得在这个集合上定义一些结构(关系),并不是说有了这些就算是空间。而第3条太特殊,其他的空间不需要具备,更不是关键的性质。只有第4条是空间的本质,也就是说,容纳运动是空间的本质特征。

认识到了这些,我们就可以把我们关于三维空间的认识扩展到其他的空间。事实上,不管是什么空间,都必须容纳和支持在其中发生的符合规则的运动(变换)。你会发现,在某种空间中往往会存在一种相对应的变换,比如拓扑空间中有拓扑变换,线性空间中有线性变换,仿射空间中有仿射变换,其实这些变换都只不过是对应空间中允许的运动形式而已。

因此只要知道,“空间”是容纳运动的一个对象集合,而变换则规定了对应空间的运动。


下面我们来看看线性空间。线性空间的定义任何一本书上都有,但是既然我们承认线性空间是个空间,那么有两个最基本的问题必须首先得到解决,那就是:

1. 空间是一个对象集合,线性空间也是空间,所以也是一个对象集合。那么线性空间是什么样的对象的集合?或者说,线性空间中的对象有什么共同点吗?

2. 线性空间中的运动如何表述的?也就是,线性变换是如何表示的?

我们先来回答第一个问题,回答这个问题的时候其实是不用拐弯抹角的,可以直截了当的给出答案。线性空间中的任何一个对象,通过选取基和坐标的办法,都可以表达为向量的形式。通常的向量空间我就不说了,举两个不那么平凡的例子:

L1. 最高次项不大于n次的多项式的全体构成一个线性空间,也就是说,这个线性空间中的每一个对象是一个多项式。如果我们以x0, x1, ..., xn为基,那么任何一个这样的多项式都可以表达为一组n+1维向量,其中的每一个分量ai其实就是多项式中x(i-1)项的系数。值得说明的是,基的选取有多种办法,只要所选取的那一组基线性无关就可以。这要用到后面提到的概念了,所以这里先不说,提一下而已。


L2. 闭区间[a, b]上的n阶连续可微函数的全体,构成一个线性空间。也就是说,这个线性空间的每一个对象是一个连续函数。对于其中任何一个连续函数,根据魏尔斯特拉斯定理,一定可以找到最高次项不大于n的多项式函数,使之与该连续函数的差为0,也就是说,完全相等。这样就把问题归结为L1了。后面就不用再重复了。

所以说,向量是很厉害的,只要你找到合适的基,用向量可以表示线性空间里任何一个对象。这里头大有文章,因为向量表面上只是一列数,但是其实由于它的有序性,所以除了这些数本身携带的信息之外,还可以在每个数的对应位置上携带信息。为什么在程序设计中数组最简单,却又威力无穷呢?根本原因就在于此。这是另一个问题了,这里就不说了。

下面来回答第二个问题,这个问题的回答会涉及到线性代数的一个最根本的问题。

线性空间中的运动,被称为线性变换。也就是说,你从线性空间中的一个点运动到任意的另外一个点,都可以通过一个线性变化来完成。那么,线性变换如何表示呢?很有意思,在线性空间中,当你选定一组基之后,不仅可以用一个向量来描述空间中的任何一个对象,而且可以用矩阵来描述该空间中的任何一个运动(变换)。而使某个对象发生对应运动的方法,就是用代表那个运动的矩阵,乘以代表那个对象的向量。

简而言之,在线性空间中选定基之后,向量刻画对象,矩阵刻画对象的运动,用矩阵与向量的乘法施加运动。

是的,矩阵的本质是运动的描述。如果以后有人问你矩阵是什么,那么你就可以响亮地告诉他,矩阵的本质是运动的描述。(chensh,说你呢!)

可是多么有意思啊,向量本身不是也可以看成是n x 1矩阵吗?这实在是很奇妙,一个空间中的对象和运动竟然可以用相类同的方式表示。能说这是巧合吗?如果是巧合的话,那可真是幸运的巧合!可以说,线性代数中大多数奇妙的性质,均与这个巧合有直接的关系。


理解矩阵(二)
接着理解矩阵。

上一篇里说“矩阵是运动的描述”,到现在为止,好像大家都还没什么意见。但是我相信早晚会有数学系出身的网友来拍板转。因为运动这个概念,在数学和物理里是跟微积分联系在一起的。我们学习微积分的时候,总会有人照本宣科地告诉你,初等数学是研究常量的数学,是研究静态的数学,高等数学是变量的数学,是研究运动的数学。大家口口相传,差不多人人都知道这句话。但是真知道这句话说的是什么意思的人,好像也不多。简而言之,在我们人类的经验里,运动是一个连续过程,从A点到B点,就算走得最快的光,也是需要一个时间来逐点地经过AB之间的路径,这就带来了连续性的概念。而连续这个事情,如果不定义极限的概念,根本就解释不了。古希腊人的数学非常强,但就是缺乏极限观念,所以解释不了运动,被芝诺的那些著名悖论(飞箭不动、飞毛腿阿喀琉斯跑不过乌龟等四个悖论)搞得死去活来。因为这篇文章不是讲微积分的,所以我就不多说了。有兴趣的读者可以去看看齐民友教授写的《重温微积分》。我就是读了这本书开头的部分,才明白“高等数学是研究运动的数学”这句话的道理。


不过在我这个《理解矩阵》的文章里,“运动”的概念不是微积分中的连续性的运动,而是瞬间发生的变化。比如这个时刻在A点,经过一个“运动”,一下子就“跃迁”到了B点,其中不需要经过A点与B点之间的任何一个点。这样的“运动”,或者说“跃迁”,是违反我们日常的经验的。不过了解一点量子物理常识的人,就会立刻指出,量子(例如电子)在不同的能量级轨道上跳跃,就是瞬间发生的,具有这样一种跃迁行为。所以说,自然界中并不是没有这种运动现象,只不过宏观上我们观察不到。但是不管怎么说,“运动”这个词用在这里,还是容易产生歧义的,说得更确切些,应该是“跃迁”。因此这句话可以改成:

“矩阵是线性空间里跃迁的描述”。

可是这样说又太物理,也就是说太具体,而不够数学,也就是说不够抽象。因此我们最后换用一个正牌的数学术语——变换,来描述这个事情。这样一说,大家就应该明白了,所谓变换,其实就是空间里从一个点(元素/对象)到另一个点(元素/对象)的跃迁。比如说,拓扑变换,就是在拓扑空间里从一个点到另一个点的跃迁。再比如说,仿射变换,就是在仿射空间里从一个点到另一个点的跃迁。附带说一下,这个仿射空间跟向量空间是亲兄弟。做计算机图形学的朋友都知道,尽管描述一个三维对象只需要三维向量,但所有的计算机图形学变换矩阵都是4 x 4的。说其原因,很多书上都写着“为了使用中方便”,这在我看来简直就是企图蒙混过关。真正的原因,是因为在计算机图形学里应用的图形变换,实际上是在仿射空间而不是向量空间中进行的。想想看,在向量空间里相一个向量平行移动以后仍是相同的那个向量,而现实世界等长的两个平行线段当然不能被认为同一个东西,所以计算机图形学的生存空间实际上是仿射空间。而仿射变换的矩阵表示根本就是4 x 4的。又扯远了,有兴趣的读者可以去看《计算机图形学——几何工具算法详解》。

一旦我们理解了“变换”这个概念,矩阵的定义就变成:

“矩阵是线性空间里的变换的描述。”

到这里为止,我们终于得到了一个看上去比较数学的定义。不过还要多说几句。教材上一般是这么说的,在一个线性空间V里的一个线性变换T,当选定一组基之后,就可以表示为矩阵。因此我们还要说清楚到底什么是线性变换,什么是基,什么叫选定一组基。线性变换的定义是很简单的,设有一种变换T,使得对于线性空间V中间任何两个不相同的对象x和y,以及任意实数a和b,有:
T(ax + by) = aT(x) + bT(y),
那么就称T为线性变换。


定义都是这么写的,但是光看定义还得不到直觉的理解。线性变换究竟是一种什么样的变换?我们刚才说了,变换是从空间的一个点跃迁到另一个点,而线性变换,就是从一个线性空间V的某一个点跃迁到另一个线性空间W的另一个点的运动。这句话里蕴含着一层意思,就是说一个点不仅可以变换到同一个线性空间中的另一个点,而且可以变换到另一个线性空间中的另一个点去。不管你怎么变,只要变换前后都是线性空间中的对象,这个变换就一定是线性变换,也就一定可以用一个非奇异矩阵来描述。而你用一个非奇异矩阵去描述的一个变换,一定是一个线性变换。有的人可能要问,这里为什么要强调非奇异矩阵?所谓非奇异,只对方阵有意义,那么非方阵的情况怎么样?这个说起来就会比较冗长了,最后要把线性变换作为一种映射,并且讨论其映射性质,以及线性变换的核与像等概念才能彻底讲清楚。我觉得这个不算是重点,如果确实有时间的话,以后写一点。以下我们只探讨最常用、最有用的一种变换,就是在同一个线性空间之内的线性变换。也就是说,下面所说的矩阵,不作说明的话,就是方阵,而且是非奇异方阵。学习一门学问,最重要的是把握主干内容,迅速建立对于这门学问的整体概念,不必一开始就考虑所有的细枝末节和特殊情况,自乱阵脚。

接着往下说,什么是基呢?这个问题在后面还要大讲一番,这里只要把基看成是线性空间里的坐标系就可以了。注意是坐标系,不是坐标值,这两者可是一个“对立矛盾统一体”。这样一来,“选定一组基”就是说在线性空间里选定一个坐标系。就这意思。

好,最后我们把矩阵的定义完善如下:

“矩阵是线性空间中的线性变换的一个描述。在一个线性空间中,只要我们选定一组基,那么对于任何一个线性变换,都能够用一个确定的矩阵来加以描述。”

理解这句话的关键,在于把“线性变换”与“线性变换的一个描述”区别开。一个是那个对象,一个是对那个对象的表述。就好像我们熟悉的面向对象编程中,一个对象可以有多个引用,每个引用可以叫不同的名字,但都是指的同一个对象。如果还不形象,那就干脆来个很俗的类比。

比如有一头猪,你打算给它拍照片,只要你给照相机选定了一个镜头位置,那么就可以给这头猪拍一张照片。这个照片可以看成是这头猪的一个描述,但只是一个片面的的描述,因为换一个镜头位置给这头猪拍照,能得到一张不同的照片,也是这头猪的另一个片面的描述。所有这样照出来的照片都是这同一头猪的描述,但是又都不是这头猪本身。

同样的,对于一个线性变换,只要你选定一组基,那么就可以找到一个矩阵来描述这个线性变换。换一组基,就得到一个不同的矩阵。所有这些矩阵都是这同一个线性变换的描述,但又都不是线性变换本身。


但是这样的话,问题就来了如果你给我两张猪的照片,我怎么知道这两张照片上的是同一头猪呢?同样的,你给我两个矩阵,我怎么知道这两个矩阵是描述的同一个线性变换呢?如果是同一个线性变换的不同的矩阵描述,那就是本家兄弟了,见面不认识,岂不成了笑话。

好在,我们可以找到同一个线性变换的矩阵兄弟们的一个性质,那就是:

若矩阵A与B是同一个线性变换的两个不同的描述(之所以会不同,是因为选定了不同的基,也就是选定了不同的坐标系),则一定能找到一个非奇异矩阵P,使得A、B之间满足这样的关系:

A = P-1BP

线性代数稍微熟一点的读者一下就看出来,这就是相似矩阵的定义。没错,所谓相似矩阵,就是同一个线性变换的不同的描述矩阵。按照这个定义,同一头猪的不同角度的照片也可以成为相似照片。俗了一点,不过能让人明白。

而在上面式子里那个矩阵P,其实就是A矩阵所基于的基与B矩阵所基于的基这两组基之间的一个变换关系。关于这个结论,可以用一种非常直觉的方法来证明(而不是一般教科书上那种形式上的证明),如果有时间的话,我以后在blog里补充这个证明。

这个发现太重要了。原来一族相似矩阵都是同一个线性变换的描述啊!难怪这么重要!工科研究生课程中有矩阵论、矩阵分析等课程,其中讲了各种各样的相似变换,比如什么相似标准型,对角化之类的内容,都要求变换以后得到的那个矩阵与先前的那个矩阵式相似的,为什么这么要求?因为只有这样要求,才能保证变换前后的两个矩阵是描述同一个线性变换的。当然,同一个线性变换的不同矩阵描述,从实际运算性质来看并不是不分好环的。有些描述矩阵就比其他的矩阵性质好得多。这很容易理解,同一头猪的照片也有美丑之分嘛。所以矩阵的相似变换可以把一个比较丑的矩阵变成一个比较美的矩阵,而保证这两个矩阵都是描述了同一个线性变换。


这样一来,矩阵作为线性变换描述的一面,基本上说清楚了。但是,事情没有那么简单,或者说,线性代数还有比这更奇妙的性质,那就是,矩阵不仅可以作为线性变换的描述,而且可以作为一组基的描述。而作为变换的矩阵,不但可以把线性空间中的一个点给变换到另一个点去,而且也能够把线性空间中的一个坐标系(基)表换到另一个坐标系(基)去。而且,变换点与变换坐标系,具有异曲同工的效果。线性代数里最有趣的奥妙,就蕴含在其中。理解了这些内容,线性代数里很多定理和规则会变得更加清晰、直觉。

理解矩阵(三)

  这两篇文章发表于去年的4月。在第二部分结束的时候,我说:
      
矩阵不仅可以作为线性变换的描述,而且可以作为一组基的描述。而 作为变换的矩阵,不但可以把线性空间中的一个点给变换到另一个点去,而且也能够把线性空间中的一个坐标系(基)表换到另一个坐标系(基)去。而且,变换点 与变换坐标系,具有异曲同工的效果。线性代数里最有趣的奥妙,就蕴含在其中。理解了这些内容,线性代数里很多定理和规则会变得更加清晰、直觉。

这个留在下一篇再写吧。

因为有别的事情要做,下一篇可能要过几天再写了。 ”

然而这一拖就是一年半。一年半以来,这两篇粗糙放肆的文章被到处转载,以至于在Google的搜索提示中,我的名字跟“矩阵”是一对关联词汇。这对于学生时代数学一直很差的我来说,实在是令人惶恐的事情。数学是何等辉煌精致的学问!代表着人类智慧的最高成就,是人与上帝对话的语言。而我实在连数学的门都还没进去,不要说谈什么理解,就是稍微难一些的题目我也很少能解开。我有什么资格去谈矩阵这样重要的一个数学概念呢?更何况,我的想法直观是直观,未见的是正确的啊,会不会误人子弟呢?因此,算了吧,到此为止吧,我这么想。


        是时不时收到的来信逐渐改变了我的想法。

        一年半以来,我收到过不下一百封直接的来信,要求我把后面的部分写出来。这些来信大部分是国内的网友和学生,也有少数来自正在国外深造的朋友,大部分是鼓励,有的是诚挚的请求,也有少数严厉斥责我不守承诺。不管是何种态度,这都表明他们对我这一点点小小的思考成果的鼓励,特别是对于我这种思维的视角和尝试的鼓励。他们在信中让我知道,尽管我的数学水平不高,但是我这种从普通人(而不是数学家)视角出发,强调对数学概念和规则的直觉理解的思路,对于很多人是有益的。也许这条路子在数学中绝非正道,也不会走得很远,但是无论如何,在一定的阶段,对一部分人来说,较之目前数学教材普遍采用的思路,这种方式可能更容易理解一些。既然是可能对一部分人有帮助的事情,那么我就不应该心存太多杂念,应该不断思考和总结下去。


       所以,下面就是你们来信要求我写出来的东西。

       首先来总结一下前面两部分的一些主要结论:

1. 首先有空间,空间可以容纳对象运动的。一种空间对应一类对象。
2. 有一种空间叫线性空间,线性空间是容纳向量对象运动的。
3. 运动是瞬时的,因此也被称为变换。
4. 矩阵是线性空间中运动(变换)的描述。
5. 矩阵与向量相乘,就是实施运动(变换)的过程。
6. 同一个变换,在不同的坐标系下表现为不同的矩阵,但是它们的本质是一样的,所以本征值相同。

        下面让我们把视力集中到一点以改变我们以往看待矩阵的方式。我们知道,线性空间里的基本对象是向量,而向量是这么表示的:

        [a1, a2, a3, ..., an]

       矩阵呢?矩阵是这么表示的:

        a11, a12, a13, ..., a1n
        a21, a22, a23, ..., a2n
                     ...
        an1, an2, an3, ..., ann

        不用太聪明,我们就能看出来,矩阵是一组向量组成的。特别的,n维线性空间里的方阵是由n个n维向量组成的。我们在这里只讨论这个n阶的、非奇异的方阵,因为理解它就是理解矩阵的关键,它才是一般情况,而其他矩阵都是意外,都是不得不对付的讨厌状况,大可以放在一边。这里多一句嘴,学习东西要抓住主流,不要纠缠于旁支末节。很可惜我们的教材课本大多数都是把主线埋没在细节中的,搞得大家还没明白怎么回事就先被灌晕了。比如数学分析,明明最要紧的观念是说,一个对象可以表达为无穷多个合理选择的对象的线性和,这个概念是贯穿始终的,也是数学分析的精华。但是课本里自始至终不讲这句话,反正就是让你做吉米多维奇,掌握一大堆解偏题的技巧,记住各种特殊情况,两类间断点,怪异的可微和可积条件(谁还记得柯西条件、迪里赫莱条件...?),最后考试一过,一切忘光光。要我说,还不如反复强调这一个事情,把它深深刻在脑子里,别的东西忘了就忘了,真碰到问题了,再查数学手册嘛,何必因小失大呢?

        言归正传。如果一组向量是彼此线性无关的话,那么它们就可以成为度量这个线性空间的一组基,从而事实上成为一个坐标系体系,其中每一个向量都躺在一根坐标轴上,并且成为那根坐标轴上的基本度量单位(长度1)。

        现在到了关键的一步。看上去矩阵就是由一组向量组成的,而且如果矩阵非奇异的话(我说了,只考虑这种情况),那么组成这个矩阵的那一组向量也就是线性无关的了,也就可以成为度量线性空间的一个坐标系。结论:矩阵描述了一个坐标系。

        “慢着!”,你嚷嚷起来了,“你这个骗子!你不是说过,矩阵就是运动吗?怎么这会矩阵又是坐标系了?”

        嗯,所以我说到了关键的一步。我并没有骗人,之所以矩阵又是运动,又是坐标系,那是因为——

        “运动等价于坐标系变换”。

        对不起,这话其实不准确,我只是想让你印象深刻。准确的说法是:

       “对象的运动等价于坐标系的变换”。

       或者:

       “固定坐标系下一个对象的运动等价于固定对象所处的坐标系变换。”

       说白了就是:

        “运动是相对的。”        

        让我们想想,达成同一个变换的结果,比如把点(1, 1)变到点(2, 3)去,你可以有两种做法。第一,坐标系不动,点动,把(1, 1)点挪到(2, 3)去。第二,点不动,变坐标系,让x轴的度量(单位向量)变成原来的1/2,让y轴的度量(单位向量)变成原先的1/3,这样点还是那个点,可是点的坐标就变成(2, 3)了。方式不同,结果一样。

        从第一个方式来看,那就是我在《理解矩阵》1/2中说的,把矩阵看成是运动描述,矩阵与向量相乘就是使向量(点)运动的过程。在这个方式下,

       Ma = b

       的意思是:

       “向量a经过矩阵M所描述的变换,变成了向量b。”

        而从第二个方式来看,矩阵M描述了一个坐标系,姑且也称之为M。那么:

        Ma = b

       的意思是:

        “有一个向量,它在坐标系M的度量下得到的度量结果向量为a,那么它在坐标系I的度量下,这个向量的度量结果是b。”

        这里的I是指单位矩阵,就是主对角线是1,其他为零的矩阵。

        而这两个方式本质上是等价的。

        我希望你务必理解这一点,因为这是本篇的关键。

        正因为是关键,所以我得再解释一下。

        在M为坐标系的意义下,如果把M放在一个向量a的前面,形成Ma的样式,我们可以认为这是对向量a的一个环境声明。它相当于是说:

        “注意了!这里有一个向量,它在坐标系M中度量,得到的度量结果可以表达为a。可是它在别的坐标系里度量的话,就会得到不同的结果。为了明确,我把M放在前面,让你明白,这是该向量在坐标系M中度量的结果。”

       那么我们再看孤零零的向量b:

       b

       多看几遍,你没看出来吗?它其实不是b,它是:

       Ib

       也就是说:“在单位坐标系,也就是我们通常说的直角坐标系I中,有一个向量,度量的结果是b。”

       而  Ma = Ib的意思就是说:

       “在M坐标系里量出来的向量a,跟在I坐标系里量出来的向量b,其实根本就是一个向量啊!”

       这哪里是什么乘法计算,根本就是身份识别嘛。

       从这个意义上我们重新理解一下向量。向量这个东西客观存在,但是要把它表示出来,就要把它放在一个坐标系中去度量它,然后把度量的结果(向量在各个坐标轴上的投影值)按一定顺序列在一起,就成了我们平时所见的向量表示形式。你选择的坐标系(基)不同,得出来的向量的表示就不同。向量还是那个向量,选择的坐标系不同,其表示方式就不同。因此,按道理来说,每写出一个向量的表示,都应该声明一下这个表示是在哪个坐标系中度量出来的。表示的方式,就是 Ma,也就是说,有一个向量,在M矩阵表示的坐标系中度量出来的结果为a。我们平时说一个向量是[2 3 5 7]T,隐含着是说,这个向量在 I 坐标系中的度量结果是[2 3 5 7]T,因此,这个形式反而是一种简化了的特殊情况。

        注意到,M矩阵表示出来的那个坐标系,由一组基组成,而那组基也是由向量组成的,同样存在这组向量是在哪个坐标系下度量而成的问题。也就是说,表述一个矩阵的一般方法,也应该要指明其所处的基准坐标系。所谓M,其实是 IM,也就是说,M中那组基的度量是在 I 坐标系中得出的。从这个视角来看,M×N也不是什么矩阵乘法了,而是声明了一个在M坐标系中量出的另一个坐标系N,其中M本身是在I坐标系中度量出来的。

       回过头来说变换的问题。我刚才说,“固定坐标系下一个对象的变换等价于固定对象所处的坐标系变换”,那个“固定对象”我们找到了,就是那个向量。但是坐标系的变换呢?我怎么没看见?

       请看:

       Ma = Ib

       我现在要变M为I,怎么变?对了,再前面乘以个M-1,也就是M的逆矩阵。换句话说,你不是有一个坐标系M吗,现在我让它乘以个M-1,变成I,这样一来的话,原来M坐标系中的a在I中一量,就得到b了。

       我建议你此时此刻拿起纸笔,画画图,求得对这件事情的理解。比如,你画一个坐标系,x轴上的衡量单位是2,y轴上的衡量单位是3,在这样一个坐标系里,坐标为(1,1)的那一点,实际上就是笛卡尔坐标系里的点(2, 3)。而让它原形毕露的办法,就是把原来那个坐标系:

       2 0
       0 3

       的x方向度量缩小为原来的1/2,而y方向度量缩小为原来的1/3,这样一来坐标系就变成单位坐标系I了。保持点不变,那个向量现在就变成了(2, 3)了。

       怎么能够让“x方向度量缩小为原来的1/2,而y方向度量缩小为原来的1/3”呢?就是让原坐标系:

      2 0
      0 3

       被矩阵:

       1/2   0
         0   1/3

       左乘。而这个矩阵就是原矩阵的逆矩阵。

       下面我们得出一个重要的结论:

        “对坐标系施加变换的方法,就是让表示那个坐标系的矩阵与表示那个变化的矩阵相乘。”

        再一次的,矩阵的乘法变成了运动的施加。只不过,被施加运动的不再是向量,而是另一个坐标系。

        如果你觉得你还搞得清楚,请再想一下刚才已经提到的结论,矩阵MxN,一方面表明坐标系N在运动M下的变换结果,另一方面,把M当成N的前缀,当成N的环境描述,那么就是说,在M坐标系度量下,有另一个坐标系N。这个坐标系N如果放在I坐标系中度量,其结果为坐标系MxN。

        在这里,我实际上已经回答了一般人在学习线性代数是最困惑的一个问题,那就是为什么矩阵的乘法要规定成这样。简单地说,是因为:

        1. 从变换的观点看,对坐标系N施加M变换,就是把组成坐标系N的每一个向量施加M变换。

        2. 从坐标系的观点看,在M坐标系中表现为N的另一个坐标系,这也归结为,对N坐标系基的每一个向量,把它在I坐标系中的坐标找出来,然后汇成一个新的矩阵。

        3. 至于矩阵乘以向量为什么要那样规定,那是因为一个在M中度量为a的向量,如果想要恢复在I中的真像,就必须分别与M中的每一个向量进行內积运算。我把这个结论的推导留给感兴趣的朋友吧。应该说,其实到了这一步,已经很容易了。

        综合以上1/2/3,矩阵的乘法就得那么规定,一切有根有据,绝不是哪个神经病胡思乱想出来的。
 
        我已经无法说得更多了。矩阵又是坐标系,又是变换。到底是坐标系,还是变换,已经说不清楚了,运动与实体在这里统一了,物质与意识的界限已经消失了,一切归于无法言说,无法定义了。道可道,非常道,名可名,非常名。矩阵是在是不可道之道,不可名之名的东西。到了这个时候,我们不得不承认,我们伟大的线性代数课本上说的矩阵定义,是无比正确的:

        “矩阵就是由m行n列数放在一起组成的数学对象。”

        好了,这基本上就是我想说的全部了。还留下一个行列式的问题。矩阵M的行列式实际上是组成M的各个向量按照平行四边形法则搭成一个n维立方体的体积。对于这一点,我只能感叹于其精妙,却无法揭开其中奥秘了。也许我掌握的数学工具不够,我希望有人能够给我们大家讲解其中的道理了。

        我不知道是否讲得足够清楚了,反正这一部分需要您花些功夫去推敲。

        此外,请大家不必等待这个系列的后续部分。以我的工作情况而言,近期内很难保证继续投入脑力到这个领域中,尽管我仍然对此兴致浓厚。不过如果还有(四)的话,可能是一些站在应用层面的考虑,比如对计算机图形学相关算法的理解。但是我不承诺这些讨论近期内会出现了。

More......

图像处理:腐蚀,膨胀,开运算及闭运算


Share/Save/Bookmark


图像的形态学运算:腐蚀,膨胀,开运算及闭运算

形态学图像处理的基本思想是利用一个称作结构元素的“探针”收集图像的信息.腐蚀,膨胀,开运算及闭运算这些形态学方法可以对图像进行滤波,平滑操作.腐蚀和膨胀可以看作单边滤波器,而开运算和闭运算可以看作双边滤波器.



如果将原图设定为A,探针图像设定为B,则一般情况下B的尺寸远小于A,用B对A进行各种操作.

腐蚀

定义: 设B的原点在左上角,则用B腐蚀A即,B能完全落入A时,B的原点的集合.
作用: 消除A的边界杂点.
例子:
A =
     0     1     1     1     0     0     0     0
     0     0     1     1     1     0     0     0
     0     0     0     1     1     1     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
>> B = strel('square',2)
B =
Flat STREL object containing 4 neighbors.

Neighborhood:
     1     1
     1     1
>> C = imerode(A, B)
C =
     0     0     1     0     0     0     0     0
     0     0     0     1     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
如上显式,能将B完全包容在A中时,B的原点只可能在A(1,3)和A(2,4),在结果C中也只有这2点的值为1,其余均为0.如下图:

>> subplot(1,2,1);imshow(A,'notruesize');
>> subplot(1,2,2);imshow(C,'notruesize')




膨胀

定义: B中有任意点落入A时,B的原点的集合.换句话,B与A交集不为空时B的原点的集合.
作用: 合并图像边缘的背景点到图像中.(图像变粗,变大)
例子: (A,B与上面相同)
>> D = imdilate(A,B)
D =
     0     1     1     1     1     0     0     0
     0     1     1     1     1     1     0     0
     0     0     1     1     1     1     1     0
     0     0     0     1     1     1     1     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
>> subplot(1,2,1);imshow(A,'notruesize');
>> subplot(1,2,2);imshow(D,'notruesize')
结果如下:



开运算

定义: 以相同的算子B对图像A进行先腐蚀后膨胀操作(并不能恢复原图像)
作用: 去掉凸角来平滑图像边缘(可以用来分开相连的区域).
例子:
>> E = imopen(A,B)
E =
     0     0     1     1     0     0     0     0
     0     0     1     1     1     0     0     0
     0     0     0     1     1     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
>> subplot(1,2,1);imshow(A,'notruesize');
>> subplot(1,2,2);imshow(E,'notruesize')
结果如下:



闭运算

定义: 以相同的算子B对图像A进行先膨胀后腐蚀操作.
作用: 填充凹角来平滑图像边缘.
例子:
>> F = imclose(A,B)
F =
     0     1     1     1     0     0     0     0
     0     0     1     1     1     0     0     0
     0     0     0     1     1     1     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0
>> subplot(1,2,1);imshow(A,'notruesize');
>> subplot(1,2,2);imshow(F,'notruesize')
结果如下:




===============================================
可以参考另外2篇类似的介绍文章:
http://www.cnblogs.com/tekson/archive/2009/08/03/1538006.html

http://blog.sina.com.cn/s/blog_4a93ccea0100d25q.html

More......

such as, for example, e.g., i.e., etc., et al.


Share/Save/Bookmark


在英文论文的编辑加工中,常会遇到such as, for example, e. g. , i. e. , etc. 和et al. 的错误及混淆使用。这里,举例分析这几个词的意义,并阐述其正确用法。


1) such as。常列举同类人或事物中的几个例子。

其典型的表示式为a plural + such as + single instance( s) of the group to which the plural refers。

正确使用的是: The Arts Faculty deals only with humanities subjects such as history and literature.

混淆使用的是: The Science Faculty deals only with the measurable such as physics and seismology.

论文中常出现such as与and so on或etc. 连用, 这是不正确的。

① 如 It is noted that the features such as clean cut ratio denoted by Rc , die roll height denoted by Hdr and die roll width denoted by Wdr , and so on (有的出现etc.) , are better than the ones with the other models.

应为 It is noted that the features, such as clean cut ratio denoted by Rc , die roll height denoted by Hdr and die roll width denoted by Wdr , are better than the ones with the other models.

当使用such as时,读者已理解后面接着的会是一些不完整的列举,因此不需加上and so on或 etc. 等。

② 因为such as是对前面的复数名词部分起列举作用,若全部列举出,要改用namely,意思为“即”。文章中出现的He knows four languages, such as Chinese, English, Japanese and German,应将such as改成namely(或i. e. )及后面加逗号, 即He knows four languages, namely, Chinese, English, Japanese and German.

③ 用such as来形容复数名词( the plural)可以放在such与as中间,一般插在被列举事物与前面的名词之间。

2) for example。用来举例说明,由它引出介绍普遍概念的例子,使用范围要比such as自由。可以出现在句首、句末或有时可作为独立语,插在句中,不影响句子其他部分的语法关系。

例如, Cryptography operations, for example, decryption or signing, in a given period only involve the corresponding temporary secret key without further access to the helper.

同样for example ( e. g. )表示泛泛地举几个例子,并没有囊括所有的实例,其中就已经包含“等等”,如果再加etc. 或and so on,就画蛇添足了。

如论文中出现的这句话是不当的:Writing instructors focus on a number of complex skills that require extensive practice (e. g. , organization, clear expression, logical thinking, etc. 正确的为e. g. , organization, clear expression, and logical thinking.

3) e. g.。是拉丁文exempli gratia的缩写,意思是“举个例子,比如”,等同于“for example”,目的是用例子来说明前面的观点,用法与for example相同。

4) i. e.。源于拉丁语,是id est的简略形式。其意思就是“那就是说,换句话说”,等同于“that is, in other words”和“namely”,目的是用来进一步解释前面所说的观点。

正确的用法是Use a comma to enclose ( i. e. , both before and after) the year in a month day year sequence. 而文章中出现的这句The evaluation noted that the employee had frequently exhibited irresponsible behavior ( i. e. , coming to work late, failing to complete projects) ,应该用“e. g. ”而不是用“i. e. ”,因为插入句是对“irresponsible behavior”的列举补充。

5) etc.。是et cetera的缩写,意思是“等等”,相当于“and so on”。可用来列举事物,若要列举人,则需用et al. 或用and others。

e.g. 和 etc. 不能出现在同一句话中,因为 e.g. 是表示泛泛的举几个例子,并没有囊括所有的实例,其中就已经包含“等等”,如果再加一个 etc. 就画蛇添足了,

6) et al.。是拉丁文简写。其一为et alibi (以及其他地方) ,相当于and elsewhere;其二为et alii (以及其他人) ,相当于and others。



More......

matlab的正则表达式


Share/Save/Bookmark


引言.啥是正则表达式?正则表达式是干啥的?
我理解就和我们在word或者其他编辑软件里点的查找、替换的作用是差不多的,不过功能要强大的多,当然使用起来也稍微复杂一些。
书上的定义差不多是这样的:正则表达式就是一个表达式(也是一串字符),它定义了某种字符串模式。利用正则表达式,可以对大段的文字进行复杂的查找、替换等。
matlab提供的正则表达式函数有三个:
regexp——用于对字符串进行查找,大小写敏感;
regexpi——用于对字符串进行查找,大小写不敏感;
regexprep——用于对字符串进行查找并替换。


稍微介绍一下这三个函数,以regexpi为例,也可以先跳过这里,看过正文之后回头再来看看这里。

[start end extents match tokens names] = regexpi('str', 'expr')
start为匹配字符串的起始位置;end为匹配字符串的终止位置;extents为扩展内容,和'tokens'指示符一起用,指示出现tokens的 位置;match即找到的匹配字串;tokens匹配正则表达式中标记(tokens)的字串;names为匹配到的命名标记的标记名。

若不需要所有的输出,可以用下面的方式指定所需输出。
[v1 v2 ...] = regexpi('str', 'expr', 'q1', 'q2', ...)
'q1','q2',...为'start','end','tokens','tokensExtents','match','names'之一,意义与上面的解释一样。v1,v2...的输出顺序与q1,q2...一致。


第一部分——单个字符的匹配
我们先从简单的开始——以regexpi函数为例。假设你要搜索一个包含字符'cat'的字符串,搜索用的正则表达式就是 'cat'。如果搜索对大小写不敏感,单词'catalog'、'Catherine'、'sophisticated'都可以匹配。也就是说:
正则表达式:'cat'
匹配:'cat', 'catalog', 'Catherine','sophisticated'
这个好像和我们通常在记事本里ctrl+F弄出来的东西差不多哈,呵呵。。。(btw:为了方便,下面的叙述中字符串和正则表达式的''都省略不写。)
1 句点符号 '.' ——匹配任意一个(只有一个)字符(包括空格)。
假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以't'字母开头,以'n'字母结束。另外,假设有一本英文字典,你可以用正则表达式 搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号'.'。这样,完整的表达式就是t.n,它匹配tan、 ten、tin和ton,还匹配t#n、tpn甚至t n,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格:
小整理:正则表达式:t.n
匹配:ten, tin, ton, t n, tpn, t#n, t@n
Matlab例子程序:
clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,$$$$t#n,4@).,t@nT&nY';
pat='t.n';
o1=regexpi(str,pat,'start')%用'start'参数指定输出o1为匹配正则表达式的子串的起始位置
o2=regexpi(str,pat,'end')%用'start'参数指定输出o1为匹配正则表达式的子串的结束位置
o3=regexpi(str,pat,'match')%用'match'参数指定输出o2为匹配正则表达式的子串
[o11,o22,o33]=regexpi(str,pat,'start','end','match') %同时输出起始位置和子串
输出为:
o22 =
3 8 13 18 23 28 33 36
o33 =
'ten' 'tin' 'ton' 't n' 'tpn' 't#n' 't@n' 'T&n'
o1 =
1 10 18 23 31 39 48 51
o2 =
3 12 20 25 33 41 50 53
o3 =
'ten' 'tin' 'ton' 't n' 'tpn' 't#n' 't@n' 'T&n'
o11 =
1 10 18 23 31 39 48 51
o22 =
3 12 20 25 33 41 50 53
o33 =
'ten' 'tin' 'ton' 't n' 'tpn' 't#n' 't@n' 'T&n'
2 方括号符号 '[oum]' ——匹配方括号中的任意一个
为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号('[]')里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是 说,正则表达式t[aeio]n只匹配tan,Ten,tin和toN等。但'Tmn','taen'不匹配,因为在方括号之内你只能匹配单个字符:
小整理:正则表达式:t[aeio]n
匹配:tan, ten, tin, ton
matlab 例子程序:
clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,$$$$t#n,4@).,t@nT&nY';
pat='t[aeiou]n';
o1=regexpi(str,pat,'start')%用'start'参数指定输出o1为匹配正则表达式的子串的起始位置
o2=regexpi(str,pat,'end')%用'start'参数指定输出o1为匹配正则表达式的子串的结束位置
o3=regexpi(str,pat,'match')%用'match'参数指定输出o2为匹配正则表达式的子串
[o11,o22,o33]=regexpi(str,pat,'start','end','match') %同时输出起始位置和子串
输出结果为
o1 =
1 10 18
o2 =
3 12 20
o3 =
'ten' 'tin' 'ton'
o11 =
1 10 18
o22 =
3 12 20
o33 =
'ten' 'tin' 'ton'
3 方括号中的连接符 '[c1-c2]' ——匹配从字符c1开始到字符c2结束的字母序列(按字母表中的顺序)中的任意一个。
如[a-c]匹配a,b,c,A,B,C
即:正则表达式:t[a-z]n
匹配:tan, tbn,tcn,tdn,ten,…, txn, tyn,tzn
matlab 例子程序:
clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,$$$$t#n,4@).,t@nT&nY';
pat='t[a-z]n';
o1=regexpi(str,pat,'start')%用'start'参数指定输出o1为匹配正则表达式的子串的起始位置
o2=regexpi(str,pat,'end')%用'start'参数指定输出o1为匹配正则表达式的子串的结束位置
o3=regexpi(str,pat,'match')%用'match'参数指定输出o2为匹配正则表达式的子串
[o11,o22,o33]=regexpi(str,pat,'start','end','match') %同时输出起始位置和子串
4 \n 等 ——特殊字符
就是由'\'引导的,代表有特殊意义或不能直接输入的单个字符。在使用printf函数输出时我们常用'\n'来代替回车符,这里也是 同样的道理,用\n在正则表达式中表示回车符。类似的还有\ t横向制表符,'\*'表示'*'等。后一种情况用在查询在正则表达式中有语法作用的字符。详见下文。
下面是一些匹配单个字符的转义字符正则表达式及所匹配的值。
\xN或\x{N} 匹配八进制数值为N的字符
\oN或\o{N} 匹配十六进制数值为N的字符
\a Alarm(beep)
\b Backspace
\t 水平Tab
\n New line
\v 垂直Tab
\f 换页符
\r 回车符
\e Escape
\c 某些在正则表达式中有语法功能或特殊意义的字符c,要用\c来匹配,而不能直接用c匹配,如.用正则表达式\.匹配,而\用正则表达式\\匹配
matlab程序例子
clear;clc
str='l.[a-c]i.$.a';
pat1='.';pat2='\.';
o=regexpi(str,pat1,'match')
o1=regexpi(str,pat2,'match')
输出为:
o =
'l' '.' '[' 'a' '-' 'c' ']' 'i' '.' '$' '.' 'a'
o1 =
'.' '.' '.'
5 \w,\s和\d——类表达式
和上面的\n等表中的转义字符有所不同,\w,\s,\d等匹配的不是某个特定的字符,而是某一类字符。具体说明如下:
\w匹配任意的单个文字字符,相当于[a-zA-Z0-9_];
\s匹配任意的单个空白字符,相当于[\t\f\n\r];
\d匹配任意单个数字,相当于[0-9];
\S匹配除空白符以外的任意单个字符,相当于[^\t\f\n\r]——方括号中的^表示取反;
\W匹配任意单个字符,相当于[^a-zA-Z0-9_];
\D匹配除数字字符外的任意单个字符,相当于[^0-9]。
matlab程序例子,这里引用的是matlab帮助中的例子:
str='easy as 1,2,3';%这个字符串可真有点意思,呵呵
pat='\d';
[o1,o2]=regexpi(str,pat,'start','match')
输出结果为:
o1 =
9 11 13
o2 =
'1' '2' '3'

第二部分串的匹配
1. 多次匹配
比如,我们要匹配'ppp',那么就可以用正则表达式'ppp',还有一种更简单一点的记法'p{3}'。正则表达式中的'{}'用来表示匹配前面的表达 式的出现次数。就是说,'p{2,3}',匹配'pp'和'ppp'。除了'{}',还有几个字符,用在表示单个字符的正则表达式后面表示次数,详见下 表,表中的expr表示第一部分我们讲过的所有表达式。
expr? 与expr匹配的元素出现0或1次,相当于{0,1}
expr* 与expr匹配的元素出现1次或更多,相当于{0,}
expr+ 与expr匹配的元素出现1次或更多,相当于{1,}
expr{n} 与expr匹配的元素出现n次,相当于{n,n}
expr{n,} 与expr匹配的元素至少出现n次
expr{n,m} 与expr匹配的元素出现n次但不多于m次
假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图所示。在正则表达式中,连字符 (“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。完整的正则表达式 为[0-9]{3}\-[0-9]{2}\-[0-9]{4}
假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号。完整的正则表达式为[0-9]{3}\-?[0-9]{2}\-?[0-9]{4}
下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分 “[A-Z]{2}”。完整的正则表达式为[0-9]{4}[A-Z]{2}
另外,当我们使用expr*时,matlab 将尽可能的匹配最长的字符子串。如:
str = 'xyz';
regexp(hstr, '<.*>', 'match')
ans =
''
如果我们希望匹配尽可能短的字符子串时,可以在上面我们使用的字符串后使用'?',也就是expr*?,如:
str = 'xyz';
regexp(hstr, '<.*?>', 'match')
ans =
'' '' '' ''
还有一种是expr*+ ,这种表达式的用法很诡异,没弄懂在什么地方有用。如果哪位大侠有高见,望不吝赐教!
这个表达式的执行过程是这样的,先执行expr*,“游标”(如果有的话)就指到了与expr*匹配的字符子串的最末端,然后从那里开始再检查下一个字符与后面的表达式是否匹配,如果匹配就继续向前(如果一直成功则返回最长的字符串),如果不匹配则直接返回空。例如:
str = 'xyz';
regexp(hstr, '<.*+>', 'match')
ans =
{}
regexp(hstr, '<.*+', 'match') ans = 'xyz'
2. 逻辑运算符
简单的例子比如'exp|exp2',表示或者满足exp或者满足exp2。还有其他一些正则表达式之间的关系如下:
(expr) 将expr标记为一组、匹配expr,并将匹配的字符子串标记起来以供后面使用。——关于这部分内容第三部分(tokens)还会有详细介绍
(?:expr) 说明expr为一组,相当于数学表达式中的()
例如:>>lstr='A body or collection of such stories';
>>regexp(lstr,'(?:[^aeiou][aeiou]){2,}','match')
ans =
'tori'
上面的表达式中{2,}对[^aeiou][aeiou]起作用,如果去掉分组,则只对[aeiou]起作用,如下所示:
>>regexp(lstr,'[^aeiou][aeiou]{2,}','match')
ans =
'tio' 'rie'
(?>expr) expr中的每个元素是一个分组
(?#expr) 这个比较容易理解啦,就是expr放在(?#和)之间是就是注释。如:
>>regexp(lstr, '(?# Match words in caps)[A-Z]\w*', 'match')
ans =
'A'
expr1|expr2 匹配两者之一即可,expr1或者expr2
>>regexp(hstr, '[^aeiou\s]o|[^aeiou\s]i', 'match')
ans =
'bo' 'co' 'ti' 'to' 'ri'
^expr 匹配expr,并且出现在原字符串最前端的子串
expr$ 匹配expr,并且出现在原字符串最末端的子串
>>regexpi(lstr, '^a\w*|\w*s$', 'match')
ans =
'A' 'stories'
\>regexpi(hstr, '\ 匹配expr,并且出现在一个单词最末端的子串
>>regexpi(hstr, '\w*tion\>', 'match')
ans =
'collection'
\ 更严格的单词匹配,如:以s开头,并且以h结尾的单词
>>regexpi(hstr, '\', 'match')
ans =
'such'
3. 左顾右盼——利用上下文匹配
这个也比较容易理解。就是利用上下文的匹配来找到我们要找的内容。
expr1(?=expr2) 找到匹配expr1的子串,如果其后的字符串也匹配expr2
如,下面的例子查找所有在','之前的单词。
>> pstr = ['While I nodded, nearly napping, ' ...
'suddenly there came a tapping,'];
>>regexpi(pstr, '\w*(?=,)', 'match')
ans =
'nodded' 'napping' 'tapping'
expr1(?!expr2) 找到匹配expr1的子串如果其后的字符串不匹配expr2
下面的例子匹配所有不在','之前的单词
>>regexpi(pstr, '\w*(?!=,)', 'match')
ans =
Columns 1 through 6
'While' 'I' 'nodded' 'nearly' 'napping' 'suddenly'
Columns 7 through 10
'there' 'came' 'a' 'tapping'
(?<=expr1)expr2 找到匹配expr2的子串,如果其前面的字符串也匹配expr1 下面的例子查找所有在','之后的单词,注意:','之后可能有空格 >>regexpi(pstr,'(?<=,\s*)\w*','match') ans = 'nearly' 'suddenly' (?>regexpi(pstr,'(?>poestr = ['While I nodded, nearly napping, suddenly there came a tapping,'];
>>[mat tok ext] = regexp(poestr, '(\S)\1', 'match', 'tokens', 'tokenExtents');
>>mat
mat =
'dd' 'pp' 'dd' 'pp'
>>tok{:}
ans =
'd'
ans =
'p'
ans =
'd'
ans =
'p'
>>ext{:}
ans =
11 11
ans =
26 26
ans =
35 35
ans =
57 57
2. 如何使用标记?
(expr) 记录所有匹配表达式的字符,并做为一个标记,以备后面使用
这个例子说明了标记的生成过程:
>>pstr='andy ted bob jim andrew andy ted mark';
>> [t,m]=regexp(pstr,pat,'tokens','match')
t =
{1x1 cell} {1x2 cell} {1x1 cell} {1x1 cell} {1x2 cell}
m =
'andy' 'ted' 'andrew' 'andy' 'ted'
>> t{:}
ans =
'y'
ans =
't' 'd'
ans =
'rew'
ans =
'y'
ans =
't' 'd'
\N 匹配同一条正则表达式里的第N个标记中的字符串。如\1匹配第一个标记;
一个例子,用来查找html语句中类似abc的部分:
>>hstr = '

Default

';
>>expr = '<(\w+).*?>.*?';
>> [mat tok] = regexp(hstr, expr, 'match', 'tokens');
>> mat{:}
ans =

ans =
Default
>> tok{:}
ans =
'tr'
ans =
'table'
$N 在一个替换字符串中插入与第N个标记相匹配的字符串(只用于regexprep函数)
一个例子,将匹配到的第一个token和第二个token的位置互换:
>> regexprep('Norma Jean Baker', '(\w+\s\w+)\s(\w+)', '$2, $1')
ans =
Baker, Norma Jean
(?expr) 记录所有匹配表达式expr的字符,做为一个标记,并设定一个名字name
\k 与名为name的标记相匹配
这个例子和这部分第一个例子是一样的,只不过使用了命名的标记。
>>poestr = ['While I nodded, nearly napping, ' ...
'suddenly there came a tapping,'];
>>regexp(poestr, '(?\S)\k', 'match')
ans =
'dd' 'pp' 'dd' 'pp'
(?(tok)expr) 如果标记tok已经产生,则匹配表达式expr。if-then结构。其中的标记可以是数字标记,也可以是命名标记
(?(tok)expr1|expr2) 如果标记tok已经产生,则匹配表达式expr1,否则匹配表达式expr2。if-then-else结构
这个例子有点意思,是用来检查一个句子中的性别用词是否匹配,表达式的意思就是,如果前面用的是'Mrs'那么后面就匹配 'her',如果前面用的是'Mr'(也就是没有匹配到'Mr'后面的's',则后面匹配'his')。
>>expr = 'Mr(s?)\..*?(?(1)her|his) son';
>>[mat tok] = regexp('Mr. Clark went to see his son', expr, 'match', 'tokens')
mat =
'Mr. Clark went to see his son'
tok =
{1x2 cell}
>>tok{:}
ans =
'' 'his'
如果把句子中的his改成her,则结果如下:
>>[mat tok] = regexp('Mr. Clark went to see her son', expr, 'match', 'tokens')
mat =
{}
tok =
{}
没有与之匹配的结果,呵呵。。。

第四部分多行字符串与多正则表达式
这是最后一部分,也是最容易的一部分了。
1. 多字符串与单个正则表达式匹配
多个字符串存在一个元胞数组里之后,每一个字符串与正则表达式匹配,返回值的维数与元胞数组相同。
>>cstr = { ...
'Whose woods these are I think I know.' ; ...
'His house is in the village though;' ; ...
'He will not see me stopping here' ; ...
'To watch his woods fill up with snow.'};
>>idx = regexp(cstr, '(.)\1');
>>idx{:} ans = % 'Whose woods these are I think I know.'
8 % |8
ans = % 'His house is in the village though;'
23 % |23
ans = % 'He will not see me stopping here'
6 14 23 % |6 |14 |23
ans = % 'To watch his woods fill up with snow.'
15 22 % |15 |22
2. 多个字符串与多个正则表达式匹配
这种情况下,应该满足字符串元胞数组中字符串的个数和正则表达式的个数相等——但维数不一定要相等——如可以用4*1的元胞数组与1*4的正则表达式相匹配。
expr = {'i\s', 'hou', '(.)\1', '\>s = regexprep(cstr, '(.)\1', '--', 'ignorecase')
s =
'Whose w--ds these are I think I know.'
'His house is in the vi--age though;'
'He wi-- not s-- me sto--ing here'
'To watch his w--ds fi-- up with snow.



More......

MATLAB中的cell


Share/Save/Bookmark


如果p为一个数,那么h(1)=p,是没有问题的。
如果p为一个向量,那么h(1,:)=p是没有问题的。
如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的。

那么要如何处理呢?
Summary



这时就用到了cell数据类型了。cell的每个单元都可以存储任何数据,比如传递函数等。当然,存储矩阵更是没有问题的了。但是用cell数据类型之前,要先初始化。

a=cell(n,m)

那么就把a初始化为一个n行m列的空cell类型数据。

如何赋值呢?

a{1,1}=rand(5)

那么a的1行1列的单元中存储的就是一个随机的5×5的方阵了。

那么要用第一个单元中的方阵中的某个值呢?

可以如下引用:a{1,1}(2,3)

就可以了,引用cell单元时要用{},再引用矩阵的某个数据就要用()了。

cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。



More......

matlab作图技巧


Share/Save/Bookmark


MATLAB受到控制界广泛接受的一个重要原因是因为它提供了方便的绘图功能.这里主要介绍2维图形对象的生成函数及图形控制函数的使用方法,还将简单地介绍一些图形的修饰与标注函数及操作和控制MATLAB各种图形对象的方法.


第一节 图形窗口与坐标系

一.图形窗口
1.MATLAB在图形窗口中绘制或输出图形,因此图形窗口就像一张绘图纸.
2.在MATLAB下,每一个图形窗口有唯一的一个序号h,称为该图形窗口的句柄.MATLAB通过管理图形窗口的句柄来管理图形窗口;
3.当前窗口句柄可以由MATLAB函数gcf获得;
4.在任何时刻,只有唯一的一个窗口是当前的图形窗口(活跃窗口);figure(h)----将句柄为h的窗口设置为当前窗口;
5.打开图形窗口的方法有三种:
1)调用绘图函数时自动打开;
2)用File---New---Figure新建;
3)figure命令打开,close命令关闭.
在运行绘图程序前若已打开图形窗口,则绘图函数不再打开,而直接利用已打开的图形窗口;若运行程序前已存在多个图形窗口,并且没有指定哪个窗口为当前窗口时,则以最后使用过的窗口为当前窗口输出图形.
6.窗口中的图形打印:用图形窗口的File菜单中的Print项.
7.可以在图形窗口中设置图形对象的参数.具体方法是在图形窗口的Edit菜单中选择Properties项,打开图形对象的参数设置窗口,可以设置对象的属性.

二.坐标系
1.一个图形必须有其定位系统,即坐标系;
2.在一个图形窗口中可以有多个坐标系,但只有一个当前的坐标系;
3.每个坐标系都有唯一的标识符,即句柄值;
4.当前坐标系句柄可以由MATLAB函数gca获得;
5.使某个句柄标识的坐标系成为当前坐标系,可用如下函数:axes(h) h为指定坐标系句柄值.
6.一些有关坐标轴的函数:
1)定义坐标范围:一般MATLAB自动定义坐标范围,如用户认为设定的不合适,可用:axis([Xmin, Xmax, Ymin, Ymax])重新设定;
2)坐标轴控制:MATLAB的缺省方式是在绘图时,将所在的坐标系也画出来,为隐去坐标系,可用axis off;axis on则显示坐标轴(缺省值).
3)通常MATLAB的坐标系是长方形,长宽比例大约是4:3,为了得到一个正方形的坐标系可用:axis square
4)坐标系横纵轴的比例是自动设置的,比例可能不一样,要得到相同比例的坐标系,可用:axis equal

第二节 二维图形的绘制

一. plot函数
plot函数是最基本的绘图函数,其基本的调用格式为:
1.plot(y)------绘制向量y对应于其元素序数的二维曲线图,如果y为复数向量,则绘制虚部对于实部的二维曲线图.
例:绘制单矢量曲线图.
y=[0 0.6 2.3 5 8.3 11.7 15 17.7 19.4 20];
plot(y)
由于y矢量有10个元素,x坐标自动定义为[1 2 3 4 5 6 7 8 9 10].

2.plot(x,y)------绘制由x,y所确定的曲线.
1)x,y是两组向量,且它们的长度相等,则plot(x,y)可以直观地绘出以x为横坐标,y为纵坐标的图形.
如:画正弦曲线:
t=0:0.1:2*pi;
y=sin(t);
plot(t,y)
2)当plot(x,y)中,x是向量,y是矩阵时,则绘制y矩阵中各行或列对应于向量x的曲线.如果y阵中行的长度与x向量的 长度相同,则以y的行数据作为一组绘图数据;如果y阵中列的长度与x向量的 长度相同,则以y的列数据作为一组绘图数据;如果y阵中行,列均与x向量的长度相 同,则以y的每列数据作为一组绘图数据.
例:下面的程序可同时绘出三条曲线.MATLAB在绘制多条曲线时,会按照一定的规律自动变化每条曲线的的颜色.
x=0:pi/50:2*pi;
y(1,:)=sin(x);
y(2,:)=0.6*sin(x);
y(2,:)=0.3*sin(x);
plot(x,y)
或者还可以这样用:
x=0:pi/50:2*pi;
y=[ sin(x); 0.6*sin(x); 0.3*sin(x)];
plot(x,y)
3) 如果x,y是同样大小的矩阵,则plot(x,y)绘出y中各列相应于x中各列的图形.
例:x(1,:)=0:pi/50:2*pi;
x(2,:)=pi/4:pi/50:2*pi+pi/4;
x(3,:)=pi/2:pi/50:2*pi+pi/2;
y(1,:)=sin(x(1,:));
y(2,:)=0.6*sin(x(2,:));
y(3,:)=0.3*sin(x(3,:));
plot(x,y)
x=x';
y=y';
figure
plot(x,y)
在这个例子中,x------3x101,y------3x101,所以第一个plot按列画出101条曲线,每条3个点;而x'------ 101x3,y'------101x3,所以第二个plot按列画出3条曲线,每条101个点.

3.多组变量绘图:plot(x1, y1, 选项1, x2, y2, 选项2, ……)上面的plot格式中,选项是指为了区分多条画出曲线的颜色,线型及标记点而设定的曲线的属性.MATLAB在多组变量绘图时,可将曲线以不同的颜色,不同的线型及标记点表示出来.这些选项如下表所示:各种颜色属性选项
'r' 红色 'm' 粉红
'g' 绿色 'c' 青色
'b' 兰色 'w' 白色
'y' 黄色 'k' 黑色
各种线型属性选项
'-' 实线 '--' 虚线
':' 点线 '-.' 点划线
各种标记点属性选项
'.' 用点号绘制各数据点 '^' 用上三角绘制各数据点
'+' 用'+'号绘制各数据点 'v' 用下三角绘制各数据点
'*' 用'*'号绘制各数据点 '>' 用右三角绘制各数据点
' .' 用'.'号绘制各数据点 '<' 用左三角绘制各数据点 's'或squar 用正方形绘制各数据点'p' 用五角星绘制各数据点 'd'或diamond用菱形绘制各数据点 'h' 用六角星绘制各数据点 这些选项可以连在一起用,如:'-.g'表示绘制绿色的点划线,'g+'表示用绿色的'+'号绘制曲线. 注意: 1)表示属性的符号必须放在同一个字符串中; 2)可同时指定2~3个属性; 3)与先后顺序无关; 4)指定的属性中,同一种属性不能有两个以上. 例:t=0:0.1:2*pi; y1=sin(t); y2=cos(t); y3=sin(t).*cos(t); plot(t,y1, '-r',t,y2, ':g',t,y3, '*b') 该程序还可以按下面的方式写: t=0:0.1:2*pi; y1=sin(t); y2=cos(t); y3=sin(t).*cos(t); plot(t,y1, '-r') hold on plot(t,y2, ':g') plot(t,y3, '*b') hold off 注:在MATLAB中,如画图前已有打开的图形窗口,则再画图系统将自动擦掉坐标系中已有的图形对象,但设置了hold on后,可以保持坐标系中已绘出的图形. 还可以进一步设置包括线的宽度(LineWidth),标记点的边缘颜色 (MarkerEdgeColor),填充颜色(MarkerFaceColor)及标记点的大小(MarkerSize)等其它绘图属性. 例:设置绘图线的线型,颜色,宽度,标记点的颜色及大小. t=0:pi/20:pi; y=sin(4*t).*sin(t)/2; plot(t,y,'-bs','LineWidth',2,... %设置线的宽度为2 'MarkerEdgeColor','k',... %设置标记点边缘颜色为黑色 'MarkerFaceColor','y',... %设置标记点填充颜色为黄色 'MarkerSize',10) %设置标记点的尺寸为10 4.双Y轴绘图:plotyy()函数. 其调用格式为: plotyy(x1,y1,x2,y2)------绘制由x1,y1和x2,y2确定的两组曲线,其中x1,y1的坐标轴在图形窗口的左侧,x2,y2 的坐标轴在图形窗口的右侧. Plotyy(x1,y1,x2,y2, 'function1','function2')------功能同上,function是指那些 绘图函数如:plot,semilogx,loglog等. 例如:在一个图形窗口中绘制双Y轴曲线. x=0:0.3:12; y=exp(-0.3*x).*sin(x)+0.5; plotyy(x,y,x,y,'plot','stem') stem:绘制stem形式的曲线(上端带圈的竖线). 绘图结果:两条图线自动用不同的颜色区分,两个坐标的颜色与图线的颜色相对应,左边的Y轴坐标对应的是plot形式的曲线,右边的Y坐标对应的是stem 形式的曲线. 二.对数坐标图绘制函数: 在对数坐标图的绘制中,有三种绘图函数:semilogx,semilogy和loglog函数. 1)semilogx( )------绘制以X轴为对数坐标轴的对数坐标图. 其调用格式为:semilogx(x,y,'属性选项')其中属性选项同plot函数.该函数只对横坐标进行对数变换,纵坐标仍为线性坐标. 2)semilogy( )------绘制以Y轴为对数坐标轴的对数坐标图. 其调用格式为:semilogy(x,y,'属性选项')该函数只对纵坐标进行对数变换,横坐标仍为线性坐标. 3)loglog( )------ 绘制X,Y轴均为对数坐标轴的图形. 其调用格式为:loglog(x,y,'属性选项')该函数分别对横,纵坐标都进行对数变换. 例: x=0:0.1:6*pi; y=cos(x/3)+1/9; subplot(221), semilogx(x,y); subplot(222), semilogy(x,y); subplot(223), loglog(x,y); 4)MATLAB还提供了一个实用的函数:logspace( )函数,可按对数等间距地分布来产生一个向量,其调用格式为: x=logspace(x1,x2,n) 这里,x1表示向量的起点;x2表示向量的终点;n表示需要产生向量点的个数(一般可以不给出,采用默认值50).在控制系统分析中一般采用这种方法来构成频率向量w.关于它的应用后面还要讲到. 三.极坐标图的绘制函数: 绘极坐标图可用polar( )函数.其调用格式如下: polar(theta, rho,'属性选项')------theta:角度向量,rho:幅值向量,属性内容与plot函数基本一致. 例如:极坐标模型为:3145/)/)cos((+ =θρ, ],[πθ80∈则绘出极坐标图的程序为:theta=0:0.1:8*pi; p=cos((5*theta)/4)+1/3; polar(theta,p) 四.绘制多个子图:subplot( )函数 MATLAB允许在一个图形窗口上绘制多个子图(如对于多变量系统的输 出),允许将窗口分成nxm个部分. 分割图形窗口用subplot函数来实现,其调用格式为: subplot(n,m,k)或subplot(nmk)------n,m分别表示将窗口分割的行数和列数,k表示要画图部分的代号,表示第几个图形,nmk三个数可以连写,中间不用符号分开. 例如:将窗口划分成2x2=4个部分,可以这样写: subplot(2,2,1),plot(……) subplot(2,2,2),…… subplot(2,2,3),…… subplot(2,2,4),…… 注:subplot函数没有画图功能,只是将窗口分割. 第三节 图形的修饰与标注 MATLAB提供了一些特殊的函数修饰画出的图形,这些函数如下: 1)坐标轴的标题:title函数 其调用格式为:title('字符串')------字符串可以写中文 如:title('My own plot') 2)坐标轴的说明:xlabel和ylabel函数 格式:xlabel('字符串')ylabel('字符串') 如:xlabel('This is my X axis') ylabel('My Y axis') 3)图形说明文字:text和gtext函数 A.text函数:按指定位置在坐标系中写出说明文字. 格式为:text(x1, y1, '字符串', '选项') x1,y1为指定点的坐标;'字符串'为要标注的文字;'选项'决定x1,y1 的坐标单位,如没有选项,则x1,y1的坐标单位和图中一致;如选项为'sc', 则x1,y1表示规范化窗口的相对坐标,其范围为0到1. 如:text(1,2, '正弦曲线') B.gtext函数:按照鼠标点按位置写出说明文字. 格式为:gtext('字符串') 当调用这个函数时,在图形窗口中出现一个随鼠标移动的大十字交叉线,移动鼠标将十字线的交叉点移动到适当的位置,点击鼠标左键,gtext参数中的字符串就标注在该位置上. 4)给图形加网格:grid函数 在调用时直接写grid即可. 上面的函数的应用实例: 例:在图形中加注坐标轴标识和标题及在图形中的任意位置加入文本. t=0:pi/100:2*pi; y=sin(t); plot(t,y),grid, axis([0 2*pi -1 1]) xlabel('0 leq itt rm leq pi','FontSize',16) ylabel('sin(t)','FontSize',20) title('正弦函数图形','FontName','隶书' ,'FontSize',20) text(pi,sin(pi),'leftarrowsin(t)=0','FontSize',16) text(3*pi/4,sin(3*pi/4),'leftarrowsin(t)=0.707', 'FontSize',16) text(5*pi/4,sin(5*pi/4),' sin(t)=-0.707rightarrow',... 'FontSize',16,'HorizontalAlignment','right') 5)在图形中添加图例框:legend函数 其调用格式为: A.legend('字符串1', '字符串2', ……)------以字符串1,字符串2…… 作为图形标注的图例. B.legend('字符串1', '字符串2', ……, pos)------pos指定图例框显示的位置. 图例框被预定了6个显示位置: 0------取最佳位置; 1------右上角(缺省值); 2------左上角; 3------左下角; 4------右下角; -1------图的右侧. 例:在图形中添加图例. x=0:pi/10:2*pi; y1=sin(x); y2=0.6*sin(x); y3=0.3*sin(x); plot(x,y1,x,y2,'-o',x,y3,'-*') legend('曲线1','曲线2','曲线3') 6)用鼠标点选屏幕上的点:ginput函数 格式为:[x, y, button]=ginput(n) 其中:n为所选择点的个数;x,y均为向量,x为所选n个点的横坐标;y为所选n个点的纵坐标.button为n维向量,是所选n个点所对应的鼠标键的标号: 1------左键; 2------中键; 3------右键. 可用不同的鼠标键来选点,以区别所选的点.此语句可以放在绘图语句之后,它可在绘出的图形上操作,选择你所感 兴趣的点,如峰值点,达到稳态值的点等,给出点的坐标,可求出系统的性能指标. 第四节 MATLAB下图形对象的修改 MATLAB图形对象是指图形系统中最基本,最底层的单元,这些对象包括: 屏幕(Root),图形窗口(Figures),坐标轴(Axes),控件(Uicontrol),菜单(Uimenu),线(Lines),块 (Patches),面(Surface),图像(Images),文本(Text)等等.根据各对象的相互关系,可以构成如下所示的树状层次: Root Figures Axes Uicontrol Uimenu Uicontextmenu (对象菜单) Images Line Patch Surface Text 对各种图形对象进行修改和控制,要使用MATLAB的图形对象句柄 (Handle).在MATLAB中,每个图形对象创立时,就被赋予了唯一的标识,这个标识就是该对象的句柄.句柄的值可以是一个数,也可以是一个矢量.如每个计算机的根对象只有一个,它的句柄总是0,图形窗口的句柄总是正整数,它标识了图形窗口的序号等.利用句柄可以操纵一个已经存在的图形对象的属性,特别是对指定图形对象句柄的操作不会影响同时存在的其它图形对象,这一点是非常重要的. 一.对图形对象的修改可以用下面函数: 1)set函数:用于设置句柄所指的图形对象的属性. Set函数的格式为: set(句柄, 属性名1, 属性值1, 属性名2, 属性值2, ……) 例:h=plot(x,y) set(h, 'Color', [1,0,0])------将句柄所指曲线的颜色设为红色. 2)get函数:获取指定句柄的图形对象指定属性的当前值. 格式为:get(句柄, '属性名') 如: get(gca, 'Xcolor')------获得X轴的当前颜色属性值. 执行后可返回X轴的当前颜色属性值[0,0,0](黑色). 3)如果没有设置句柄,则可以使用下列函数获得: gcf:获得当前图形窗口的句柄; gca:获得当前坐标轴对象的句柄; gco:获得当前对象的句柄. 如: A.要对图形窗口的底色进行修改,可用: set(gcf, 'Color', [1,1,1])------将图形窗口底色设为白色 B.要把当前X轴的颜色改为绿色,可用: set(gca, 'Xcolor', [0,1,0]) C.还可对坐标轴的显示刻度进行定义: t=-pi:pi/20:pi; y=sin(t); plot(t,y) set(gca,'xtick',[-pi:pi/2:pi],'xticklabel',['-pi','-pi/2','0','pi/2','pi']) 本例中用'xtick'属性设置x轴刻度的位置(从-pi~pi,间隔pi/2,共设置5个点),用'xticklabel'来指定刻度的值,由于通常习惯于用角度度量三角函数,因此重新设置['-pi','-pi/2','0','pi/2','pi']5个刻度值. 二.一些常用的属性如下: 1)Box属性:决定图形坐标轴是否为方框形式,选项为'on'(有方框), 'off'(无方框); 2)'ColorOrder'属性:设置多条曲线的颜色顺序,默认值为: [1 1 0;1 0 1;0 1 1;1 0 0;0 1 0;0 0 1] 黄色 粉色 天蓝 红色 绿色 兰色 颜色向量还有:[1 1 1]------白色;[0 0 0]------黑色. 3)坐标轴方向属性:'Xdir','Ydir','Zdir',其选项为: 'normal'------正常 'reverse'------反向 4)坐标轴颜色和线型属性:'Xcolor','Ycolor','Zcolor'------ 轴颜色, 值为颜色向量 如何在画好曲线后 再在图上标刻度 就是想在一些特定的点边上标上一串30.60.90~7200 递增的数据,共有96个点要标!! im = imread(url); imshow(im) 然后输入: text(100,100,'\o ','Color','red'); matlab,用imread读入一个图片,我想在图上的一些坐标点上做标记。比如把图上坐标值为(100,100)的点用红圈注出来。具体用什么命令语句实现呢 用subplot在一个图象窗口中作下列四条曲线,并为每幅图形加上标题: 1) 概率曲线y=e^(-x^2) 2) 四叶玫瑰线 ρ=sin2θ 3) 叶形线x=3t/(1+t^3) y=3t^2/(1+t^3) 4)摆线x=a(t-sint), y=a(1-cost), t∈[0,2π]。 5)坐标轴的标尺属性:'Xtick','Ytick','Ztick'------ 标度的位置,值为 向量 'Xticklabel','Yticklabel','Zticklabel'------ 轴上标度的符号,它的值为与标度位置向量同样大小(向量个数相同)的向量. 5)字体设置属性:'FontAngle'------ 设置字体角度,选项为: 'normal'------ 正常; 'italic'------ 斜体; 'oblique'------ 倾斜; 'FontName'------ 字体名称; 'FontSize'------ 字号大小 'FontWeight'------ 字体的轻重,选项为:'light', 'normal','bold' x=1:8; subplot(2,2,1) plot(x) %tick style 0(auto) subplot(2,2,2) plot(x) set(gca,'xtick',[1 3 6 8]);%style 1 set(gca,'ytick',[]);%style 2 subplot(2,2,3) plot(x) set(gca,'xtick',[1 3 6 8]); set(gca,'xticklabel',sprintf('%03.4f|',get(gca,'xtick')));%style 3 set(gca,'ytick',[2 4 5 7]); set(gca,'yticklabel',{'Two','Four','Five','Seven'});%style 4 subplot(2,2,4) plot(x) set(gca,'xminortick','on');%style 5 set(gca,'ticklength',[0.05 0.025]);%style 6 set(gca,'tickdir','out');%style 7 另附Maltab坐标调整程序一段: x=20:10:20000; y=rand(size(x)); semilogx(x,y); set(gca,'XLim',[20 20000]); set(gca,'XMinorTick','off'); set(gca,'XTick',[20 31.5 63 125 250 500 1000 2000 4000 8000 16000]); set(gca,'XGrid','on'); set(gca,'XMinorGrid','off'); 在绘图命令中应该如何确定横坐标和纵坐标的标度尺寸(自己定范围) 如何在一个坐标中绘制多条曲线,并用不同的颜色区别。 help plot help axis a1=plot(); hlod on a2=plot(); legend([a1 a2],'图1名',‘图2名') hold off x1=-pi:pi/12:pi; x2=-pi:pi/12:pi; y1=sin(x1); y2=cos(x2); plot(x1,y1,x2,y2); axis([-2*pi 2*pi -2 2]); xlabel('x'); ylabel('y'); title('sin(x) & cos(x)');

More......

Matlab 图像处理相关函数命令


Share/Save/Bookmark



一、通用函数:

colorbar  显示彩色条

语法:colorbar \ colorbar('vert') \
colorbar('horiz') \ colorbar(h) \ h=colorbar(...) \
colorbar(...,'peer',axes_handle)

getimage 从坐标轴取得图像数据

语法:A=getimage(h) \ [x,y,A]=getimage(h) \
[...,A,flag]=getimage(h) \ [...]=getimage




imshow 显示图像

语法:imshow(I,n) \ imshow(I,[low high]) \
imshow(BW) \ imshow(X,map) \ imshow(RGB)\
imshow(...,display_option) \ imshow(x,y,A,...) \ imshow filename \
h=imshow(...)

montage 在矩形框中同时显示多幅图像

语法:montage(I) \ montage(BW) \ montage(X,map)
\ montage(RGB) \ h=montage(...)

immovie 创建多帧索引图的电影动画

语法:mov=immovie(X,map) \
mov=immovie(RGB)

subimage 在一副图中显示多个图像

语法:subimage(X,map) \ subimage(I) \
subimage(BW) \  subimage(RGB) \ subimage(x,y,...)
\ subimage(...)


truesize 调整图像显示尺寸

语法:truesize(fig,[mrows mcols]) \
truesize(fig)

warp 将图像显示到纹理映射表面

语法:warp(X,map) \ warp(I ,n) \ warp(z,...)
warp(x,y,z,...) \  h=warp(...)

zoom 缩放图像

语法:zoom on \ zoom off \ zoom out \ zoom reset
\ zoom \ zoom xon \ zoom yon\ zoom(factor) \
zoom(fig,option)

 

二、图像文件I/O函数命令


imfinfo 
返回图形图像文件信息

语法:info=imfinfo(filename,fmt) \
info=imfinfo(filename)

imread 
从图像文件中读取(载入)图像

语法:A=imread(filename,fmt) \
[X,map]=imread(filename,fmt) \ [...]=imread(filename) \
[...]=imread(URL,...) \ [...]=imread(...,idx) (CUR,ICO,and TIFF
only) \ [...]=imread(...,'frames',idx) (GIF only) \
[...]=imread(...,ref) (HDF only) \
[...]=imread(...,'BackgroundColor',BG) (PNG only) \ [A,map,alpha]
=imread(...) (ICO,CUR,PNG only)

imwrite 
把图像写入(保存)图像文件中

语法:imwrite(A,filename,fmt) \
imwrite(X,map,filename,fmt) \ imwrite(...,filename) \
imwite(...,Param1,Val1,Param2,Val2...)


imcrop  剪切图像

语法:I2=imcrop(I) \ X2=imcrop(X,map) \
RGB2=imcrop(RGB) \ I2=imcrop(I,rect) \ X2=imcrop(RGB,rect) \
[...]=imcrop(x,y,...) \ [A,rect]=imcrop(...) \
[x,y,A,rect]=imcrop(...)

imresize  改变图像大小

语法:B=imresize(A,m,method)

imrotate  旋转图像

语法:B=imrotate(A,angle,method) \
B=imrotate(A,angle,method,'crop')


 

三、像素和统计处理函数

corr2 
计算两个矩形的二维相关系数

语法:r=corr2(A,B)

imcontour 创建图像数据的轮廓图

语法:imcontour(I,n) \ imcontour(I,v) \
imcontour(x,y,...) \ imcontour(...,LineSpec) \ [C,h]
=imcontour(...)

imfeature 
计算图像区域的特征尺寸


语法:stats=imfeature(L,measurements) \
stats=imfeature(L,measurements,n)

imbist 
显示图像数据的柱状图

impixel 确定像素颜色值

语法:P=impixel(I) \ P=impixel(X,map) \
P=impixel(RGB) \ P=impixel(I,c,r) \ P=impixel(X,map,c,r) \
P=impixel(RGB,c,r) \ [c,r,P]=impixel(...) \ P=impixel(x,y,I,xi,yi)
\ P=impixel(x,y,RGB,xi,yi) \ P=impixel(x,y,X,map,xi,yi)
\

[xi,yi,P]=impixel(x,y,...)

improfile 沿线段计算剖面图的像素值

语法:c=improfile \ c=improfile(n) \
c=improfile(I,xi,yi) \ c=improfile(I,xi,yi,n) \ 
[cx,cy,c]=improfile(...)  \
[cx,cy,c,xi,yi]=improfile(...) \ [...]=improfile(x,y,I,xi,yi)
[...]=improfile(x,y,I,xi,yi,n) \
[...]=improfile(...,method)


mean2 计算矩阵元素的平均值

语法:B=mean2(A)

pixval  显示图像像素信息

语法:pixval on

std2 计算矩阵元素的标准偏移

语法:b=std2(A)

 

四、图像分析函数:


edge 图像边缘检测

语法:BW=edge(I,'sobel') \
BW=edge(I,'sobel',thresh) \ BW=edge(I,'sobel',thresh,direction) \
[BW,thresh]=edge(I,'sobel',...) \ BW=edge(I,'prewitt') \
BW=edge(I,'prewitt',thresh) \ BW=edge(I,'prewitt',thresh,direction)
\

[BW,thresh]=edge(I,'prewitt',...)
BW=edge(I,'roberts') \
BW=edge(I,'roberts',thresh) \ [BW,thresh]=edge(I,'roberts',...) \ BW=edge(I,'log') \
BW=edge(I,'log',thresh) \ BW=edge(I,'log',thresh,sigma) \
[BW,threshold]=edge(I,'log',...) \ BW=edge(I,'zerocross',thresh,h)
\ [BW,thresh]=edge(I,'zerocross',...) \

BW=edge(I,'canny') \
BW=edge(I,'canny',thresh) \ BW=edge(I,'canny',thresh,sigma) \
[BW,threshold]=edge(I,'canny',...)

qtgetblk 
获取四叉树分解的块值

语法:[vals,r,c]=qtgetblk(I,S,dim) \
[vals,idx]=qtgetblk(I,S,dim)


qtsetblk 设置四叉树分解中的块值

语法:J=qtsetblk(I,S,dim,vals)

 

五、图像增强函数

histeq 用柱状图均等化增强对比

语法:J=histeq(I,hgram) \ J=histeq(I,n) \
[J,T]=histeq(I,...) \ newmap=histeq(X,map,hgram) \
newmap=histeq(X,map)

imadjust 调整图像灰度值或颜色映像表

语法:J=imadjust(I,[low_in ,high_in]),[low_out
,high_out],gamma) \ newmap=imadjust(map,[low_in ,high_in]),[low_out
,high_out],gamma) \ RGB2=imadjust(RGB1,...)

imnoise 增强图像的渲染效果


语法:J=imnoise(I,type) \
J=imnoise(I,type,parameters)

medfilt2 进行二维中值过滤

语法:B=medfilt2(A,[m n]) \ B=medfilt2(A) \
B=medfilt2(A,'indexed',...)

ordfilt2 进行二维统计顺序过滤

语法:B=ordfilt2(A,order,domain) \
B=ordfilt2(A,order,domain,S) \ B=ordfilt2(...,padopt)

wiener2 进行二维适应性去噪过滤处理

语法:J=wiener2(I,[m  n],noise)
\ [J,noise]=wiener2(I,[m n])

 


六、线性滤波函数

conv2 进行二维卷积操作

语法:C=conv2(A,B) \ C=conv2(hcol,hrow,A) \
C=conv2(...,'shape')

convmtx2 计算二维卷积矩阵

语法:T=convmtx2(H,m,n) \ T=convmtx2(H,[m
n])

convn 计算n维卷积

语法:C=convn(A,B) \
C=convn(A,B,'shape')

filter2 进行二维线性过滤操作

语法:Y=filter2(h,X) \
Y=filter2(h,X,shape)


fspecial 创建预定义过滤器

语法:h=fspecial(type) \
h=fspecial(type,parameters)

 

七、线性二维滤波设计函数

freqspace 确定二维频率响应的频率空间

语法:[f1,f2]=freqspace(n) \
[f1,f2]=freqspace([m n]) \ [x1 ,y1]=freqspace(...,'meshgrid') \
f=freqspace(N) \ f=freqspace(N,'whole')

freqz2 计算二维频率响应

语法:[H,f1,f2]=freqz2(h,n1,n2) \
[H,fi,f2]]=freqz2(h,[n2,n1]) \ [H,fi,f2]]=freqz2(h,f1,f2]) \
[H,fi,f2]]=freqz2(h) \
[...]=freqz2(h,...,[dx dy]) \ [...]=freqz2(h,...,dx) \
freqz2(...)


fsamp2 用频率采样法设计二维FIR过滤器

语法:h=fsamp2(Hd) \ h=fsamp2(f1,f2,Hd,[m
n])

ftrans2 通过频率转换设计二维FIR过滤器

语法:h=ftrans2(b,t) \ h=ftrans2(b)

fwind1 用一维窗口方法设计二维FIR过滤器

语法:h=fwind1(Hd,win) \ h=fwind1(Hd,win1,win2)
\ h=fwind1(f1,f2,Hd,...)

fwind2 用二维窗口方法设计二维FIR过滤器

语法:h=fwind2(Hd,win) \
h=fwind2(f1,f2,Hd,win)

 


八、图像变换函数

dct2 进行二维离散余弦变换(反余弦变换用idct2)

语法:B=dct2(A) \ B=dct2(A,m.n) \ B=dct2(A,[m
n])

dctmtx 计算离散余弦傅立叶变换

语法:D=dctmtx(n)

fft2 进行二维快速傅立叶变换(反变换用ifft2)

语法:Y=fft2(X) \ Y=fft2(X,m,n)

fftn 进行n维快速傅立叶变换(反变换用ifftn)

语法:Y=ffn(X) \ Y=fftn(X,siz)


fftshift 快速傅立叶变换的DC组件移到光谱中心

语法:Y=fftshift(X) \
Y=fftshift(X,dim)

iradon 进行反radon变换

语法:I=iradon(P,theta) \
I=iradon(P,theta,interp,filter,d,n) \ [I,h]=iradon(...)

phantom 产生一个头部幻影图像

语法:P=phantom(def,n) \ P=phantom(E,n) \
[P,E]=phantom(...)

radon 计算radon变换

语法:R=radon(I,theta) \
[R,xp]=radon(...)

 


九、边沿和块处理函数

bestblk 确定进行块操作的块大小

语法:siz=bestblk([m n],k) \ [mb,nb]=bestblk([m
n],k)

blkproc 实现图像的显示块操作

语法:B=blkproc(A,[m n]),fun) \ B=blkproc(A,[m
n],fun,P1,P2,...) \ B=blkproc(A,[m n],[mborder
nborder],fun,...)

col2im 将矩阵的列重新组织到块中

语法:A=col2im(B,[m n],[mm nn],block_type) \
A=col2im(B,[m n],[mm nn])

colfilt 利用列相关函数进行边沿操作

语法:B=colfilt(A,[m n],block_type,fun) \
B=colfilt(A,[m n],block_type,fun,P1,P2,...) \ B=colfilt(A,[m
n],[mblock nblock],...) \ B=colfilt(A,'indexed',...)


im2col 重调图像块为列

语法:B=im2col(A,[m n],block_type) \
B=im2col(A,[m n]) \ B=im2col(A,'indexed',...)

nlfilter 进行边沿操作

语法:B=nlfilter(A,[m n],fun) \ B=nlfilter(A,[m
n],fun,P1,P2,...) \ B=nlfilter(A,'indexed',...)

 

十、二进制图像操作函数

applylut 在二进制图像中利用lookup表进行行边沿操作

语法:A=applylut(BW,LUT)

bwarea 计算二进制图像对象的面积


语法:total=bwarea(BW)

bweuler 计算二进制图像的欧拉数

语法:eul=bweuler(BW)

bwfill 填充二进制图像的背景色

语法:BW2=bwfill(BW1,c,r,n) \ BW2=bwfill(BW1,n)
\ [BW2,idx]=bwfill(...) \ BW2=bwfill(x,y,BW1,xi,yi,n) \
[x,y,BW2,idx,xi,yi]=bwfill(...) \ 
[BW2,idx]=bwfill(BW1,'holes',n)

bwlabel 标注二进制图像中已连接的部分

语法:L=bwlabel(BW,n) \
[L,num]=bwlabel(BW,n)

bwmorph 提取二进制图像的轮廓


语法:BW2=bwmorph(BW1,operation) \
BW2=bwmorph(BW1,operation,n)

bwperim 计算二进制图像中对象的周长

语法:BW2=bwperim(BW1) \
BW2=bwperim(BW1,CONN)

bwselect 在二进制图像中选择对象

语法:BW2=bwselect(BW1,c,r,n) \
BW2=bwselect(BW1,n) \ [BW2,idx]=bwselect(...) \
BW2=bwselect(x,y,BW1,xi,yi,n) \
[x,y,BW2,idx,xi,yi]=bwselect(...)

dilate 放大二进制图像

语法:BW2=dilate(BW1,SE) \
BW2=dilate(BW1,SE,alg) \ BW2=dilate(BW1,SE,...,n)

erode 弱化二进制图像的边界

语法:BW2=erode(BW1,SE) \ BW2=erode(BW1,SE,alg) \ BW2=erode(BW1,SE,...,n)


makelut 创建一个用于applylut函数的lookup表

语法:lut=makelut(fun,n) \
lut=makelut(fun,n,P1,P2,...)

 

十一、区域处理函数

roicolor 选择感兴趣的颜色区

语法:BW=roicolor(A,low,high) \
BW=rocicolor(A,v)

roifill 在图像的任意区域中进行平滑插补

语法:J=roifill(I,c,r) \ J=roifill(I) \
J=roifill(I,BW) \ [J,BW]=roifill(...) \ J=roifill(x,y,I,xi,yi) \
[x,y,J,BW,xi,yi]=roifill(...)

roifilt2 过滤敏感区域


语法:J=roifilt2(h,I,BW) \ J=roifilt2(I,BW,fun)
\ J=roifilt2(I,BW,fun,P1,P2,...)

roipoly 选择一个敏感的多边形区域

语法:BW=roipoly(I,c,r) \ BW=roipoly(I) \
BW=roipoly(x,y,I,xi,yi) \ [BW,xi,yi]=roipoly(...) \
[x,y,BW,xi,yi]=roipoly(...)

 

十二、颜色映像处理函数

brighten 增加或降低颜色映像表的亮度

语法:brighten(beta) \ brighten(h,beta) \
newmap=brighten(beta) \ newmap=brighten(cmap,beta)

cmpermute 调整颜色映像表中的颜色

语法:[Y,newmap]=cmpermute(X,map) \
[Y,newmap]=cmpermute(X,map,index)


cmunigue 查找颜色映像表中特定的颜色及相应的图像

语法:[Y,newmap]=cmunigue(X,map) \
[Y,newmap]=cmunigue(RGB) \ [Y,newmap]=cmunique(I)

imapprox 对索引图像进行近似处理

语法:[Y,newmap]=imapprox(X,map,n)
[Y,newmap]=imapprox(X,map,tol) \
Y=imapprox(X,map,newmap) \
[...]=imapprox(...,dither_option)

rgbplot 划分颜色映像表

语法:rgbplot(cmap)

 


十三、颜色空间转换函数

hsv2rgb
转换HSV值为RGB颜色空间:M=hsv2rgb(H)

ntsc2rgb
转换NTSC值为RGB颜色空间:rgbmap=ntsc2rgb(yiqmap) \
RGB=ntsc2rgb(YIQ)

rgb2hsv
转换RGB值为HSV颜色空间:cmap=rgb2hsv(M)

rgb2ntsc
转换RGB值为NTSC颜色空间:yiqmap=rgb2ntsc(rgbmap) \
YIQ=rgb2ntsc(RGB)

rgb2ycbcr
转换RGB值为YCbCr颜色空间:ycbcrmap=rgb2ycbcr(rgbmap) \
YCBCR=rgb2ycbcr(RGB)

ycbcr2rgb
转化YCbCr值为RGB颜色空间:rgbmap=ycbcr2rgb(ycbcrmap) \
RGB=ycbcr2rgb(YCBCR)

 

十四、图像类型和类型转换函数


dither 通过抖动增加外观颜色分辨率转换图像

语法:X=dither(RGB,map) \
BW=dither(I)

gray2ind 转换灰度图像为索引图像

语法:[X,map]=gray2ind(I,n) \
[X,map]=gray2ind(BW,n)

grayslice 从灰度图像为索引图像

语法:X=grayslice(I,n) \
X=grayslice(I,v)

im2bw 转换图像为二进制图像

语法:BW=im2bw(I,level) \ BW=im2bw(X,map,level)
\ BW=im2bw(RGB,level)

im2double 转换图像矩阵为双精度型


语法:I2=im2double(I1) \ RGB2=im2double(RGB1) \
I=im2double(BW) \ X2=im2double(X1,'indexed')

double 转换数据为双精度型

语法:double(X)

unit8 、unit16转换数据为8位、16位无符号整型: i=unit8(x) \
i=unit16(x)

im2unit8 转换图像阵列为8位无符号整型

语法:I2=im2unit8(I1) \ RGB2=im2unit8(RGB1) \
I=im2unit8(BW) \ X2=im2unit8(X1,'indexed')

im2unit16 转换图像阵列为16位无符号整型

语法:I2=im2unit16(I1) \ RGB2=im2unit16(RGB1) \
I=im2unit16(BW) \ X2=im2unit16(X1,'indexed')


ind2gray 把检索图像转化为灰度图像

语法:I=ind2gray(X,map)

ind2rgb 
转化索引图像为RGB真彩图像

语法:RGB=ind2rgb(X,map)

isbw 判断是否为二进制图像

语法:flag=isbw(A)

isgray 判断是否为灰度图像

语法:flag=isgray(A)


isind 判断是否为索引图像

语法:flag=isind(A)

isrgb 判断是否为RGB真彩色图像

语法:flag=isrgb(A)

mat2gray 转换矩阵为灰度图像

语法:I=mat2gray(A,[amin amax]) \
I=mat2gray(A)

rgb2gray 转换RGB图像或颜色映像表为灰度图像

语法:I=rgb2gray(RGB) \
newmap=rgb2gray(map)

rgb2ind 转换RGB图像为索引图像


语法:[X,map]=rgb2ind(RGB,tol) \
[X,map]=rgb2ind(RGB,n) \ X=rgb2ind(RGB,map) \
[...]=rgb2ind(...,dither_option)

 

十五、新增图像处理工具箱函数

adapthisteq 限制对比度直方图均衡化: J=adapthisteq(I) \
J=adapthisteq(I,param1,val1,param2,val2...)

applycform 用于颜色空间变换
out=applyform(I,C)

bwboundaries 描绘二进制图像边界

语法: B=bwboundaries(BW) \
B=bwboundaries(BW,CONN) \ B=bwboundaries(BW,CONN,options)
[BW,CONN,options] \ [BL]=bwboundaries(...) \
[BLNA]=bwboundaries()

bwtraceboundary 描述二进制图像中的物体

B=bwtraceboundary(BW,P,fstep) \
B=bwtraceboundary(BW,P,fstep,CONN) \
B=bwtraceboundary(...N,dir)


decorrstrech 对多通道图像进行去相关处理

语法:S=decorrstretch(I) \
S=decorrstretch(I,TOL)

dicomdict 获取或读取DICOM文件

语法:dicomdict('set',dictionary) \
dictionary=dicomdict('get')

getline 用鼠标选择ployline

语法:[x,y]=getline(fig) \ [x,y]=getline(ax) \
[x,y]=getline \ [x,y]=getline(...,'closed')

getpts 用鼠标选择像素点

语法:[x,y]=getpts(fig) \ [x,y]=getpts(ax) \
[x,y]=getpts

getrect 用鼠标选择矩阵


语法:rect=getrect(fig) \ rect=getrect(ax) \
rect=getrect(fig)

iccread 读取ICC剖面

语法:P=iccread(filename)

im2java2d 将图像转换为Java缓冲图像

语法:jimage=im2java2d(I) \
jimage=im2java2d(X,MAP)

imview 在图像与蓝旗中显示图像

语法:imview(I) \  imview(RGB)
\ imview(X,map) \imview(I,range) \ imview(filename) \
imview(....'InitialMagnification',initial_mag) \
h=imview(...)  imview close
all


ippl 检查IPPL的存在

语法:TF=ippl \ [TF B]=ippl

iptdemos 显示图像处理工具箱中的索引图像

lab2double、lab2unit16、lab2unit8
将L*a*b数据分别转换为双精度、16位数据、8位数据

makecform 创造一个色彩转换结构

poly2mask 把多边形区域转换成mask区域

语法:BW=poly2mask(x,y,m,n)

unitlut 查找表中A像素值

语法:B=unitlut(A,LUT)


xyz2double、xyz2unit16
将颜色数据从XYZ转换到双精度、16进制。

语法:xyzd=xyz2double(XYZ) \
xyz16=xyz2unit16(xyz)



More......

Powerful Evil Google


Share/Save/Bookmark


More......

Designed by Posicionamiento Web | Modified by Daniel