显示标签为“MATLAB”的博文。显示所有博文
显示标签为“MATLAB”的博文。显示所有博文

2008年9月23日星期二

Matlab compiler的几点限制

今天帮一位朋友解一个未知数比较多的方程组,用Symbolic符号工具箱来完成的。弄好了之后想用mcc打包成exe发给他,但是编译出来的exe文件死活不能运行,郁闷。忙活了半天,最后总算找到了症结所在。原来mcc不支持编译Symbolic工具箱。在MathWorks的站点上给出了mcc详细的限制条件。不一一细说。总之,教训就是:在不能找出问题根源的情况下,一定要仔细阅读文档,否则将会浪费很多时间。

The MATLAB Compiler supports the full MATLAB language and almost all MATLAB based toolboxes. However, some limited MATLAB and toolbox functionality is not licensed for compilation.
(1)Most of the prebuilt graphical user interfaces included in MATLAB and its companion toolboxes will not compile.
(2)Functionality that cannot be called directly from the command line will not compile.
(3)Some toolboxes, such as the Symbolic Math Toolbox, will not compile.
(4)The code generated by the MATLAB Compiler is not suitable for embedded applications.
To see a full list of MATLAB Compiler limitations, visit http://www.mathworks.com/products/compiler/compiler_support.html.

VC和Matlab调用问题初步研究

众所周知,Visual C++ 6.0是由Microsoft公司推出的可视化集成开发环境。它把面向对象的程序设计方法与可视化的软件开发环境完美地结合,成为众多程序员的首选。Matlab是功能非常强大的数学软件,它广泛应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域。然而,Matlab存在不可避免的缺点,一是运算速度较慢,尤其是有多重循环存在的时候更是明显;二是无法脱离Matlab环境运行,可移植性差。因此,如果能够把Matlab的程序加入到自己的Visual C++编制的程序中,将会大大减少编程的工作量、保证程序的准确性,与此同时,能够继承Visual C++良好的用户界面。下面对在Visual C++中调用Matlab程序的几种方法做简要的介绍和比较。
9 V8 S6 L, b8 \9 j, O& x9 h在Matlab与C的接口方面,目前比较常用的方法主要有以下几种:& G' h0 }$ X5 m- W7 R" _' U
1. 在C或C++程序中利用Matlab引擎(Matlab Engine)来调用Matlab的函数。9 B8 V8 d1 f1 u9 ]& {" D8 }
2. 使用Matlab的C++ Compiler(MCC),将M文件编译成CPP源代码,然后在C++编译器中调用。- u! @7 V- v' p6 g, U) B+ }
3. 利用Matlab自带的-mex命令,把Matlab程序编译成MEX文件,然后再用C++来调用。
. `4 C! j# H4 y' x1 c- N/ ?4. 在C或C++程序中使用Matlab提供的C/C++数学库(C/C++ Math Library)直接调用Matlab函数。' i6 B( C0 N# N9 g) } N
5. 用Mideva把M文件编译成CPP源代码,同时编译成EXE文件或DLL文件,生成的CPP源代码可以被C++编译器调用。( q" C/ L& d; D7 f
6. 按照Mideva的语法,在Visual C++中直接书写Matlab语句,实现Matlab和C的混合编程。
: S8 a& z9 |* Y x3 {# ?以上几种混合编程的方法各有利弊。方法1,2,3生成的程序仍然无法脱离Matlab环境,必须在已经安装了Matlab的系统上运行;而方法4,5,6生成的程序则可以独立于Matlab运行。同时,方法1,2,3,4对Matlab中大量的图形句柄函数支持不够,而方法5,6则支持绝大多数的Matlab语句(包括图形)。因此,本文的研究工作主要是采用后两种方法,实现Visual C++和Matlab的混合编程。* L) `; C. z! E' O8 Z4 ~7 B
; K/ a( @$ _ z; R
3.4.1 Mideva简介; a2 X1 r, w7 V, {+ I% N$ j; X: @
Mideva 4.5是MathTools公司在Matcom技术的基础上开发的一个功能强大的工具软件(可以在www.mathtools.com处下载得到30天的试用版)。MathTools公司开发这款软件的出发点就是为Matlab程序的编辑、调试、编译和优化提供一个完整而强大的集成开发环境。它的功能非常强大,提供了Matlab的近千个基本功能函数。Mideva最吸引人的一点就是可以通过Visual C++把Matlab的源代码编译成动态链接库(DLL)或是可执行文件(EXE),甚至可以直接转化成同等功能的CPP源代码。如果使用了Mideva提供的一些库文件,还可以直接实现和Visual C++的混合编程。这样既能够保持Matlab的优良算法,同时也利用了C++的高效率。也就是说,我们可以在Visual C++编译环境下创建友好的用户界面,而把一些较为底层的工作,如数据处理、仿真等交给Matlab来完成。 a/ k% s3 \6 O" Q8 E# @' z6 r$ V6 R
下图为Mideva 的界面:# L: l3 j/ O/ E7 v& a

, l+ L6 t; E! _! m 5 | Z2 p; P' o, Q' j) a5 K

. t% W8 E4 a- E5 x+ r4 }; P' J3.4.2 将M文件转化成CPP文件的方法6 ~/ S% n% A. ~
从以上的讨论可以看出,实现Visual C++和Matlab混合编程的关键就在于把M文件转化成CPP文件,以便在Visual C++里调用。下面就介绍两种把M文件转化成CPP文件的方法。+ |9 Y9 U7 p* s: O
3.4.2.1 在Mideva环境下将M文件转化成CPP文件的方法
/ t5 j p0 L) l4 t; W) B' X0 u在Mideva环境下将M文件转化成CPP文件的方法比较简便易行。首先,在第一次运行Mideva时,要指定所用的C编译器的路径,否则将无法编译。指定好的编译信息会写在Matcom\bin\matcom.ini文件中。在安装Matcom时,它会自动寻找编译器并将其信息写入matcom.ini文件。" N7 j& `& ~( ^9 {: L- ?, m
具体转化时,先在Mideva的Configuration菜单中选择编译方式是Debug模式(调试版)还是Release模式(发行版)(如图3-7所示),这两种模式和Visual C++中的编译版本是相对应的。7 K# Z7 x% j8 H: X8 z

5 V) w/ J. |5 R) C; B随后,选择菜单File下的Run,在弹出的对话框中选择需要转换的M文件,Mideva便会自动运行该M文件并将其转换成相应的CPP文件,运行完之后便可以在相应的Debug或是Release目录下找到和M文件同名的CPP文件。* Z9 A) l6 O/ S9 z3 e6 n
* E: U0 U/ H6 Z0 _
在Visual C++环境下将M文件转化成CPP文件的方法
! N2 Q: L7 B, ` g* A由于Visual C++环境是我们都比较熟悉的可视化集成开发环境,因此这里重点介绍如何在Visual C++环境下将M文件转化成CPP文件的方法。1 p/ {8 w9 O/ c; i5 q7 v: d
要实现这一过程,就必须用到Mideva中带有的Visual Matcom。具体步骤如下。
7 m/ N# F' _" U! y$ q第一步:在Visual C++中安装Visual Matcom。/ v$ p2 n/ Z9 g/ R
启动Visual C++,从主菜单中选择Tools/Customize选项,在弹出的对话框中选择Add-ins and Macro Files标签项,单击Browse…按钮,然后选择“文件类型”为“Add-ins(.dll)”,在C:\Matcom45\bin目录下找到mvcide.dll,单击打开,这样就会出现带有四个按钮的工具条,Visual Matcom便安装完毕。这个过程的示意图如下。" u3 c) {: n# V% R
# t) |2 N" n- n5 b4 ^$ Q
# ]2 r: I+ t. ]$ |# U2 g2 k
第二步,在Visual C++中使用Visual Matcom将M文件转化成CPP文件。
3 R9 d4 r4 a0 e- ^在Visual C++中新建一个工程,单击Visual Matcom工具条中的.m++(Add m-files to current project)按钮,在弹出的对话框中选择需要转换的M文件,则这个文件就会被加入到我们新建的工程中,同时会生成由该M文件转换得到的相同功能的CPP文件,这样,我们就可以像使用工程中的其他CPP文件一样,使用新的CPP文件中定义的函数。
8 f% c+ @' x: `# w

matlab生成独立可执行的程序

一、生成独立可执行的程序(exe文件)步骤

1、安装编译器。可有多种选择,本机安装的是microsoft visual c++ 6.0;

2、设置编译器。在matlab命令行输入mbuild -setup,选择安装的c编译器;

3、调用编译器。输入mcc -m filaname,filaname为要转成exe的m文件;

在以前的版本中,用编译命令mcc -B sglcpp filaname;自2006的版本后,替换为mcc -m filaname;

4、安装MATLAB7\toolbox\compiler\deploy\win32目录下的MCRInstaller。

二、脱离matlab运行可执行程序

MCR是由matlab的运行环境,占用不到400M的对于用不同matlab版本生成的exe文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。MCR环境的设置文件存放目录如下:

\MATLAB\R2007a\toolbox\compiler\deploy\win32

文件名为MCRInstaller.exe。可将其拷贝到自己的文件夹中。

在其它机器上运行exe文件前,首先安装matlab的运行环境。在同一机器上可以并存不同版本的matlab环境。

Note: 将MCRInstaller.exe拷贝到你文件所在文件夹里,用打包程序来打包,生成安装文件,设定在解包过程中自动执行MCRInstaller.exe,同时将可执行文件的图标放在桌面。

VC和matlab混合编程的一些经验

VC和matlab混合编程的一些经验
主要有三种方法,详细资料网上可以查到:
1. 在matlab主窗口,用mcc将m文件编译成lib、dll和c文件;
2. 用matcom将m文件编译成exe或dll文件。
3. 在VC中直接调用matlab引擎运行m文件。

区别:
(1)1和2都可以脱离matlab环境在VC中运行,3不行;
(2)1和2部分matlab函数不支持,如eval、feval等,而3基本上都支持(实际上就是打开matlab然后由matlab运行m文件)。

在MATLAB7.0中编译与发布可执行文件的详细步骤与一些问题解答

具体步骤如下:(此方法适用于MATLAB 7.0)


1.安装C编译器(前提是你的电脑已经安装了VC)


>> mbuild -setup

Please choose your compiler for building standalone MATLAB applications:


Would you like mbuild to locate installed compilers [y]/n? y


Select a compiler:

[1] Lcc C version 2.4 in D:\MATLAB7\sys\lcc

[2] Microsoft Visual C/C++ version 6.0 in D:\Microsoft Visual Studio


[0] None


Compiler: 2


Please verify your choices:


Compiler: Microsoft Visual C/C++ 6.0

Location: D:\Microsoft Visual Studio


Are these correct?([y]/n): y


Try to update options file: C:\Documents and Settings\Leki\Application Data\MathWorks\MATLAB\R14\compopts.bat

From template: D:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.bat


Done . . .



--> "D:\MATLAB7\bin\win32\mwregsvr D:\MATLAB7\bin\win32\mwcomutil.dll"


DllRegisterServer in D:\MATLAB7\bin\win32\mwcomutil.dll succeeded


--> "D:\MATLAB7\bin\win32\mwregsvr D:\MATLAB7\bin\win32\mwcommgr.dll"


DllRegisterServer in D:\MATLAB7\bin\win32\mwcommgr.dll succeeded


2.在MATLAB中,将M文件编译成exe(可执行)文件


>> mcc -m guimcc

To get started, select MATLAB Help or Demos from the Help menu.

Warning: No matching builtin function available for D:\MATLAB7\toolbox\simulink\simulink\set_param.bi

>>

上面警告的解决方法:


将 \MATLAB7\toolbox\compiler\deploy\matlabrc.m 中的

81行 set_param(0,'PaperType',defaultpaper);

82行 set_param(0,'PaperUnits',defaultunits);

注释掉之后,又重新编译了一次,没有警告信息出来了


3.将编译生成的文件发布到没有MATLAB的电脑上


先在 $MATLAB\toolbox\compiler\deploy\win32下找MCRInstaller.exe(76M左右)文件

然后在没有装MATLAB的机子上安装MCRInstaller到D:\MATLAB Component Runtime

(目录中,最好不要有空格,如用 D:\MCR 就可以了)

设置环境变量,右键点击“我的电脑”-》属性-》高级-》环境变量-》新建

变量名:Path

变量值:D:\MCR\v70\runtime\win32


然后运行exe文件,每次都是出现DOS界面后,几秒钟就自动关闭了

GUI界面一次都运行不出来,也没有错误信息提示


解决办法:

{ 因为MATLAB需要用到处理器的数学运算部分(MATLAB默认用的是INTEL的数学处理单元),故需要设置一下BLAS(Basic Linear Algebra Subroutines,就是"基础线性几何子程序"的意思)环境变量. 首先请确认你的MATLAB的文件夹中有如下文件:atlas_Athlon.dll(AMD系列的请用这个), atlas_P4.dll(P4的用这个),atlas_PIII.dll(P3的用这个),atlas_PII.dll(P2的用这个),这些是对应处理器的数值运算优化文件 }

先找到 $MATLAB7\bin\win32目录下的atlas_Athlon.dll(AMD系列CPU使用)和atlas_P4.dll(奔4用)文件,放到MCR目录中(随便),然后设置环境变量

变量名:BLAS_VERSION

变量值:D:\MCR\v70\atlas_Athlon.dll


这样设置以后,再运行exe文件就OK了。


注意事项:

编译过程中,很可能会有如下报错

>> mcc -m interface


To get started, select MATLAB Help or Demos from the Help menu.

??? Unable to locate close;contentwindow as a function on the MATLAB path

Warning: An object instance still exists.

Use the objectdirectory command to see a count of existing instances.

??? Depfun error: 'Unable to locate close;contentwindow as a function on the MATLAB path'

>>

这种情况是因为我将“close;contentwindow”语句写在按钮控件属性的“callback”里面了

{但是如果只是单个语句的话,是可行的(比如:只有contentwindow)}

此时,只要将“close;contentwindow”语句写在M文件中按钮的“callback”里,再编译就不会出错了

修复matlab7.0.x的bug的方法

修复matlab7.0.x的bug的方法
1. 打开MATLAB 7
2. 请在MATLAB command Window里执行下列Command
>> cd('c:/MATLAB7/toolbox/compiler/deploy')
>> edit matlabrc
3. 请修改Line 81~82
原为
set_param(0,'PaperType',defaultpaper);
set_param(0,'PaperUnits',defaultunits);
改成为
% set_param(0,'PaperType',defaultpaper);
% set_param(0,'PaperUnits',defaultunits);
4. 请在MATLAB command Window里执行下列Command
>> rehash toolboxcache
5. 重新启动MATLAB

matlab编译问题

我是在7.1下生成的exe文件,能在未安装MATLAB的机器上成功运行,你可以参考


将M文件编译为独立可执行文件的语法是:

>>mcc –m fun1.m fun2.m…..

其中fun1就是最后的可执行文件的名称。

另外,也可通过采用命令开关-o指定编译最终目标文件的名称,如 mcc –m main.m –o mrank_main,就是将编译后的文件指定为mrank_main.exe。

编译后的生成文件根据编译器的版本不同而不同。具体的可参阅相关资料。

如果要在没有安装matlab的计算机上执行编译后的程序,首先要将\MATLAB701\toolbox\compiler\deploy\win32中的MCRinstaller.exe安装到该计算机上(7.0以前的版本是mglinstaller.exe)。

其次是要将“MCRinstaller.exe安装目录\runtime\win32”这个路径添加到该计算机的环境变量中,添加的方法是:

右击“我的电脑”“属性”“高级”“环境变量”“添加”指定一个变量名,然后将上述路径复制到里面就可以了。

第三步是将编译生成的相相关文件拷贝到同一目录下(当然其他目录亦可)。

第四步是打开MS-dos操作窗口,进入到编译后的*.exe程序所在的目录,执行编译生成的*.exe文件即可。

在VB5.0中使用和操作MATLAB

  摘 要 本文介绍在VB5.0中利用ActiveX自动化技术使用和操作MATLAB的方法。它以VB作为自动化控制器。MATLAB作为自动化服务器,在使用VB进行Windows编程中,充分发挥MATLAB在系统分析。仿真等方面的优势。
  关键词 Visual Basic MATLAB ActiveX自动化

一、前言

  MATLAB自1984年由美国MathWorks公司推向市场以来,已成为国际公认的最优秀的科技应用 软件。它具有强大的数值、符号计算,离线和在线计算,矩阵计算能力,计算结果和编程可 视化,界面友好,语言自然,是功能强大的计算辅助解决具体工程问题的标准软件。
  Microsoft公司推出的Visual Basic(简称VB)是目前被广泛使用的,开发应用程序的可视化 开发工具。由于它功能强大,易学易用,越来越多的人将它作为开发Windows应用程序的工具。
  本文介绍在VB中使用MATLAB的方法,尽可能发挥其各自的优势,而且编程简单。

二、基本原理

  MATLAB也是支持ActiveX自动化技术的软件,能够被任何可作为ActiveX利制程序的Microsof t Programs所控制,包括Excel Access,Visual Basic,VisualC++.利用这一特性,用户可以 非常方便地在自已的程序中使用MATLAB,包括执行MATLAB命令,使用其功能丰富的工具箱(T oolbox),向MATLAB输入数据,获取结果(数据,图形)。这样既能用VB编出漂亮的Windows程 序,又能同时获得MATLAB在工程辅助设计,仿真等方面的功能。

三、ActiveX自动化

  ActiveX自动化是ActiveX的一个协议,它允许应有用程序或组件控制另一个应用程序或组件 的运行。它包括自动化服务器和自动化控制器。
  MATLAB可以认为是自动化服务器,可以由其它应用程序编程驱动,自动化服务器定义的特定 的类,而类的实例即自动化对象。MATLAB提供了一个自动化对象,其外部名称是Matlab,App lication。它支持COM技术。其它程序通过COM技术提供的函数得到自动化对象支持的接口指 针,通过调用接口函数便可控制和使用自动化对象了。
  这里采用VB5.0作为自动化控制器,控制和使用自动化对象(MATLAB),并通过编程可以生成 ,使用和消除自动化控制器。

四、创建和获取ActiveX自动化对象的过程

  1.在控制器中创建和获取自动化对象的一般过程
  1)初始化并创建一个自动化对象:创建后,可以在代码中使用对象变量引用的对象。
  2)操作方法和属性;获取对象方法和信息,激活属性和方法。
  3)完成代码编写后释放对象。
  2.程序实现
  VB能通过不同的方式实现对自动化对象的使用和操作。要创建一个ActiveX对象,只需将Cre atObject函数返回的对象(引用值)赋给一个对象变量。在声明对象变量时使用As Object子 句,可创建一个能包含任何类型的变量。不过,经变量访问的对象是后期绑定的,即绑定在 程序运行时执行。这就是所谓后期绑定技术。
  1)声明一个对象变量,然后创建并返回一个对ActiveX对象的引用。
  Dim ObjectVar As Object
  Set ObiectVar=CreatObject(ProgID)
  其中,ProgID即类型库信息的字符串标识,就是前述的外部名称(Matlab,Applicarion),形 式为Appname,ObjectName,含义是


参数 描述
Appname 必要,为Variant(String)类型,用于提供对象的服务 器应用程序
ObjectName 必要,为Variant(String)类型,用于指定创建的对象类成员

 2)操作对象,一旦得到对一个ActiveX对象引用的变量,就可以对此变量进行操作,如同对V B中其它对象的操作(即获取,设置,方法和属性)一样,语法是ObjectVar,Property,Object Var,Method.  3)释放对象,操作完成后,用自动化对象提供的Close或Quit函数来结束并释放对象。
五、对MATLAB对象的操作

  下面是MATLAB对象的一些属性和方法,了解后就能自如地对它进行编程操作 。
  1.BSTR Execute([in]BSTR Command)
  此函数以命令字符串为MATLAB参数,将其运行结果以字符串返回。所有在MATLAB命令窗口键 入的可执行的命令行都可在此使用,这样,我们就能在代码中使用命令行,象在MATLAB窗口 中一样自如。
  2.VOID GetFullMatix([in]BSTR Name,[in]BSTR Workspace,
  [in out]SAFEARRAY(double)*Pr,
  [in out]SAFEARRAY(double)*pi)
  该函数从指定的MATLAB工作空间中获取一维或二维数组。其中,Name是提取数组的名称,Wo rk space表示包含数组的工作空间,一般指定为“base”,即MATLAB默认工作空间。Pr和Pi分 别是包含所提取数组的实部和虚部。
  3.VOID GetFullMatrix([in]BSTR Name,[in]BSTR Workspace,
  [in out]SAFEARRAY(double)*pr
  [in out]SAFEAPRAY(double).pi)
  该函数向指定的MATLAB工作空间中设置一维或二维数组。其中,Name是设置输入数组的名称 ,其它同前。
  4.VOID MinimizeConnandWindow()
  该函数将未最小化的MATLAB窗口最小化。
  5.VOID MaximizeConnandWindow()
  该函数将未最大化的MATLAB窗口最大化。
  6.VOID Quit()
  该函数关闭并退出MATLAB。

六、应用举例

  由于MATLAB拥有许多工具箱(Toobox),在自动控制,系统边式,信号处理,系统优化等方面 功能强大,下面是使用MATLAB的控制系统工具箱对某工业系统典型二阶环节进行阶跃响应信仿真的例子,在VB中得到仿真曲线。
  在主窗体(Forml)中,设置两个命令按钮,分别是开始按扭Commandl和结束按钮Command2,安 置在窗体的左侧。窗体右侧加入一个Image控件,用于容纳MATLAB中产生的图象,特别地, 建议把Image控件的Strench属性设为False,则Image控件自动调整为被加载图象的大小。
  为在VB中获得MATLAB中产生的图象,这里采用的方法是利用系统剪贴板Clipboard作为“中 转站”,先将MATLAB中的图象以bitmap文件格式存入系统剪贴板Clipboard,然后。在VB中将 图象从剪贴板读取,用Clipboard Getdata()函数。以下是主要程序代码,已经通过VB5.0 调试。
  Private Sub Commandl-Click()
  Dim Matlab As Obyect
  Dim result As String
  Set Matlab=CreateObject("Matlab,application")
  输入系统的传递函数
  result=Matlab,execute("wn=143;ipsol=0.6")
  result=Matlab,execute("num=[wn^2]")
  result=Matlab,execute("den=[12*ipsol*wn wn^2]")
  进行阶跃响应仿真,画阶跃响应曲线
  result=Matlab execute("t=0;0,002;015")
  result=Matlab execute("[y,x]=step(num,den,t)")
  result=Matlab execute("plot(t.y),grid,xlabel(Time(see s)') ylabel('Amplitude)")
  求取并显示超调量
  result=Matlab execute("peak=max(y)-1;peak1=[peak,3]")
  result=Matlab execute("chrl=[超调量peak=,num2str(peak*100)%']")
  result=Matlab execute("text(o.04,1.25,chrl)")
  传递和获取曲线图象
  retult=Matlab,execute("print-bditmap;delete(gct)")
  Image1 Picture=Clipboard GetData()
  Call Matlab quit
  End Sub

七、结束语

  因篇幅所限,这里只举了一个最简单的例子,但我们仍然能体会到在VB中使用和操作 MATLA B所带来的便捷和强大的功能。这种多种语言混合编程,能相互取和补短,提高了软件的整 体性能,又节约了宝贵的开发时间和精力。

肖志权(北京科技大学机械工程学院机电研究所,讲师,硕士,北京,100083)

参考文献

[1]张志涌等,掌握和精通MATLAB,北京航空航天出版社,1998
[2]李罡,Visual Basic5.0中文版编程例实例实祥解,电子工业出版社,1998
[3]Loren D Eidahl等著,骆丽等译,金版Visual Basic5.0电子工业出版社,1999

2008年9月22日星期一

matlab 6.x版前言

1.MATLAB的发展历程和影响
MATLAB名字由MATrix和 LABoratory 两词的前三个字母组合而成。那是20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。
经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。从这时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。
MATLAB以商品形式出现后的短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包纷纷淘汰,而改在MATLAB平台上重建。在时间进入20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。到九十年代初期,在国际上30几个数学类科技应用软件中,MATLAB在数值计算方面独占鳌头,而Mathematica和Maple则分居符号计算软件的前两名。Mathcad因其提供计算、图形、文字处理的统一环境而深受中学生欢迎。
MathWorks公司于1993年推出了基于Windows平台的MATLAB4.0。4.x版在继承和发展其原有的数值计算和图形可视能力的同时,出现了以下几个重要变化:(1)推出了SIMULINK,一个交互式操作的动态系统建模、仿真、分析集成环境。(2)推出了符号计算工具包。一个以Maple为“引擎”的Symbolic Math Toolbox 1.0。此举结束了国际上数值计算、符号计算孰优孰劣的长期争论,促成了两种计算的互补发展新时代。(3)构作了Notebook 。MathWorks公司瞄准应用范围最广的Word ,运用DDE和OLE,实现了MATLAB与Word的无缝连接,从而为专业科技工作者创造了融科学计算、图形可视、文字处理于一体的高水准环境。从1997年春的5.0版起,后历经5.1、5.2、5.3、6.0、6.1等多个版本的不断改进,MATLAB“面向对象”的特点愈加突出,数据类型愈加丰富,操作界面愈加友善。2002年初夏所推6.5版的最大特点是:该版本采用了JIT加速器,从而使MATLAB朝运算速度与C程序相比肩的方向前进了一大步。
假如说,在上世纪九十年代,新、老一代教科书的区别性标志是“教材是否包含MATLAB内容”,那末进入二十一世纪后,MATLAB对教材的影响又以崭新的形式出现:新教材正在更彻底地摒弃那些手工计算、计算尺计算、手摇或电动计算机、电子模拟计算机时代建立的“老的但久被当作经典的”表述、分析和计算方法;而逐步地建立以现代计算工具(包括软硬件)为平台的新的表述、分析和计算方法,其中包括采用交互式图形用户界面去完成各种表述、分析和计算目的。
2.本书沿革
 1992年编写并印刷《科技编程语言KINDTOOL》讲义,约20万字。KINDTOOL由DOS环境下的MATLAB3.0经汉化而得。
 1997年写成《掌握和精通MATLAB》,约51万字;该书全面介绍了Windows平台上的MATLAB4.2c。该书由北京航空航天大学出版社于1997年8月公开发行,前后印刷5次,共发行17000册。
 2000年写成《精通MATLAB5.3》,约90万字。该书全面详尽、层次丰满;它阐述了MATLAB5.3版的几乎全部通用功能。该书附带光盘,大大扩展了该书的实用价值。该书由北京航空航天大学出版社于2000年8月公开发行,前后印刷3次,共发行9000册。
 2001年4月,又以MATLAB6.0为基础,编写出版了《MATLAB教程》,约53万字;该书是为满足教材使用和简明自学需要而编写的。其特点是:全面完整而精练简明;系统流畅又配备自测习题;内容稳定又及时适应MATLAB最新版本。2002年2月再次印刷时,该书已在MATLAB6.1基础上加以修订。该书至今发行10000册。
 2002年12月,以MATLAB6.5为基础出版本书。
2.本书的编写宗旨
 全面反映MATLAB最新版本的通用功能,淡化学科性强的专用功能;
 着力描绘各指令间的协调配合,少费笔墨于指令用法的笼统解释;
 寓教于例,由浅入深;既讲机理,又讲程式规则;
 关于科学计算,着重强调理论概念、教材算法和实际计算三者间的关系,着重强调现代计算工具(软、硬件)对传统计算、设计方法的影响和冲击;
 诚实面对读者,所有算例都经反复运作验证,而决非转抄潦草之作;
 为方便读者学习、使用,随书光盘包含了全书的所有算例文件,可在MATLAB或Notebook环境中直接运行。
以上编写宗旨是作者多年写作养成的传统和风格。作者因此得到广大读者的有力支持和赞誉。特别是随书光盘给读者带去的彩色和可靠易用的程序更受欢迎。
3.全书结构、梗概及新增内容
(1)全书的结构和功用
全书由“前言”、“目录”、“正文”、“附录”、“参考文献”和“随书光盘”组成。
 “目录”
目录由四级标题构成。通过目录,读者可以清晰地看到正文内容的完整框架,方便地查到所需内容的位置。
 “正文”
全书共分十三章,包含算例390多个。章节内容是遵循“由浅入深”、“相对独立”和“算例引导”原则安排的。从全书看,概念相对简单的篇章安排在前;每章中,操作比较容易的节次安排在前。新版算例算例“深浅”层次远比前版丰富。每章的入门或前一、二节的简单算例,总可以让读者轻松地学会MATLAB的各种功能的初步使用,不管读者原先用过MATLAB与否。而配置在各章中的综合算例,将向读者展示MATLAB解决复杂问题的可能途径,引导读者向纵深发展。正文内容的安排既考虑了系统讲授的需要,又考虑了不同水平读者自学和查阅的需要。
新、旧版的章节区别:(1)旧版第一章“概论”被整章删除,其内容被大幅删简后融在前言中。(2)本书第十二章“应用程序接口API”是根据MATLAB6.5新写的。(3)本书其余各章的名称与旧版相对应,但其内容都以6.5为基础进行了修改和增补。
 附录A “索引”
它汇集了本书涉及的所有MATLAB标点符号、函数指令、SIMULINK库模块、图形对象属性、以及用于API的各种指令。它们(除标点符号外)根据英文字母的次序罗列。每个英文指令(或符号、属性、模块)后,罗列着那指令以不同方式被介绍、使用的具体节次。这“索引”主要用做英文关键词查阅。
 附录B “光盘使用说明”
它详细介绍光盘文件的种类、工作环境和使用方法。
 “参考文献”
列出了本书成文的文献基础。读者如有疑惑或想寻根求源,这部分资料十分有用。
 “随书光盘”
盘上存放着约700多个文件。它们提供了印刷版对应算例运行的几乎所有文件。
(2)正文概要
 “第1章基础准备及入门”专门介绍最常用的交互界面:通用指令窗、历史指令窗、当前目录浏览器、工作空间浏览器、内存数组编辑器、交互界面分类目录窗、M文件编辑/调试器、及帮助导航/浏览器。
本章内容与旧版完全不同。这是因为6.5版向用户提供前所未有的、成系列的交互式工作界面。了解、熟悉和掌握这些交互界面的基本功能和操作方法,将使新老用户能事半功倍地利用MATLAB去完成各种学习和研究。
 “第2章数值数组及其运算”集中叙述一维、二维、任意高维双精度数值数组的生成和操作。这是MATLAB最常用最基本又最传统的数据类型,定义在此类“对象”上的“方法”就是最具魅力的数组运算。本章所涉内容和方法,不仅使用于数值数组,而且也将延伸使用于在其他数据结构中。
MATLAB6.5运用新的逻辑数据类型,大大扩充了逻辑运算指令。
 “第3章字符串、元胞和构架数组”系统阐明这些数据类型的基本性质、用法要旨。本书作者提醒读者不要小视这第3章。原因之一是“构成MATLAB指令的M文件”中就大量使用这些数据类型。只有理解这些数据类型才能真正灵活运用MATLAB指令,尤其是那些泛函指令、图形对象、图形用户界面的各种控件等。
应该指出:MATLAB6.5的数据类型有较大变化。本书反映了这种变化。
 “第4章数值计算”的篇幅在本书所有章节中最长,因为正是这顶级水准的数值计算使MATLAB立身于世界、称雄于天下。本章对数学问题的描述遵循“最低限度自封闭”原则,即以最简明的方式阐述理论数学、数值数学和MATLAB计算指令间的内在联系和差别。比如在讨论线性方程解时,本书总是先回顾性地列出若干常见的“教科书解法”,并指出这些理论算法在实际应用中的缺陷,然后在简述数值计算原理的基础上给出精良的MATLAB计算指令。
对于第4章涉及较宽知识的地方,本书都配置了综合性算例。跟随着解题步骤,读者不难掌握MATLAB所提供的相关解题指令和工具。但本书作者在此提醒:本章部分内容的知识跨度可能较大,读者不必企求一口气读完或读懂本章的所有内容。
随着MATLAB从5.3升级到6.5版,本章内容有三个重要变化:(A)由于MATLAB数值计算基础软件库变化,导致许多数值计算结果在前后版本不同;(B)泛函指令对函数的操作借助新引进的“函数句柄”实施;(C)新增了微分方程边值问题求解的内容。
 “第5章符号计算”内容受MATLAB版本升级影响较小,但也有细微变化。这种内容变化反映在第5.4.1节。符号计算与理论数学的演绎过程相似,读者很容易掌握。本章内容包括:各种代数方程、微分方程的求解,解析微积分的求取,Fourier、Laplace变换的封闭表达式,任意精度的数值解等。
 “第6章数据和函数可视化”围绕数据成图机理、绘图要旨和修饰技法系统介绍“高层”绘图指令和交互操作工具。作者是通过60来个算例向读者展示的。
MATLAB从5.x向6.5版本升级后,旧版中的本章全部内容几乎可以不加修改地用于6.5版。但为适应升级,新版作了如下改变:(A)新增了控制图形对象“面”、“块”、“象”透明属性的内容,进一步增强了图形感染力。(B)新增了关于unit8, unit16数据类型进行图像数据存储的内容;(C)对MATLAB升级后图形窗界面的编辑功能进行了新的全面阐述。
 “第7章M文件和面向对象编程”的内容在理解MATLAB自身和应用MATLAB两方面都有十分重要的作用。本章只用很少篇幅对MATLAB传统控制流进行简述,而大量的篇幅用于阐述新功能:较特殊的控制流;变长度输入输出宗量;跨空间运作的串演算指令和赋值指令;内联函数、子函数、私有函数和P伪码文件;M文件编辑调试器;程序运行性能剖析器;面向对象编程技术。
本章新版最主要的变化是:增加了关于函数句柄如何创建和如何使用的内容;根据MATLAB6.5重写了程序运行剖析器;采用算例展示了6.5版特具的JIT加速器的作用。
 “第8章SIMULINK交互式仿真集成环境”系统介绍建模和分析方法,特别着重于阐述:模型处理向量信号的能力;借助简装和精装子系统进行的“分层”建模方法;复杂系统建模中不可缺少的逻辑关系运算和“使能”、“触发”技术;SIMULINK与MATLAB的协调运作。
本章内容新旧版的变化主要表现在三方面:(A)由于伴随MATLAB的SIMULINK全面升级,SIMULINK的库界面和内容发生较大的变化,所以本章旧版的内容已在MATLAB6.5基础上全面更新;(B)涉及“条件执行子系统”的内容被全部更新;(C)为适应读者应用水平的提高,新增了第8.8节,专门论述S函数模块的创建和使用。
 “第9章句柄图形”讲述图、轴、线、面、方、块、象、字、光等九种基本图形对象。与第6章的高层指令相比,本章的内容深入MATLAB可视化功能的内核。本章目的:一,使读者更深入理解高层绘图指令,从而绘制出更精细更生动更个性的图形;二,使读者能利用低层图形指令和图形对象属性开发专用绘图函数。
本章新旧版之间没有实质性的变化,但新版已在MATLAB6.5基础上进行了若干微小的更新。
 “第10章图形用户界面GUI制作”专门讲述用户菜单、用户控件和图形用户界面的制作。本章内容不仅为制作满足“演示需要”的界面,而更重要的是:为制作“科学分析和综合研究需要”的交互界面。
本章新版完全重写了有关MATLAB提供的“界面设计工作台”的内容。因为,MATLAB6.5版的设计工作台与5.3版完全不同。
 “第11章MATLAB编译器”详细叙述:如何由M文件生成运行得较快的MEX文件;如何由M文件生成能脱离MATLAB环境运行的EXE程序。该章内容对从事应用开发的读者有一定的帮助。
由于MATLAB6.5版采用的编译器已从原先过渡性的2.0 全面升级为3.0,所以本章内容已在Compiler3.0基础上全部重写。
 “第12章应用程序接口API”是为适应读者应用MATLAB水平的提高而新增的一章。它包括:(A)如何把已有的优秀C程序改造成可在MATLAB中方便调用的指令;(B)如何借助MAT文件实现MATLAB与外部应用程序的数据交换;(C)如何在各种其他应用程序中利用MATLAB引擎技术;(D)如何应用ActiveX实现MATLAB与外部应用程序的通信;(E)如何借助DDE技术在MATLAB与其他外部程序间进行通信。
该章完全而且值得指出:MATLAB6.0, 6.1版用于API的(MEX、MAT、及引擎)库函数许多已经被废止。本章内容是根据MATLAB6.5编写的。
 “第13章Notebook”系统地叙述Notebook的安装、启动、和使用;最后一节则专门讲述,如何通过MATLAB、Notebook、PowerPoint三者之间的协调链接来制作科技演讲稿。该章内容对需要撰写科技论文、“电子版”科技著作、多媒体科技演讲稿的读者十分有用。
本章新版内容与旧版大致相同,但有些变化:(A)关于Notebook的安装是针对变化了软件环境重写的。(B)新增一节,专门介绍具有现场计算能力的幻灯片的制作。
(3)本书新版与旧版的主要差别
 本书全部算例的计算结果已在MATLAB6.5上更新。这是因为矩阵和特征值计算指令不再以LINPACK和EISPACK库为基础,而建筑在计算速度更快、运行更可靠的LAPACK和ARPACK程序库的新基础上。
基础软件库变化所产生的影响明显地表现在矩阵分解、特征向量、奇异向量等的计算结果不同上,也影响到隐性使用LAPACK和ARPACK的那些指令(如矩阵对数指令等)的计算结果。本书新版可保证读者在MATLAB6.5环境下完全重现本书算例结果。
 新版紧随MATLAB升级,(A)增加了一节“求解微分方程边值问题”的内容;(B)介绍了新的积分指令quadl和triplequad ;(C)增添了一节如何对图形进行透明度控制的内容;(D)用一节篇幅全面阐述新数据类型“函数句柄”的创建和使用;(E)完全重写了MATLAB编译器那章的内容;(F)完全重写了程序性能剖析器,并展示了6.5版的JIT加速功能。
 MATLAB升级使其所有交互界面都发生了较大变化,因此本书新版相应章节也作了如下变动:(A)“第一章基础准备及入门”是完全新写的;(B)关于“图形窗编辑功能”那节的内容是新写的;(C)关于“SIMULINK模块库和模型窗界面”的内容是重写;(D)关于“GUI设计工作界面”的内容是完全新写的。
 为适应读者对MATLAB理解和应用水平的提高,新版有如下变化:(A)新添一节关于“uint8, unit16数据类型在图像存储中应用”的内容;(B)新写一节关于“S函数在SIMULINK中应用”的内容;(C)新增一章关于“应用程序接口API”的内容;(D)在Notebook那章中新增一节,专门介绍在放映过程具有计算能力的幻灯片的制作。
 附录进行了内容的增补和更新。
4.本书的读者对象和使用建议
MATLAB自身性质决定了本书的主要读者对象是:需要数学计算、数学函数或计算结果可视的各类大学生、研究生、教师、研究人员和科技工作者。
本书内容的自封闭性、390多个算例和完善的检索系统和随书光盘,使本书既能用做教材或自学用书,又能当作实践MATLAB的软件环境。本书内容不仅可作为MATLAB使用方法的参考手册,而且也可当作科学计算方法的选用参考。
MATLAB自身的很强综合性决定了本书有较大的知识跨度。书中有的章节涉及较深的数学,有的则涉及较多C或其他软件的知识;有的章节要求对微分方程有较好的理解,有的则需要对计算机色彩系统有较好的认识。作者在编写本书时,充分考虑了MATLAB的这种特点,也考虑了多方面读者的不同层次需要,在书中所有需要高层次知识的地方配置了相对简单的引导性算例。这样处理后,不管读者原来的知识背景如何,他们只要循着算例所给指令进行操作,就至少能直观地感受到那些指令的运作结果。假如再认真地阅读指令后的注解说明,他们就能举一反三,更好地掌握利用MATLAB解决那类问题的技法。
当本书用做自学材料时,建议读者先从比较简单的内容开始。这部分内容一般被安排在每章的前一、二节。本书作者还建议自学者特别注意对书中所给算例的实践,注意通过算例去感悟一般规则。
当本书用做本科生教材时,应注意避开那些涉及较深数学的节次,如第5章中的奇异值分解、多项式拟合和非线性最小二乘、插值等内容。此外,由于第8、9、10、11、12章的应用场合比较专业,所以一般也不必列为本科教学内容。
当本书被用做研究生教学参考书时,应根据不同学科研究生的知识背景对本书内容作一定的取舍。
当本书被当作参考手册使用时,分类检索可从书前“目录”进行,而指令、模块、属性等关键词检索则应从书后“索引”着手。书中的大量应用实例与MATLAB自身帮助文件有很强的互补性。
5.随书的光盘文件
引入光盘的指导思想是:营造一个与印刷版对应的软件环境,使读者能从“可直接运作的”不同形式的光盘文件中,更快更好地掌握和理解MATLAB。
光盘装载着容量约70M,各类文件约700多个。这些文件可引出Notebook环境;可引出交互界面;可引出SIMULINK模型、运行界面;可引出编译环境、产生独立应用程序;可引出把幻灯放映、Word文字处理、MATLAB计算结合在一起的综合环境。
引入光盘解决了印刷版的如下几个问题:(1)印刷版很难(甚至无法)表述MATLAB不断升级后的“交互”能力。(2)印刷版很难以低价格表现文件或计算结果中的“色彩”信息。(3)印刷版很难提供完整的SIMULINK模型文件。(4)印刷版无法提供由编译而得的MEX文件和能独立运行的EXE文件。(5)印刷版很难提供API中的很多其他应用程序的文件。
此外,光盘提供的文件可作为读者练习时的参照物,便于读者找出自己编写指令或文件运行失败的原因。
本随书光盘内容曾被个别书籍大量复制剽窃。这类事情的发生给作者带来很大伤害。但作者在权衡光盘的利弊后,坚持原宗旨不变:为方便读者,继续携带随书光盘。望得到广大读者的支持和配合。
6.本书作者的期望
MATLAB本身是一个藏量极为丰富的资源库。因此,对大多数用户个体来说,一定有部分MATLAB内容看起来是“透明”的,即用户能明白其全部细节;另有些内容表现为“灰色”,即用户虽明白其机理但不懂具体的执行细节;还有些内容则“全黑”,即用户对它们完全无知。本书虽仅涉及MATLAB整体的很小一角,但就是这部分内容就已经构成了对本书作者的严重挑战。
本书新版初稿于2001年夏,后几易书搞。作者在写稿过程中遇到过不少困惑,通过再学习和向专家请教虽克服了它们的障碍,但仍难免错误和偏见。本书所有算例虽经多人在不同PC机上独立运作验证,但仍不敢说百分之百的正确。在此,本书作者肯切期望得到各方面专家和广大读者的指教。作者的电子信箱地址是:zyzh@njupt.edu.cn 。
7.致谢
本书结稿的此时此刻,我首先要感谢的是杨祖樱教授,她以妻子和前版作者的双重身份给予我永恒的支持,是她随时向我提供不同的认知和意见,分担写作中的甘苦。
在本书写作中,我前后几届研究生徐彦琴、曹嵩、汪方盛、凌云、李昌、王俊等都做出很大的贡献。其中徐彦琴、汪方盛的作用尤为突出。他们为本书设计了许多独具匠心的例题,不嫌其烦对全书算例进行运算验证,逐字逐句地对全书内容进行校对。我深深感谢他们为本书所做的一切。
最后要感谢北京航空航天出版社。感谢该社为本书前版所做的一切,感谢该社对作者重写新版所给予的鼓励,感谢该社对作者的理解和支持。




作 者
2002年12月于南京

2008年9月19日星期五

MATLAB教程

MATLAB简介
WWW.MATLAB.NET.CN
1. MATLAB的概况
  MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。
  MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多.
 当前流行的MATLAB 5.3/Simulink 3.0包括拥有数百个内部函数的主包和三十几种工具包(Toolbox).工具包又可以分为功能性工具包和学科工具包.功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类.
 开放性使MATLAB广受用户欢迎.除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包.
2. MATLAB产生的历史背景
 在70年代中期,Cleve Moler博士和其同事在美国国家科学基金的资助下开发了调用EISPACK和LINPACK的FORTRAN子程序库.EISPACK是特征值求解的FOETRAN程序库,LINPACK是解线性方程的程序库.在当时,这两个程序库代表矩阵运算的最高水平.
 到70年代后期,身为美国New Mexico大学计算机系系主任的Cleve Moler,在给学生讲授线性代数课程时,想教学生使用EISPACK和LINPACK程序库,但他发现学生用FORTRAN编写接口程序很费时间,于是他开始自己动手,利用业余时间为学生编写EISPACK和LINPACK的接口程序.Cleve Moler给这个接口程序取名为MATLAB,该名为矩阵(matrix)和实验室(labotatory)两个英文单词的前三个字母的组合.在以后的数年里,MATLAB在多所大学里作为教学辅助软件使用,并作为面向大众的免费软件广为流传.
 1983年春天,Cleve Moler到Standford大学讲学,MATLAB深深地吸引了工程师John Little.John Little敏锐地觉察到MATLAB在工程领域的广阔前景.同年,他和Cleve Moler,Steve Bangert一起,用C语言开发了第二代专业版.这一代的MATLAB语言同时具备了数值计算和数据图示化的功能.
 1984年,Cleve Moler和John Little成立了Math Works公司,正式把MATLAB推向市场,并继续进行MATLAB的研究和开发.
 在当今30多个数学类科技应用软件中,就软件数学处理的原始内核而言,可分为两大类.一类是数值计算型软件,如MATLAB,Xmath,Gauss等,这类软件长于数值计算,对处理大批数据效率高;另一类是数学分析型软件,Mathematica,Maple等,这类软件以符号计算见长,能给出解析解和任意精确解,其缺点是处理大量数据时效率较低.MathWorks公司顺应多功能需求之潮流,在其卓越数值计算和图示能力的基础上,又率先在专业水平上开拓了其符号计算,文字处理,可视化建模和实时控制能力,开发了适合多学科,多部门要求的新一代科技应用软件MATLAB.经过多年的国际竞争,MATLAB以经占据了数值软件市场的主导地位.
 在MATLAB进入市场前,国际上的许多软件包都是直接以FORTRANC语言等编程语言开发的。这种软件的缺点是使用面窄,接口简陋,程序结构不开放以及没有标准的基库,很难适应各学科的最新发展,因而很难推广。MATLAB的出现,为各国科学家开发学科软件提供了新的基础。在MATLAB问世不久的80年代中期,原先控制领域里的一些软件包纷纷被淘汰或在MATLAB上重建。
 MathWorks公司1993年推出了MATLAB 4。0版,1995年推出4。2C版(for win3。X)1997年推出5。0版。1999年推出5。3版。MATLAB 5。X较MATLAB 4。X无论是界面还是内容都有长足的进展,其帮助信息采用超文本格式和PDF格式,在Netscape 3。0或IE 4。0及以上版本,Acrobat Reader中可以方便地浏览。
 时至今日,经过MathWorks公司的不断完善,MATLAB已经发展成为适合多学科,多种工作平台的功能强大大大型软件。在国外,MATLAB已经经受了多年考验。在欧美等高校,MATLAB已经成为线性代数,自动控制理论,数理统计,数字信号处理,时间序列分析,动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生,硕士生,博士生必须掌握的基本技能。在设计研究单位和工业部门,MATLAB被广泛用于科学研究和解决各种具体问题。在国内,特别是工程界,MATLAB一定会盛行起来。可以说,无论你从事工程方面的哪个学科,都能在MATLAB里找到合适的功能。
2.MATLAB的语言特点
 一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有着不同于其他语言的特点,正如同FORTRAN和C等高级语言使人们摆脱了需要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的MATLAB,利用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来。MATLAB最突出的特点就是简洁。MATLAB用更直观的,符合人们思维习惯的代码,代替了C和 FORTRAN语言的冗长代码。MATLAB给用户带来的是最直观,最简洁的程序开发环境。以下简单介绍一下MATLAB的主要特点。
1)。语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB程序书写形式自由,利用起丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。可以说,用MATLAB进行科技开发是站在专家的肩膀上。
 具有FORTRAN和C等高级语言知识的读者可能已经注意到,如果用FORTRAN或C语言去编写程序,尤其当涉及矩阵运算和画图时,编程会很麻烦。例如,如果用户想求解一个线性代数方程,就得编写一个程序块读入数据,然后再使用一种求解线性方程的算法(例如追赶法)编写一个程序块来求解方程,最后再输出计算结果。在求解过程中,最麻烦的要算第二部分。解线性方程的麻烦在于要对矩阵的元素作循环,选择稳定的算法以及代码的调试动不容易。即使有部分源代码,用户也会感到麻烦,且不能保证运算的稳定性。解线性方程的程序用FORTRAN和C这样的高级语言编写,至少需要四百多行,调试这种几百行的计算程序可以说很困难。以下用MATLAB编写以上两个小程序的具体过程。
MATLAB求解下列方程,并求解矩阵A的特征值。
Ax=b,其中:
A= 32 13 45 67
23 79 85 12
43 23 54 65
98 34 71 35
b= 1
2
3
4
解为:x=A\b;设A的特征值组成的向量e,e=eig(A)。
 可见,MATLAB的程序极其简短。更为难能可贵的是,MATLAB甚至具有一定的智能水平,比如上面的解方程,MATLAB会根据矩阵的特性选择方程的求解方法,所以用户根本不用怀疑MATLAB的准确性。
2)运算符丰富。由于MATLAB是用C语言编写的,MATLAB提供了和C语言几乎一样多的运算符,灵活使用MATLAB的运算符将使程序变得极为简短。
3)MATLAB既具有结构化的控制语句(如for循环,while循环,break语句和if语句),又有面向对象编程的特性。
4)程序限制不严格,程序设计自由度大。例如,在MATLAB里,用户无需对矩阵预定义就可使用。
5)程序的可移植性很好,基本上不做修改就可以在各种型号的计算机和操作系统上运行。
6)MATLAB的图形功能强大。在FORTRAN和C语言里,绘图都很不容易,但在MATLAB里,数据的可视化非常简单。MATLAB还具有较强的编辑图形界面的能力。
7)MATLAB的缺点是,它和其他高级程序相比,程序的执行速度较慢。由于MATLAB的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,所以速度较慢。
8)功能强大的工具箱是MATLAB的另一特色。MATLAB包含两个部分:核心部分和各种可选的工具箱。核心部分中有数百个核心内部函数。其工具箱又分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能,图示建模仿真功能,文字处理功能以及与硬件实时交互功能。功能性工具箱用于多种学科。而学科性工具箱是专业性比较强的,如control,toolbox,signl proceessing toolbox,commumnication toolbox等。这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序,而直接进行高,精,尖的研究。
9)源程序的开放性。开放性也许是MATLAB最受人们欢迎的特点。除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。
MATLAB入门教程
1.MATLAB的基本知识
1-1、基本运算与函数
在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如:
>> (5*2+1.3-0.8)*10/25
ans =4.2000
MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。
小提示: ">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。
我们也可将上述运算式的结果设定给另一个变数x:
x = (5*2+1.3-0.8)*10^2/25
x = 42
此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。
小提示: MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。
若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例:
y = sin(10)*exp(-0.3*4^2);
若要显示变数y的值,直接键入y即可:
>>y
y =-0.0045
在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。
下表即为MATLAB常用的基本数学函数及三角函数:
小整理:MATLAB常用的基本数学函数
abs(x):纯量的绝对值或向量的长度
angle(z):复 数z的相角(Phase angle)
sqrt(x):开平方
real(z):复数z的实部
imag(z):复数z的虚 部
conj(z):复数z的共轭复数
round(x):四舍五入至最近整数
fix(x):无论正负,舍去小数至最近整数
floor(x):地板函数,即舍去正小数至最近整数
ceil(x):天花板函数,即加入正小数至最近整数
rat(x):将实数x化为分数表示
rats(x):将实数x化为多项分数展开
sign(x):符号函数 (Signum function)。
当x<0时,sign(x)=-1;
当x=0时,sign(x)=0;
当x>0时,sign(x)=1。
> 小整理:MATLAB常用的三角函数
sin(x):正弦函数
cos(x):馀弦函数
tan(x):正切函数
asin(x):反正弦函数
acos(x):反馀弦函数
atan(x):反正切函数
atan2(x,y):四象限的反正切函数
sinh(x):超越正弦函数
cosh(x):超越馀弦函数
tanh(x):超越正切函数
asinh(x):反超越正弦函数
acosh(x):反超越馀弦函数
atanh(x):反超越正切函数
变数也可用来存放向量或矩阵,并进行各种运算,如下例的列向量(Row vector)运算:
x = [1 3 5 2];
y = 2*x+1
y = 3 7 11 5
小提示:变数命名的规则
1.第一个字母必须是英文字母 2.字母间不可留空格 3.最多只能有19个字母,MATLAB会忽略多馀字母
我们可以随意更改、增加或删除向量的元素:
y(3) = 2 % 更改第三个元素
y =3 7 2 5
y(6) = 10 % 加入第六个元素
y = 3 7 2 5 0 10
y(4) = [] % 删除第四个元素,
y = 3 7 2 0 10
在上例中,MATLAB会忽略所有在百分比符号(%)之後的文字,因此百分比之後的文字均可视为程式的注解(Comments)。MATLAB亦可取出向量的一个元素或一部份来做运算:
x(2)*3+y(4) % 取出x的第二个元素和y的第四个元素来做运算
ans = 9
y(2:4)-1 % 取出y的第二至第四个元素来做运算
ans = 6 1 -1
在上例中,2:4代表一个由2、3、4组成的向量

若对MATLAB函数用法有疑问,可随时使用help来寻求线上支援(on-line help):help linspace
小整理:MATLAB的查询命令
help:用来查询已知命令的用法。例如已知inv是用来计算反矩阵,键入help inv即可得知有关inv命令的用法。(键入help help则显示help的用法,请试看看!) lookfor:用来寻找未知的命令。例如要寻找计算反矩阵的命令,可键入 lookfor inverse,MATLAB即会列出所有和关键字inverse相关的指令。找到所需的命令後 ,即可用help进一步找出其用法。(lookfor事实上是对所有在搜寻路径下的M档案进行关键字对第一注解行的比对,详见後叙。)
将列向量转置(Transpose)後,即可得到行向量(Column vector):
z = x'
z = 4.0000
5.2000
6.4000
7.6000
8.8000
10.0000
不论是行向量或列向量,我们均可用相同的函数找出其元素个数、最大值、最小值等:
length(z) % z的元素个数
ans = 6
max(z) % z的最大值
ans = 10
min(z) % z的最小值
ans = 4
小整理:适用於向量的常用函数有:
min(x): 向量x的元素的最小值
max(x): 向量x的元素的最大值
mean(x): 向量x的元素的平均值
median(x): 向量x的元素的中位数
std(x): 向量x的元素的标准差
diff(x): 向量x的相邻元素的差
sort(x): 对向量x的元素进行排序(Sorting)
length(x): 向量x的元素个数
norm(x): 向量x的欧氏(Euclidean)长度
sum(x): 向量x的元素总和
prod(x): 向量x的元素总乘积
cumsum(x): 向量x的累计元素总和
cumprod(x): 向量x的累计元素总乘积
dot(x, y): 向量x和y的内 积
cross(x, y): 向量x和y的外积 (大部份的向量函数也可适用於矩阵,详见下述。)


若要输入矩阵,则必须在每一列结尾加上分号(;),如下例:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12];
A =
1 2 3 4
5 6 7 8
9 10 11 12
同样地,我们可以对矩阵进行各种处理:
A(2,3) = 5 % 改变位於第二列,第三行的元素值
A =
1 2 3 4
5 6 5 8
9 10 11 12
B = A(2,1:3) % 取出部份矩阵B
B = 5 6 5
A = [A B'] % 将B转置後以行向量并入A
A =
1 2 3 4 5
5 6 5 8 6
9 10 11 12 5
A(:, 2) = [] % 删除第二行(:代表所有列)
A =
1 3 4 5
5 5 8 6
9 11 12 5
A = [A; 4 3 2 1] % 加入第四列
A =
1 3 4 5
5 5 8 6
9 11 12 5
4 3 2 1
A([1 4], :) = [] % 删除第一和第四列(:代表所有行)
A =
5 5 8 6
9 11 12 5
这几种矩阵处理的方式可以相互叠代运用,产生各种意想不到的效果,就看各位的巧思和创意。
小提示:在MATLAB的内部资料结构中,每一个矩阵都是一个以行为主(Column-oriented )的阵列(Array)因此对於矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。举例来说,在上述矩阵A中,位於第二列、第三行的元素可写为A(2,3) (二维索引)或A(6)(一维索引,即将所有直行进行堆叠後的第六个元素)。
此外,若要重新安排矩阵的形状,可用reshape命令:
B = reshape(A, 4, 2) % 4是新矩阵的列数,2是新矩阵的行数
B =
5 8
9 12
5 6
11 5
小提示: A(:)就是将矩阵A每一列堆叠起来,成为一个行向量,而这也是MATLAB变数的内部储存方式。以前例而言,reshape(A, 8, 1)和A(:)同样都会产生一个8x1的矩阵。
MATLAB可在同时执行数个命令,只要以逗号或分号将命令隔开:
x = sin(pi/3); y = x^2; z = y*10,
z =
7.5000
若一个数学运算是太长,可用三个句点将其延伸到下一行:
z = 10*sin(pi/3)* ...
sin(pi/3);
若要检视现存於工作空间(Workspace)的变数,可键入who:
who
Your variables are:
testfile x
这些是由使用者定义的变数。若要知道这些变数的详细资料,可键入:
whos
Name Size Bytes Class
A 2x4 64 double array
B 4x2 64 double array
ans 1x1 8 double array
x 1x1 8 double array
y 1x1 8 double array
z 1x1 8 double array
Grand total is 20 elements using 160 bytes
使用clear可以删除工作空间的变数:
clear A
A
??? Undefined function or variable 'A'.
另外MATLAB有些永久常数(Permanent constants),虽然在工作空间中看不 到,但使用者可直接取用,例如:
pi
ans = 3.1416
下表即为MATLAB常用到的永久常数。
小整理:MATLAB的永久常数 i或j:基本虚数单位
eps:系统的浮点(Floating-point)精确度
inf:无限大, 例如1/0 nan或NaN:非数值(Not a number) ,例如0/0
pi:圆周率 p(= 3.1415926...)
realmax:系统所能表示的最大数值
realmin:系统所能表示的最小数值
nargin: 函数的输入引数个数
nargin: 函数的输出引数个数
1-2、重复命令
最简单的重复命令是for圈(for-loop),其基本形式为:
for 变数 = 矩阵;
运算式;
end
其中变数的值会被依次设定为矩阵的每一行,来执行介於for和end之间的运算式。因此,若无意外情况,运算式执行的次数会等於矩阵的行数。
举例来说,下列命令会产生一个长度为6的调和数列(Harmonic sequence):
x = zeros(1,6); % x是一个16的零矩阵
for i = 1:6,
x(i) = 1/i;
end
在上例中,矩阵x最初是一个16的零矩阵,在for圈中,变数i的值依次是1到6,因此矩阵x的第i个元素的值依次被设为1/i。我们可用分数来显示此数列:
format rat % 使用分数来表示数值
disp(x)
1 1/2 1/3 1/4 1/5 1/6
for圈可以是多层的,下例产生一个16的Hilbert矩阵h,其中为於第i列、第j行的元素为
h = zeros(6);
for i = 1:6,
for j = 1:6,
h(i,j) = 1/(i+j-1);
end
end
disp(h)
1 1/2 1/3 1/4 1/5 1/6
1/2 1/3 1/4 1/5 1/6 1/7
1/3 1/4 1/5 1/6 1/7 1/8
1/4 1/5 1/6 1/7 1/8 1/9
1/5 1/6 1/7 1/8 1/9 1/10
1/6 1/7 1/8 1/9 1/10 1/11
小提示:预先配置矩阵 在上面的例子,我们使用zeros来预先配置(Allocate)了一个适当大小的矩阵。若不预先配置矩阵,程式仍可执行,但此时MATLAB需要动态地增加(或减小)矩阵的大小,因而降低程式的执行效率。所以在使用一个矩阵时,若能在事前知道其大小,则最好先使用zeros或ones等命令来预先配置所需的记忆体(即矩阵)大小。

在下例中,for圈列出先前产生的Hilbert矩阵的每一行的平方和:
for i = h,
disp(norm(i)^2); % 印出每一行的平方和
end

1299/871
282/551
650/2343
524/2933
559/4431
831/8801
在上例中,每一次i的值就是矩阵h的一行,所以写出来的命令特别简洁。
令一个常用到的重复命令是while圈,其基本形式为:
while 条件式;
运算式;
end
也就是说,只要条件示成立,运算式就会一再被执行。例如先前产生调和数列的例子,我们可用while圈改写如下:
x = zeros(1,6); % x是一个16的零矩阵
i = 1;
while i <= 6,
x(i) = 1/i;
i = i+1;
end
format short

1-3、逻辑命令
最简单的逻辑命令是if, ..., end,其基本形式为:
if 条件式;
运算式;
end
if rand(1,1) > 0.5,
disp('Given random number is greater than 0.5.');
end
Given random number is greater than 0.5.

1-4、集合多个命令於一个M档案
若要一次执行大量的MATLAB命令,可将这些命令存放於一个副档名为m的档案,并在 MATLAB提示号下键入此档案的主档名即可。此种包含MATLAB命令的档案都以m为副档名,因此通称M档案(M-files)。例如一个名为test.m的M档案,包含一连串的MATLAB命令,那麽只要直接键入test,即可执行其所包含的命令:
pwd % 显示现在的目录
ans =
D:\MATLAB5\bin
cd c:\data\mlbook % 进入test.m所在的目录
type test.m % 显示test.m的内容
% This is my first test M-file.
% Roger Jang, March 3, 1997
fprintf('Start of test.m!\n');
for i = 1:3,
fprintf('i = %d ---> i^3 = %d\n', i, i^3);
end
fprintf('End of test.m!\n');
test % 执行test.m
Start of test.m!
i = 1 ---> i^3 = 1
i = 2 ---> i^3 = 8
i = 3 ---> i^3 = 27
End of test.m!
小提示:第一注解行(H1 help line) test.m的前两行是注解,可以使程式易於了解与管理。特别要说明的是,第一注解行通常用来简短说明此M档案的功能,以便lookfor能以关键字比对的方式来找出此M档案。举例来说,test.m的第一注解行包含test这个字,因此如果键入lookfor test,MATLAB即可列出所有在第一注解行包含test的M档案,因而test.m也会被列名在内。
严格来说,M档案可再细分为命令集(Scripts)及函数(Functions)。前述的test.m即为命令集,其效用和将命令逐一输入完全一样,因此若在命令集可以直接使用工作空间的变数,而且在命令集中设定的变数,也都在工作空间中看得到。函数则需要用到输入引数(Input arguments)和输出引数(Output arguments)来传递资讯,这就像是C语言的函数,或是FORTRAN语言的副程序(Subroutines)。举例来说,若要计算一个正整数的阶乘 (Factorial),我们可以写一个如下的MATLAB函数并将之存档於fact.m:
function output = fact(n)
% FACT Calculate factorial of a given positive integer.
output = 1;
for i = 1:n,
output = output*i;
end
其中fact是函数名,n是输入引数,output是输出引数,而i则是此函数用到的暂时变数。要使用此函数,直接键入函数名及适当输入引数值即可:
y = fact(5)
y = 120
(当然,在执行fact之前,你必须先进入fact.m所在的目录。)在执行fact(5)时,
MATLAB会跳入一个下层的暂时工作空间(Temperary workspace),将变数n的值设定为5,然後进行各项函数的内部运算,所有内部运算所产生的变数(包含输入引数n、暂时变数i,以及输出引数output)都存在此暂时工作空间中。运算完毕後,MATLAB会将最後输出引数output的值设定给上层的变数y,并将清除此暂时工作空间及其所含的所有变数。换句话说,在呼叫函数时,你只能经由输入引数来控制函数的输入,经由输出引数来得到函数的输出,但所有的暂时变数都会随着函数的结束而消失,你并无法得到它们的值。
小提示:有关阶乘函数 前面(及後面)用到的阶乘函数只是纯粹用来说明MATLAB的函数观念。若实际要计算一个正整数n的阶乘(即n!)时,可直接写成prod(1:n),或是直接呼叫gamma函数:gamma(n-1)。
MATLAB的函数也可以是递式的(Recursive),也就是说,一个函数可以呼叫它本身。
举例来说,n! = n*(n-1)!,因此前面的阶乘函数可以改成递式的写法:
function output = fact(n)
% FACT Calculate factorial of a given positive integer recursively.
if n == 1, % Terminating condition
output = 1;
return;
end
output = n*fact(n-1);
在写一个递函数时,一定要包含结束条件(Terminating condition),否则此函数将会一再呼叫自己,永远不会停止,直到电脑的记忆体被耗尽为止。以上例而言,n==1即满足结束条件,此时我们直接将output设为1,而不再呼叫此函数本身。

1-5、搜寻路径
在前一节中,test.m所在的目录是d:\mlbook。如果不先进入这个目录,MATLAB就找不到你要执行的M档案。如果希望MATLAB不论在何处都能执行test.m,那麽就必须将d:\mlbook加入MATLAB的搜寻路径(Search path)上。要检视MATLAB的搜寻路径,键入path即可:
path
MATLABPATH
d:\matlab5\toolbox\matlab\general
d:\matlab5\toolbox\matlab\ops
d:\matlab5\toolbox\matlab\lang
d:\matlab5\toolbox\matlab\elmat
d:\matlab5\toolbox\matlab\elfun
d:\matlab5\toolbox\matlab\specfun
d:\matlab5\toolbox\matlab\matfun
d:\matlab5\toolbox\matlab\datafun
d:\matlab5\toolbox\matlab\polyfun
d:\matlab5\toolbox\matlab\funfun
d:\matlab5\toolbox\matlab\sparfun
d:\matlab5\toolbox\matlab\graph2d
d:\matlab5\toolbox\matlab\graph3d
d:\matlab5\toolbox\matlab\specgraph
d:\matlab5\toolbox\matlab\graphics
d:\matlab5\toolbox\matlab\uitools
d:\matlab5\toolbox\matlab\strfun
d:\matlab5\toolbox\matlab\iofun
d:\matlab5\toolbox\matlab\timefun
d:\matlab5\toolbox\matlab\datatypes
d:\matlab5\toolbox\matlab\dde
d:\matlab5\toolbox\matlab\demos
d:\matlab5\toolbox\tour
d:\matlab5\toolbox\simulink\simulink
d:\matlab5\toolbox\simulink\blocks
d:\matlab5\toolbox\simulink\simdemos
d:\matlab5\toolbox\simulink\dee
d:\matlab5\toolbox\local
此搜寻路径会依已安装的工具箱(Toolboxes)不同而有所不同。要查询某一命令是在搜寻路径的何处,可用which命令:
which expo
d:\matlab5\toolbox\matlab\demos\expo.m
很显然c:\data\mlbook并不在MATLAB的搜寻路径中,因此MATLAB找不到test.m这个M档案:
which test
c:\data\mlbook\test.m
要将d:\mlbook加入MATLAB的搜寻路径,还是使用path命令:
path(path, 'c:\data\mlbook');
此时d:\mlbook已加入MATLAB搜寻路径(键入path试看看),因此MATLAB已经"看"得到
test.m:
which test
c:\data\mlbook\test.m
现在我们就可以直接键入test,而不必先进入test.m所在的目录。
小提示:如何在其启动MATLAB时,自动设定所需的搜寻路径? 如果在每一次启动MATLAB後都要设定所需的搜寻路径,将是一件很麻烦的事。有两种方法,可以使MATLAB启动後 ,即可载入使用者定义的搜寻路径:
1.MATLAB的预设搜寻路径是定义在matlabrc.m(在c:\matlab之下,或是其他安装MATLAB 的主目录下),MATLAB每次启动後,即自动执行此档案。因此你可以直接修改matlabrc.m ,以加入新的目录於搜寻路径之中。
2.MATLAB在执行matlabrc.m时,同时也会在预设搜寻路径中寻找startup.m,若此档案存在,则执行其所含的命令。因此我们可将所有在MATLAB启动时必须执行的命令(包含更改搜寻路径的命令),放在此档案中。
每次MATLAB遇到一个命令(例如test)时,其处置程序为:
1.将test视为使用者定义的变数。
2.若test不是使用者定义的变数,将其视为永久常数 。
3.若test不是永久常数,检查其是否为目前工作目录下的M档案。
4.若不是,则由搜寻路径寻找是否有test.m的档案。
5.若在搜寻路径中找不到,则MATLAB会发出哔哔声并印出错误讯息。
以下介绍与MATLAB搜寻路径相关的各项命令。


1-6、资料的储存与载入
有些计算旷日废时,那麽我们通常希望能将计算所得的储存在档案中,以便将来可进行其他处理。MATLAB储存变数的基本命令是save,在不加任何选项(Options)时,save会将变数以二进制(Binary)的方式储存至副档名为mat的档案,如下述:
save:将工作空间的所有变数储存到名为matlab.mat的二进制档案。
save filename:将工作空间的所有变数储存到名为filename.mat的二进制档案。 save filename x y z :将变数x、y、z储存到名为filename.mat的二进制档案。
以下为使用save命令的一个简例:
who % 列出工作空间的变数
Your variables are:
B h j y
ans i x z
save test B y % 将变数B与y储存至test.mat
dir % 列出现在目录中的档案
. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc
.. 3plotxyz.doc first.doc temp.doc test.mat
1basic.doc book.dot go.m template.doc testfile.dat
delete test.mat % 删除test.mat
以二进制的方式储存变数,通常档案会比较小,而且在载入时速度较快,但是就无法用普通的文书软体(例如pe2或记事本)看到档案内容。若想看到档案内容,则必须加上-ascii选项,详见下述:
save filename x -ascii:将变数x以八位数存到名为filename的ASCII档案。
Save filename x -ascii -double:将变数x以十六位数存到名为filename的ASCII档案。
另一个选项是-tab,可将同一列相邻的数目以定位键(Tab)隔开。
小提示:二进制和ASCII档案的比较 在save命令使用-ascii选项後,会有下列现象:save命令就不会在档案名称後加上mat的副档名。
因此以副档名mat结尾的档案通常是MATLAB的二进位资料档。
若非有特殊需要,我们应该尽量以二进制方式储存资料。
load命令可将档案载入以取得储存之变数:
load filename:load会寻找名称为filename.mat的档案,并以二进制格式载入。若找不到filename.mat,则寻找名称为filename的档案,并以ASCII格式载入。load filename -ascii:load会寻找名称为filename的档案,并以ASCII格式载入。
若以ASCII格式载入,则变数名称即为档案名称(但不包含副档名)。若以二进制载入,则可保留原有的变数名称,如下例:
clear all; % 清除工作空间中的变数
x = 1:10;
save testfile.dat x -ascii % 将x以ASCII格式存至名为testfile.dat的档案
load testfile.dat % 载入testfile.dat
who % 列出工作空间中的变数
Your variables are:
testfile x
注意在上述过程中,由於是以ASCII格式储存与载入,所以产生了一个与档案名称相同的变数testfile,此变数的值和原变数x完全相同。
1-7、结束MATLAB
有三种方法可以结束MATLAB:
1.键入exit
2.键入quit
3.直接关闭MATLAB的命令视窗(Command window)
数 值 函 数

N[expr]表达式的机器精度近似值
N[expr, n] 表达式的n位近似值,n为任意正整数
NSolve[lhs==rhs, var] 求方程数值解
NSolve[eqn, var, n] 求方程数值解,结果精度到n位
NDSolve[eqns, y, {x, xmin, xmax}]微分方程数值解
NDSolve[eqns, {y1,y2,...}, {x, xmin, xmax}]
微分方程组数值解
FindRoot[lhs==rhs, {x,x0}] 以x0为初值,寻找方程数值解
FindRoot[lhs==rhs, {x, xstart, xmin, xmax}]
NSum[f, {i,imin,imax,di}] 数值求和,di为步长
NSum[f, {i,imin,imax,di}, {j,..},..] 多维函数求和
NProduct[f, {i, imin, imax, di}]函数求积
NIntegrate[f, {x, xmin, xmax}] 函数数值积分

优化函数:
FindMinimum[f, {x,x0}] 以x0为初值,寻找函数最小值
FindMinimum[f, {x, xstart, xmin, xmax}]
ConstrainedMin[f,{inequ},{x,y,..}]
inequ为线性不等式组,f为x,y..之线性函数,得到最小值及此时的x,y..取值
ConstrainedMax[f, {inequ}, {x, y,..}]同上
LinearProgramming[c,m,b] 解线性组合c.x在m.x>=b&&x>=0约束下的
最小值,x,b,c为向量,m为矩阵
LatticeReduce[{v1,v2...}] 向量组vi的极小无关组

数据处理:
Fit[data,funs,vars]用指定函数组对数据进行最小二乘拟和
data可以为{{x1,y1,..f1},{x2,y2,..f2}..}多维的情况
emp: Fit[{10.22,12,3.2,9.9}, {1, x, x^2,Sin[x]}, x]
Interpolation[data]对数据进行差值,
data同上,另外还可以为{{x1,{f1,df11,df12}},{x2,{f2,.}..}指定各阶导数
InterpolationOrder默认为3次,可修改
ListInterpolation[array]对离散数据插值,array可为n维
ListInterpolation[array,{{xmin,xmax},{ymin,ymax},..}]
FunctionInterpolation[expr,{x,xmin,xmax}, {y,ymin,ymax},..]
以对应expr[xi,yi]的为数据进行插值
Fourier[list] 对复数数据进行付氏变换
InverseFourier[list] 对复数数据进行付氏逆变换
Min[{x1,x2...},{y1,y2,...}]得到每个表中的最小值
Max[{x1,x2...},{y1,y2,...}]得到每个表中的最大值
Select[list, crit] 将表中使得crit为True的元素选择出来
Count[list, pattern] 将表中匹配模式pattern的元素的个数
Sort[list] 将表中元素按升序排列
Sort[list,p] 将表中元素按p[e1,e2]为True的顺序比较list
的任两个元素e1,e2,实际上Sort[list]中默认p=Greater

集合论:
Union[list1,list2..] 表listi的并集并排序
Intersection[list1,list2..] 表listi的交集并排序
Complement[listall,list1,list2...]从全集listall中对listi的差集

九、虚数函数
Re[expr] 复数表达式的实部
Im[expr] 复数表达式的虚部
Abs[expr] 复数表达式的模
Arg[expr] 复数表达式的辐角
Conjugate[expr] 复数表达式的共轭

十、数的头及模式及其他操作
Integer _Integer 整数
Real _Real 实数
Complex _Complex 复数
Rational_Rational 有理数
(*注:模式用在函数参数传递中,如MyFun[Para1_Integer,Para2_Real]
规定传入参数的类型,另外也可用来判断If[Head[a]==Real,...]*)
IntegerDigits[n,b,len] 数字n以b近制的前len个码元
RealDigits[x,b,len] 类上
FromDigits[list] IntegerDigits的反函数
Rationalize[x,dx] 把实数x有理化成有理数,误差小于dx
Chop[expr, delta] 将expr中小于delta的部分去掉,dx默认为10^-10
Accuracy[x] 给出x小数部分位数,对于Pi,E等为无限大
Precision[x] 给出x有效数字位数,对于Pi,E等为无限大
SetAccuracy[expr, n] 设置expr显示时的小数部分位数
SetPrecision[expr, n] 设置expr显示时的有效数字位数

十一、区间函数
Interval[{min, max}] 区间[min, max](* Solve[3 x+2==Interval[{-2,5}],x]*)
IntervalMemberQ[interval, x] x在区间内吗?
IntervalMemberQ[interval1,interval2] 区间2在区间1内吗?
IntervalUnion[intv1,intv2...] 区间的并
IntervalIntersection[intv1,intv2...] 区间的交

十二、矩阵操作
a.b.c 或 Dot[a, b, c] 矩阵、向量、张量的点积
Inverse[m] 矩阵的逆
Transpose[list] 矩阵的转置
Transpose[list,{n1,n2..}]将矩阵list 第k行与第nk列交换
Det[m] 矩阵的行列式
Eigenvalues[m] 特征值
Eigenvectors[m] 特征向量
Eigensystem[m] 特征系统,返回{eigvalues,eigvectors}
LinearSolve[m, b] 解线性方程组m.x==b
NullSpace[m] 矩阵m的零空间,即m.NullSpace[m]==零向量
RowReduce[m] m化简为阶梯矩阵
Minors[m, k] m的所有k*k阶子矩阵的行列式的值(伴随阵,好像是)
MatrixPower[mat, n] 阵mat自乘n次
Outer[f,list1,list2..] listi中各个元之间相互组合,并作为f的参数的到的矩阵
Outer[Times,list1,list2]给出矩阵的外积
SingularValues[m] m的奇异值,结果为{u,w,v},
m=Conjugate[Transpose[u]].DiagonalMatrix[w].v
PseudoInverse[m] m的广义逆
QRDecomposition[m] QR分解
SchurDecomposition[m] Schur分解
LUDecomposition[m] LU分解
Mathematica函数大全--运算符及特殊符号

一、运算符及特殊符号

Line1; 执行Line,不显示结果
Line1,line2 顺次执行Line1,2,并显示结果
?name 关于系统变量name的信息
??name 关于系统变量name的全部信息
!command 执行Dos命令
n! N的阶乘

!!filename 显示文件内容
< Expr>> filename 打开文件写
Expr>>>filename 打开文件从文件末写

() 结合率
[] 函数
{} 一个表
<*Math Fun*> 在c语言中使用math的函数
(*Note*) 程序的注释

#n 第n个参数
## 所有参数
rule& 把rule作用于后面的式子
% 前一次的输出
%% 倒数第二次的输出
%n 第n个输出
var::note 变量var的注释
"Astring " 字符串
Context ` 上下文

a+b 加
a-b 减
a*b或a b 乘
a/b 除
a^b 乘方
base^^num 以base为进位的数
lhs&&rhs 且
lhs||rhs 或
!lha 非
++,-- 自加1,自减1
+=,-=,*=,/= 同C语言
>,<,>=,<=,==,!= 逻辑判断(同c)
lhs=rhs 立即赋值
lhs:=rhs 建立动态赋值
lhs:>rhs 建立替换规则
lhs->rhs 建立替换规则
expr//funname 相当于filename[expr]
expr/.rule 将规则rule应用于expr
expr//.rule 将规则rule不断应用于expr知道不变为止
param_ 名为param的一个任意表达式(形式变量)
param__ 名为param的任意多个任意表达式(形式变量)

二、系统常数
Pi 3.1415....的无限精度数值
E 2.17828...的无限精度数值
Catalan 0.915966..卡塔兰常数
EulerGamma 0.5772....高斯常数
GoldenRatio 1.61803...黄金分割数
Degree Pi/180角度弧度换算
I 复数单位
Infinity 无穷大
-Infinity 负无穷大
ComplexInfinity 复无穷大
Indeterminate 不定式

三、代数计算
Expand[expr] 展开表达式
Factor[expr] 展开表达式
Simplify[expr] 化简表达式
FullSimplify[expr] 将特殊函数等也进行化简
PowerExpand[expr] 展开所有的幂次形式
ComplexExpand[expr,{x1,x2...}] 按复数实部虚部展开
FunctionExpand[expr] 化简expr中的特殊函数
Collect[expr, x] 合并同次项
Collect[expr, {x1,x2,...}] 合并x1,x2,...的同次项
Together[expr] 通分
Apart[expr] 部分分式展开
Apart[expr, var] 对var的部分分式展开
Cancel[expr] 约分
ExpandAll[expr] 展开表达式
ExpandAll[expr, patt] 展开表达式
FactorTerms[poly] 提出共有的数字因子
FactorTerms[poly, x] 提出与x无关的数字因子
FactorTerms[poly, {x1,x2...}] 提出与xi无关的数字因子
Coefficient[expr, form] 多项式expr中form的系数
Coefficient[expr, form, n] 多项式expr中form^n的系数
Exponent[expr, form] 表达式expr中form的最高指数
Numerator[expr] 表达式expr的分子
Denominator[expr] 表达式expr的分母
ExpandNumerator[expr] 展开expr的分子部分
ExpandDenominator[expr] 展开expr的分母部分

TrigExpand[expr] 展开表达式中的三角函数
TrigFactor[expr] 给出表达式中的三角函数因子
TrigFactorList[expr] 给出表达式中的三角函数因子的表
TrigReduce[expr] 对表达式中的三角函数化简
TrigToExp[expr] 三角到指数的转化
ExpToTrig[expr] 指数到三角的转化

RootReduce[expr]
ToRadicals[expr]