一.简介

本篇参考官方入门文档编写

前提准备:

  1. MATLAB

二. 快速入门(六)

1. 非线性函数的运算

函数句柄

可以创建任何 MATLAB® 函数的句柄,并将该句柄用作引用该函数的一种方式。函数句柄通常在参数列表中传递给其他函数,然后,其他函数可以使用该句柄执行或计算相应函数。

在 MATLAB 中,使用 at 符号 @ 在函数名称前面构造函数句柄。下面的示例为 sin 函数创建一个函数句柄,并将其赋值给变量 fhandle

1
fhandle = @sin;

您可以按照使用函数名称调用函数的相同方式,通过函数句柄来调用函数。语法为

1
fhandle(arg1, arg2, ...);

下面显示的函数 plot_fhandle 接收函数句柄和数据,使用函数句柄生成 y 轴数据,并对数据绘图:

1
2
function plot_fhandle(fhandle, data)
plot(data, fhandle(data))

当调用带有如下 sin 函数的句柄和参数的 plot_fhandle 时,得到的计算结果会生成正弦波图:

1
plot_fhandle(@sin, -pi:0.01:pi)

复合函数

名为“复合函数”的函数类与标量变量的非线性函数配合使用。也就是说,某个函数基于另一个函数运行。复合函数包括

  • 找零
  • 优化
  • 求积
  • 常微分方程

MATLAB 通过定义非线性函数的文件来表示非线性函数。例如,以下是 matlab/demos 文件夹中的 humps 函数的简化版本:

1
2
function y = humps(x)
y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6;

使用以下命令在区间 0 ≤ x ≤ 1 中的一组点处计算此函数

1
2
x = 0:.002:1;
y = humps(x);

然后,使用以下命令绘制该函数

1
plot(x,y)

img

此图形表明,该函数在 x = 0.6 附近具有局部最小值。函数 fminsearch 会求最小值,即此函数采用此最小值时的 x 值。fminsearch 的第一个参数是此函数达到最小值时的函数句柄,第二个参数是猜测的最小值的大致位置:

1
2
3
p = fminsearch(@humps,.5)
p =
0.6370

要在极小值处计算此函数,

1
2
3
4
humps(p)

ans =
11.2528

数值分析采用求积积分来区别定积分的近似数值和常微分方程的数值积分。MATLAB 正交例程包括 quadquadl。语句

1
Q = quadl(@humps,0,1)

计算此图形中曲线下方的面积,并生成

1
2
Q =
29.8583

最后,此图形表明该函数在此区间中永远不会为零。这样,如果使用

1
z = fzero(@humps,.5)

搜索零,则会在此区间外部找到一个零:

1
2
z =
-0.1316

2. 多变量数据

MATLAB® 对多变量统计数据使用列向分析。数据集中的每一列都代表一个变量,每一行都代表一个观测值。第 (i,j) 个元素是第 j 个变量的第 i 个观测值。

例如,设想一个具有三个变量的数据集:

  • 心率
  • 体重
  • 每周锻炼小时数

对于五个观测值,最终数组可能如下所示

1
2
3
4
5
D = [ 72          134          3.2
81 201 3.5
69 156 7.1
82 148 2.4
75 170 1.2 ]

第一行包含患者 1 的心率、体重和锻炼小时数,第二行包含患者 2 的数据,依此类推。现在,您可以对此数据集应用多个 MATLAB 数据分析函数:例如,要获取每一列的平均差和标准差,请使用

1
2
3
4
5
6
7
mu = mean(D), sigma = std(D)

mu =
75.8 161.8 3.48

sigma =
5.6303 25.499 2.2107

有关 MATLAB 中提供的数据分析函数的列表,请键入

1
help datafun

如果您可以使用 Statistics and Machine Learning Toolbox™ 软件,请键入

1
help stats

3. 基本绘图函数

创建绘图

尝试此示例Copy Command Copy Code

plot 函数具有不同的形式,具体取决于输入参数。

  • 如果 y 是向量,plot(y) 会生成 y 元素与 y 元素索引的分段线图。
  • 如果有两个向量被指定为参数,plot(x,y) 会生成 yx 的图形。

使用冒号运算符创建从 0 至 2πx 值向量,计算这些值的正弦,并绘制结果。

1
2
3
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)

Figure contains an axes object. The axes object contains an object of type line.

添加轴标签和标题。xlabel 函数中的字符 \pi 用于创建符号 πtitle 函数中的 FontSize 属性用于增大标题所用的文本大小。

1
2
3
xlabel('x = 0:2\pi')
ylabel('Sine of x')
title('Plot of the Sine Function','FontSize',12)

Figure contains an axes object. The axes object with title Plot of the Sine Function contains an object of type line.

在一幅图形中绘制多个数据集

尝试此示例Copy Command Copy Code

通过调用一次 plot,多个 x-y 对组参数会创建多幅图形。MATLAB® 对每条线使用不同的颜色。

例如,下列语句绘制 x 的三个相关函数:

1
2
3
4
5
x = 0:pi/100:2*pi;
y = sin(x);
y2 = sin(x-.25);
y3 = sin(x-.5);
plot(x,y,x,y2,x,y3)

Figure contains an axes object. The axes object contains 3 objects of type line.

legend 函数提供了一种标识各条线的简单方法:

1
legend('sin(x)','sin(x-.25)','sin(x-.5)')

Figure contains an axes object. The axes object contains 3 objects of type line. These objects represent sin(x), sin(x-.25), sin(x-.5).

指定线型和颜色

使用 plot 命令绘制数据时,可以指定颜色、线型和标记(例如加号或圆圈):

1
plot(x,y,'color_style_marker')

color_style_marker 包含一至四个字符(包括在单引号中),这些字符根据颜色、线型和标记类型构造而成。例如,

1
plot(x,y,'r:+')

使用红色点线绘制数据,并在每个数据点处放置一个 + 标记。

color_style_marker 由下列元素的组合形式构成。

类型 含义
颜色 'c' 'm' 'y' 'r' 'g' 'b' 'w' 'k' 青蓝 品红 黄 红 绿 蓝 白 黑
线型 '-' '--' ':' '-.' 无字符 实线 虚线 点线 点划线 没有线条
标记类型 '+' 'o' '*' 'x' 's' 'd' '^' 'v' '>' '<' 'p' 'h' 无字符 加号 空心圆 星号 字母 x 空心正方形 空心菱形 空心上三角 空心下三角 空心右三角 空心左三角 空心五角形 空心六角形 无标记

绘制线条和标记

如果指定标记类型,但未指定线型,MATLAB® 仅使用标记创建图形,而不会创建线条。例如,

1
plot(x,y,'ks')

在每个数据点绘制黑色正方形,但不会使用线条连接标记。

语句

1
plot(x,y,'r:+')

绘制红色点线,并在每个数据点处放置加号标记。

在每十个数据点处放置标记

尝试此示例Copy Command Copy Code

此示例展示如何使用比绘制线条所用的数据点更少的数据点来绘制标记。它使用点线图和标记图(分别采用不同数目的数据点)绘制两次数据图:

1
2
3
x1 = 0:pi/100:2*pi;
x2 = 0:pi/10:2*pi;
plot(x1,sin(x1),'r:',x2,sin(x2),'r+')

Figure contains an axes object. The axes object contains 2 objects of type line.

绘制虚数和复数数据

将多个复数值作为参数传递给 plot 时,MATLAB 会忽略虚部,但传递一个复数参数时除外。对于这一特殊情况,该命令是绘制虚部对实部的图的一种快捷方式。因此,

1
plot(Z)

其中 Z 是复数向量或矩阵,等效于

1
plot(real(Z),imag(Z))

下列语句将绘制一个具有 20 条边的多边形,并在各顶点处绘制一个小圆圈。

1
2
3
t = 0:pi/10:2*pi;
plot(exp(1i*t),'-o')
axis equal

Figure contains an axes object. The axes object contains an object of type line.

axis equal 命令使 xy 轴上的各刻度线增量的长度相同,这会使此绘图看起来更加圆润。

将绘图添加到现有图形中

hold 命令用于将绘图添加到现有图形中。当键入

1
hold on

时,MATLAB 不会在您发出其他绘图命令时替换现有图形。MATLAB 而会将新图形与当前图形合并在一起。

例如,下列语句首先创建 peaks 函数的曲面图,然后叠加同一函数的等高线图:

1
2
3
4
5
6
7
8
9
10
11
[x,y,z] = peaks;
% Create surface plot
surf(x,y,z)
% Remove edge lines a smooth colors
shading interp
% Hold the current graph
hold on
% Add the contour graph to the pcolor graph
contour3(x,y,z,20,'k')
% Return to default
hold off

Figure contains an axes object. The axes object contains 2 objects of type surface, contour.

图窗窗口

如果尚未创建图窗窗口,绘图函数会自动打开一个新的图窗窗口。如果打开了多个图窗窗口,MATLAB 将使用指定为“当前图窗”(通常为上次使用的图窗)的图窗窗口。

要将现有图窗窗口设置为当前的图窗,请将指针放置在该窗口中并点击鼠标,或者也可以键入

1
figure(n)

其中 n 是图窗标题栏中的编号。

要打开新的图窗窗口并将其作为当前图窗,请键入

1
figure

清空图窗以便创建新绘图

如果某图窗已存在,大多数绘图命令会清除轴并使用此图窗创建新绘图。但是,这些命令不会重置图窗属性,例如,背景色或颜色图。如果已在以前的绘图中设置图窗属性,您可以先使用带有 reset 选项的 clf 命令。

1
clf reset

然后创建新绘图,以便将此图窗的属性恢复为其默认值。

在一幅图窗中显示多个绘图

subplot 命令用于在同一窗口中显示多个绘图,或者在同一张纸上打印这些绘图。键入以下命令

1
subplot(m,n,p)

会将图窗窗口划分为由多个小子图组成的 m×n 矩阵,并选择第 p 个子图作为当前绘图。这些绘图沿图窗窗口的第一行进行编号,然后沿第二行进行编号,依此类推。例如,下列语句在图窗窗口的三个子区域中绘制数据:

1
2
3
4
x = 0:pi/20:2*pi;
subplot(3,1,1); plot(sin(x))
subplot(3,1,2); plot(cos(x))
subplot(3,1,3); plot(sin(x).*cos(x))

Figure contains 3 axes objects. Axes object 1 contains an object of type line. Axes object 2 contains an object of type line. Axes object 3 contains an object of type line.

控制轴

axis 命令提供了许多用于设置图形的比例、方向和纵横比的选项。

自动改变坐标轴范围和刻度线

默认情况下,MATLAB 查找数据的最大值和最小值,并选择坐标轴范围来覆盖此范围。MATLAB 选择范围和轴刻度线值,以便生成可清楚地显示数据的图形。但是,您可以使用 axisxlimylimzlim 函数来设置您自己的范围。

注意

更改某根轴的极限会导致其他极限也发生更改,以便更好地表示数据。要禁用自动极限设置,请输入 axis manual 命令。

设置坐标轴范围

axis 命令用于指定您自己的极限:

1
axis([xmin xmax ymin ymax])

或者对于三维图形,

1
axis([xmin xmax ymin ymax zmin zmax])

请使用命令

1
axis auto

重新启用自动极限选择。

设置轴纵横比

axis 命令还可用于指定多种预定义模式。例如,

1
axis square

使 x 轴和 y 轴的长度相同。

1
axis equal

使 x 轴和 y 轴上的各个刻度线增量的长度相同。这意味着

1
plot(exp(1i*(0:pi/10:2*pi)))

(后跟 axis squareaxis equal)会将椭圆形转变为正圆:

1
axis auto normal

将轴比例恢复为其默认的自动模式。

设置轴可见性

使用 axis 命令可以显示或隐藏轴。

1
axis on

显示轴。这是默认设置。

1
axis off

隐藏轴。

设置网格线

grid 命令启用和禁用网格线。语句

1
grid on

启用网格线,而

1
grid off

再次禁用网格线。

添加轴标签和标题

此示例展示如何创建图形并增强其显示:

  • 定义 x 和 y 轴的范围 (axis)
  • 对 x 和 y 轴添加标签(xlabelylabel
  • 添加标题 (title)
  • 在图形中添加文本附注 (text)

使用 LaTeX 表示法生成数学符号。

1
2
3
4
5
6
7
8
9
t = -pi:pi/100:pi;
y = sin(t);
plot(t,y)

axis([-pi pi -1 1])
xlabel('-\pi \leq {\itt} \leq \pi')
ylabel('sin(t)')
title('Graph of the sine function')
text(0.5,-1/3,'{\itNote the odd symmetry.}')

Figure contains an axes object. The axes object with title Graph of the sine function contains 2 objects of type line, text.

如需关于在图形中放置箭头、方框和圆圈的信息,请参阅 annotation 函数。

保存图窗

通过从文件菜单中选择保存来保存图窗。这会将图窗写入到文件,包括属性数据、图窗菜单、uicontrol 和所有注释(即整个窗口)。如果这个图窗以前未被保存过,另存为对话框则会出现。此对话框提供用于将图窗另存为 .fig 文件或将其导出为图形格式的选项。

如果以前保存过这个图窗,再次使用保存会以“静默”方式保存图窗,而另存为对话框不会出现。

要使用标准图形格式(例如,TIFF 或 JPG)保存图窗以便用于其他应用程序,请从文件菜单中选择另存为(如果需要其他控件,则选择导出设置)。

注意

当指定保存图窗的格式时,下次保存该图窗或新图窗时,将再次使用该文件格式。如果您不希望按以前使用的格式保存,请使用另存为,并确保将保存类型下拉菜单设置为要写入的文件类型。

也可通过以下命令行进行保存:

  • 使用 savefig 函数将图窗及其包含的图形对象保存为 .fig 文件。
  • 使用包含任意选项的 saveas 命令,以各种格式保存图窗。

加载图窗

您可以使用以下函数将图窗加载到 MATLAB:

  • 使用 openfig 函数加载保存为 .fig 文件的图窗。
  • 使用 imread 函数将标准图形文件(包括保存图窗)读入到 MATLAB 中。

生成 MATLAB 代码以便再建图窗

通过从图窗文件菜单中选择生成代码,可以生成用于再建图窗及其所包含的图形的 MATLAB 代码。如果您已使用绘图工具创建图形,并且希望使用相同或不同数据创建类似图形,此选项尤其有用。

保存工作区数据

通过从图窗文件菜单中选择将工作区另存为,可以保存工作区中的变量。使用图窗文件菜单中的导入数据项可以重新加载保存的数据。MATLAB 支持多种数据文件格式,包括 MATLAB 数据文件,该数据文件的扩展名为 .mat