1-1、基本运算与函数
在 MATLAB 下进行基本数学运算,只需将运算式直接打入提示号(>>)之后,并按 Enter 键即可。
基本运算示例
>> (5*2+1.3-0.8)*10/25 ans = 4.2000
MATLAB 会将运算结果直接存入变量 ans(代表 Answer),并显示其数值于屏幕上。
小提示:
>>是 MATLAB 的提示符号(Prompt),但在 PC 中文视窗系统下,由于编码方式不同,此提示符号常会消失不见,但这并不会影响到 MATLAB 的运算结果。
变量赋值
可将运算式的结果设定给另一个变量 x:
x = (5*2+1.3-0.8)*10^2/25 x = 42
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 常用函数汇总
基本数学函数
| 函数 | 说明 |
|---|---|
abs(x) |
纯量的绝对值或向量的长度 |
angle(z) |
复数 z 的相角 |
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) |
符号函数:x<0时=-1,x=0时=0,x>0时=1 |
rem(x,y) |
求 x 除以 y 的余数 |
gcd(x,y) |
整数 x 和 y 的最大公因数 |
lcm(x,y) |
整数 x 和 y 的最小公倍数 |
exp(x) |
自然指数 |
pow2(x) |
2 的指数 |
log(x) |
以 e 为底的对数(自然对数) |
log2(x) |
以 2 为底的对数 |
log10(x) |
以 10 为底的对数 |
三角函数
| 函数 | 说明 |
|---|---|
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) |
反双曲正切函数 |
向量与矩阵运算
向量操作
变量也可用来存放向量或矩阵,并进行各种运算:
x = [1 3 5 2]; y = 2*x + 1 y = 3 7 11 5
变量命名规则:
第一个字母必须是英文字母
字母间不可留空格
最多只能有 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)。
向量元素运算
x(2)*3 + y(4) % 取出 x 的第二个元素和 y 的第四个元素运算 ans = 9 y(2:4) - 1 % 取出 y 的第二至第四个元素运算 ans = 6 1 -1
等差数列的生成
x = 7:16 % 公差为 1 x = 7 8 9 10 11 12 13 14 15 16 x = 7:3:16 % 公差为 3 x = 7 10 13 16
使用 linspace 产生任意等差数列:
x = linspace(4, 10, 6) % 首项4,末项10,项数6 x = 4.0000 5.2000 6.4000 7.6000 8.8000 10.0000
转置操作
z = x' % 列向量转置为行向量 z = 4.0000 5.2000 6.4000 7.6000 8.8000 10.0000
向量常用函数
| 函数 | 说明 |
|---|---|
min(x) |
向量 x 的元素的最小值 |
max(x) |
向量 x 的元素的最大值 |
mean(x) |
向量 x 的元素的平均值 |
median(x) |
向量 x 的元素的中位数 |
std(x) |
向量 x 的元素的标准差 |
diff(x) |
向量 x 的相邻元素的差 |
sort(x) |
对向量 x 的元素进行排序 |
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 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(:, 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)。对矩阵元素的存取,可用一维或二维的索引来定址。例如,上述矩阵 A 中位于第二列、第三行的元素可写为
A(2,3)(二维索引)或A(6)(一维索引)。
矩阵形状重排
B = reshape(A, 4, 2) % 4是新矩阵的列数,2是新矩阵的行数 B = 5 8 9 12 5 6 11 5
A(:)将矩阵 A 每一列堆叠起来,成为一个行向量,这也是 MATLAB 变量的内部储存方式。
多命令执行与续行
MATLAB 可在同时执行数个命令,以逗号或分号隔开:
x = sin(pi/3); y = x^2; z = y*10, z = 7.5000
若数学运算太长,可用三个句点(...)延伸到下一行:
z = 10*sin(pi/3) * ... sin(pi/3);
工作空间管理
检视现存于工作空间(Workspace)的变量:
who % 列出变量名称 whos % 列出变量详细资料 clear A % 删除变量 A
MATLAB 永久常数
| 常数 | 说明 |
|---|---|
i 或 j |
基本虚数单位 |
eps |
系统的浮点精确度 |
inf |
无限大(如 1/0) |
nan 或 NaN |
非数值(如 0/0) |
pi |
圆周率 π |
realmax |
系统所能表示的最大数值 |
realmin |
系统所能表示的最小数值 |
nargin |
函数的输入引数个数 |
nargout |
函数的输出引数个数 |
1-2、重复命令(流程控制)
for 循环
基本形式:
for 变量 = 矩阵 运算式 end
示例:产生长度为6的调和数列
x = zeros(1,6); % x 是一个 1×6 的零矩阵 for i = 1:6 x(i) = 1/i; end format rat % 使用分数来表示数值 disp(x) 1 1/2 1/3 1/4 1/5 1/6
嵌套循环:产生 6×6 的 Hilbert 矩阵
h = zeros(6); for i = 1:6 for j = 1:6 h(i,j) = 1/(i+j-1); end end disp(h)
小提示:预先配置矩阵(使用
zeros或ones)可提高程式执行效率,避免 MATLAB 动态增减矩阵大小。
逐行操作
for i = h disp(norm(i)^2); % 印出每一行的平方和 end
while 循环
基本形式:
while 条件式 运算式 end
示例:产生调和数列
x = zeros(1,6); i = 1; while i <= 6 x(i) = 1/i; i = i + 1; end format short
1-3、逻辑命令(条件控制)
if 语句
基本形式:
if 条件式 运算式 end
示例:
if rand(1,1) > 0.5 disp('Given random number is greater than 0.5.'); end
1-4、M 档案(Scripts 与 Functions)
命令集(Scripts)
将大量 MATLAB 命令存放于副档名为 .m 的档案中,在 MATLAB 提示号下键入主档名即可执行。
示例 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 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)通常用来简短说明 M 档案的功能,以便
lookfor能以关键字比对方式找出此 M 档案。
函数(Functions)
函数需要输入引数和输出引数来传递信息。
示例:阶乘函数 fact.m
function output = fact(n) % FACT Calculate factorial of a given positive integer. output = 1; for i = 1:n output = output * i; end
使用:
y = fact(5) y = 120
递归函数示例:
function output = fact(n) % FACT Calculate factorial recursively. if n == 1 % Terminating condition output = 1; return; end output = n * fact(n-1);
重要提示:递归函数必须包含结束条件(Terminating condition),否则会无限调用直到内存耗尽。
函数与脚本的区别
| 特性 | 脚本(Script) | 函数(Function) |
|---|---|---|
| 变量空间 | 使用基本工作空间 | 使用临时工作空间 |
| 输入参数 | 不需要 | 需要 |
| 输出参数 | 不需要 | 需要 |
| 变量持久性 | 变量保留在工作空间 | 临时变量随函数结束消失 |
1-5、搜寻路径(Path)
查看与设置路径
path % 查看 MATLAB 搜寻路径 which expo % 查询命令所在位置
添加路径
path(path, 'c:\datamlbook');
MATLAB 命令搜索顺序
-
视为使用者定义的变量
-
视为永久常数
-
检查是否为目前工作目录下的 M 档案
-
由搜寻路径寻找 M 档案
-
若找不到,发出错误讯息
自动设定搜寻路径的方法
-
修改 matlabrc.m:MATLAB 每次启动后自动执行此档案
-
建立 startup.m:在预设搜寻路径中放置此档案,存放启动时需执行的命令
1-6、资料的储存与载入
save 命令
save % 储存所有变量至 matlab.mat save filename % 储存所有变量至 filename.mat save filename x y z % 储存变量 x,y,z 至 filename.mat save filename x -ascii % 以 ASCII 格式储存(八位数) save filename x -ascii -double % 以 ASCII 格式储存(十六位数)
load 命令
load filename % 载入 filename.mat(二进制)或 filename(ASCII) load filename -ascii % 以 ASCII 格式载入
二进制与 ASCII 格式比较
| 特性 | 二进制格式 | ASCII 格式 |
|---|---|---|
| 文件扩展名 | .mat | 无固定扩展名 |
| 文件大小 | 较小 | 较大 |
| 载入速度 | 较快 | 较慢 |
| 可读性 | 不可读 | 可用文本编辑器查看 |
| 变量名保留 | 是 | 否(以文件名作为变量名) |
| 复数支持 | 完整 | 仅实部 |
示例:
clear all; x = 1:10; save testfile.dat x -ascii % 以 ASCII 格式储存 load testfile.dat % 载入档案