Matlab—数值计算的工具
我第一次听说 Matlab 是在 DOS 3.3 流行的时候,当时我父亲在他的 PC 上收到一个演示版本。我玩了一会儿,但很快就失去了兴趣,因为没有手册,我也没有任何实际用途。
第二次接触大约是在三年前,当时我参加了一个数值数学的讲座。学生们必须上交的一些练习题旨在使用 Matlab 解决。甚至有一份讲义描述了该程序的基本功能。但通常情况下,数值作业往往非常耗时,所以我又没有花太多时间在这上面。不久之后,我在当时的新 PC 上安装了 Linux。
第三次接触 Matlab 是在我的毕业论文期间。我所在小组的所有重要数据评估都是使用 Matlab 完成的——不是在 UNIX 上,而是在 Macintosh 上。
我询问是否可以将我那时“未联网”的 Linux 机器带到实验室并联网。我得到了一个 IP 地址,并在一个周末后,我们小组的第一台 Linux 计算机启动并运行了。
校园许可证适用于各种软件,我很高兴地发现 Linux 版本的 Mathematica、Maple 和 Matlab。不久之后,我已经在我的计算机上运行了现有的 Mac-Matlab 脚本。
Matlab 是一个命令行驱动的程序,专门用于各种类型的矩阵操作。Matlab 中的一切都使用矩阵表示;即使是标量也可以被认为是 1x1 矩阵。
Matlab 的第一个非商业版本是基于 LINPACK 和 EISPACK 例程。从那时起,发生了很大的变化,Matlab 现在是数值计算领域最快的软件包之一。
当在 xterm 中启动 Matlab 时,在单独的窗口中短暂显示徽标后,会出现一个提示符。基本的编辑是可能的,但被宠坏的 Linux 用户可能会想念 Tab 补全。(一个可以识别文件名的复杂 Tab 补全功能将非常棒。)
Matlab 的一个不错的特性是能够将数据聚类成类似于 C 语言中结构体的复合类型,但没有必要预先定义它们。只需向变量添加字段即可,例如,data.Temp 可能是进行测量时的温度,而 data.B 是一个向量,其中包含测量霍尔电阻率 data.rxy 时的磁场值。添加字符串 data.date='July-4th-1999' 也没有问题。更进一步,甚至可以使用面向对象的功能。
对于涉及两个或三个以上命令的复杂任务,可以编写脚本或函数。它们之间的区别在于,脚本的执行方式就像在命令提示符下键入一样,而函数使用带有局部变量和全局变量的私有内存,当然,也可以有多个返回值。语法大致遵循 C 语言,使得脚本编写相对简单。
甚至可以为您的 Matlab 应用程序实现图形化前端,其中包含各种不同的按钮、滑块和控制杆,如图 1 所示。
与 Windows 或 Macintosh 版本相比,Linux 版本中使用的界面极其简单。没有提供用于编写脚本的编辑器,因此用户必须坚持使用 Emacs 或其他编辑器。我个人在 Matlab 模式下使用 XEmacs 进行语法高亮显示。该模式由 Matt Wette 编写,可以在 ftp.alumni.caltech.edu/pub/mwette/matlab.el 找到。据我所知,甚至有一个用于 GNU Emacs 的模式,可以让你在 Emacs 窗口中运行 Matlab 会话。
脚本调试远不如 Windows 或 Macintosh 环境中舒适,在 Windows 或 Macintosh 环境中,编辑器窗口有用于逐步运行脚本的按钮。相反,调试必须通过在命令行上发出用于设置断点等的命令来完成。 Mathworks 可以通过添加例如一个带有“步入/步过/步出”按钮的窗口,并显示下一个命令以及提供添加断点的选项来做出重大改进。
我认为,使用 Tcl/Tk 实现这一点应该相当简单,脚本将特定命令发送到命令行。变量的检查窗口也将是一个很棒的功能,据我所知,即使在其他平台上也不存在。
单独的窗口用于显示图形。有各种各样的不同类型的绘图,从简单的条形图到带有不同光源的颜色阴影 3-D 绘图。绘图的每个方面都可以通过设置适当的变量来控制。自 5.3 版本以来,可以直接使用简单的点击界面编辑图形。
一个非常方便的功能是支持类似于 LaTeX 的文本在图形窗口中的语法。
可以将图像导出为封装的 PostScript,尽管将文件导入到例如 (La)TeX 文档中可能不会导致预期的结果,尤其是当图形中有额外的文本时。 Matlab 使用固定大小的字体,因此缩放图片可能会导致刻度标签看起来很奇怪。因此,如果有一种导出模式,其中文本和图形像在 XFig 和 Xmgr 中一样写入单独的文件,肯定会在 (La)TeX 社区找到朋友。对于出版物,我仍然导出处理后的数据并将其导入到 Xmgr 中。
图 2 显示了 GaAlAs 异质结构的二维电子气中的霍尔测量轨迹。该图是从如图 3 所示的命令获得的。
Matlab 中的平台无关紧要。从一个平台复制脚本到另一个平台时可能出现的唯一问题是 CR/LF 转换。
我们的一位同事最近在工作中遇到 Macintosh 的问题。它没有足够的内存来显示一个大型矩阵,所以她发出了命令 save,该命令将当前状态存储在文件 matlab.mat 中,将生成的文件复制到我们的 Linux 服务器,在 Linux 版本的 Matlab 下加载它,并在 Linux 上继续她的工作。
在 Linux 社区对 Mindcraft 报告一片哗然之后,我忍不住使用 Linux 和 MS Windows 98 运行了一个基准测试。命令 bench(N) 是一个 Matlab 脚本,它对来自数值数学和图形不同领域的五个不同任务进行计时。数据结构和通用数学通过求解常微分方程 (ODE) 进行测试。浮点值是 Linpack 部分 (LU) 的主要问题,稀疏矩阵混合了整数和浮点计算 (Sparse),3-D 图形测试 z 缓冲,而 2-D 图形测试线条绘制。参数 N 给出了执行测试的次数。数字越高,测试越可靠。
bench(100) 的结果显示在表 1 的前两行中。运行测试的系统是一台 133MHz Pentium,配备 32MB 内存。在所有情况下,Linux 都稍微慢一些,但在 2-D 图形方面,它更快。原因可能是 Linux 的图形驱动程序比通用的 Windows 驱动程序更好。我没有费心安装所有可能的驱动程序,因为 VMWare(参见 Brian Walters 于 1999 年 7 月发表的“VMWare 虚拟平台”)现在可用,我不再需要重启机器来读取 Excel 电子表格。我在我们的服务器上安装了这个 PC 模拟器,该服务器配备了 400MHz 处理器和 128MB 内存。为了好玩,我在模拟器中和直接在 Linux 上运行了相同的基准测试。结果列在表的其余行中。
Tobias Vançura (tvancura@solid.phys.ethz.ch) 在凯泽斯劳滕和苏黎世学习物理学,现在他在那里攻读半导体物理学博士学位。在他的小组中,他负责一个异构计算机网络,该网络主要由 Macintosh、一台 NeXT 立方体、一些运行大多数可用 Windows 版本的 PC 以及当然还有 Linux 组成。在他的业余时间,他喜欢在冬天滑雪和单板滑雪,在夏天打网球。