MATLAB 学习笔记

本文最后更新于 2025年8月14日 星期四 14:40

0 基础[1][2]

0.1 精度问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uint64(36028797018963968) % 保留精度

x = [4/3 1.2345e-6]

format short
% 1.3333 0.0000
format short e
% 1.3333e+000 1.2345e-006
format short g
% 1.3333 1.2345e-006
format long
% 1.33333333333333 0.00000123450000
format long e
% 1.333333333333333e+000 1.234500000000000e-006
format long g
% 1.33333333333333 1.2345e-006
format bank
% 1.33 0.00
format rat
% 4/3 1/810045
format hex
% 3ff5555555555555 3eb4b6231abfd271

0.2 内置常量

常量名
eps 浮点相对精度 \(\varepsilon=2^{-52}\)
realmin 最小浮点数 \(2^{-1022}\)
realmax 最大浮点数 \((2-\varepsilon)2^{1023}\)
Inf infinity
NaN 非数字

0.3 工作区变量的读写与查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
whos % 查看工作区变量

save myfile.mat a b c % 把矩阵a,b,c保存到数据文件myfile中
% 可以省略默认数据文件mat后缀
save myfile.mat
writematrix(a, 'myfile.txt')

% 把矩阵写到Excel文件Sheet2中B2开始的域中
warning('off')
writematrix(a,'data.xlsx','Sheet',2,'Range','B2')

% 把Sheet1中C3:F6中的数据赋给b
a = readmatrix('dataA_32.xlsx','Sheet',1,'Range','C3:F6')

a = load('myfile.mat');

clc % 清空命令行窗口
clear % 清空所有工作区变量
close all % 关闭所有图像窗口

常量可以被重新赋值,可以使用clear <常量名>恢复原始值。

0.4 查看文档

1
2
3
4
5
6
doc mean % 在单独的窗口中打开函数文档
help mean % 在命令行窗口中查看函数的简明文档
lookfor mean % 在命令行窗口中查找有关相应函数的指令

nargin mean % 查看函数的输入参数个数
nargout mean % 查看函数的输出参数个数

... 用于续行。


1 数组/矩阵/向量

1.1 基础

1.1.1 创建矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a = [1 2 3 4] % 创建行向量,逗号 (,) 或空格分隔各元素
a = [1 3 5; 2 4 6; 7 8 10] % 多行矩阵,分号分隔各行

eye(n) % 单位矩阵
zeros(5,1) % 创建一个由0组成的 5×1 列向量
ones(5,2) % 创建一个由1组成的 5×2 矩阵

randi([0,10],3) % 3阶[0,10]随机整数矩阵
rand(5,3) % 均匀分布的随机数组成的 5×3 矩阵
randn(5,3) % 正态分布的随机数组成的 5×3 矩阵
normrnd(mu,sigma,m,n) % 正态分布的随机数
exprnd(mu,m,n) % 指数分布的随机数
poissrnd(mu,m,n) % Poisson 分布的随机数
unifrnd(a,b,m,n) % 区间[a,b]上均匀分布的随机数

fix(10*rand(1,10)) % 只取随机数的十分位

linspace(n1,n2,n) % 在n1和n2间线性均匀距离产生n个数(缺省n=100)
logspace(n1,n2,n) % 在n1和n2间按照对数距离产生n个数(缺省n=50)

randperm(n) % 产生1到n的一个随机排列
perms([1:n]) % 产生1到n的所有全排列

1.1.2 基础运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
% 单一的算术运算符或函数来处理矩阵中的所有值:
a + 10 % 矩阵a全体元素+10
sin(a) % 正弦函数作用于矩阵a全体元素

a' % 转置矩阵
inv(a) % 矩阵的逆

a.*a % 对应元素相乘
a.^3 % 计算各个元素的3次方

A = [a,a] % 水平串联
A = [a;a] % 竖直串联

A(4,5) = 17 % 新建一个列

B = 0:10:100 % 创建等间距向量值,<start:step:end>,step可省略
% 0 10 20 30 40 50 60 70 80 90 100

magic(3) % 幻方矩阵
sum(A) % 生成包含行总和的行向量,即所有元素“往上顶”
sum(A,2) % 避免双重转置的其他方法,在 sum 函数中使用维度参数;输出同列向量

diag(A) % 求对角线和
fliplr(A) % 左右翻转矩阵
diag(fliplr(A)) % 求反对角线和
flipud(A) % 上下翻转矩阵

A(:,[1 3 2 4]) % 交换2、3列

rref(a) % 化成行最简形

方程组的 \(\begin{cases}x_1+2x_2+2x_3+x_4=0, \\2x_1+x_2-2x_3-2x_4=0, \\x_1-x_2-4x_3-3x_4=0,\end{cases}\) 的基础解系为 \([2,-2,1,0]',[5/3,-4/3,0,1]'\),即 \(b=\left(\begin{array}{cc} 2 & \frac{5}{3}\\ -2 & -\frac{4}{3}\\ 1 & 0\\ 0 & 1 \end{array}\right)\)

1
2
a = sym([1,2,2,1;2,1,-2,-2;1,-1,-4,-3]);
b = null(a) % 求符号基础解系

求超定方程组 \(\begin{cases}2x_1+4x_2=11,\\3x_1-5x_2=3,\\x_1+2x_2=6,\\2x_1+x_2=7,\end{cases}\) 的数值解。

解超定方程组的“\”可以用伪逆命令 pinv 代替,且 pinv 的使用范围比“\”更加广泛,pinv 也给出最小二乘解或最小范数解。只有 a 列满秩时,才能使用命令 a\b,否则只能使用命令 pinv(a)*b

1
2
3
4
a = [2,4;3,-5;1,2;2,1];
b = [11;3;6;7];
s = a \ b
pinv(a)*b

求一个正交变换 \(x=Py\),把二次型 \(f=2x_1 x_2+2x_1 x_3-2x_1 x_4-2x_2 x_3+2x_2 x_4+2x_3 x_4\) 化为标准形。

1
2
3
A = sym([0,1,1,-1;1,0,-1,1;1,-1,0,1;-1,1,1,0]);
[P1,D] = eig(A) % 把矩阵进行相似对角化
P2 = orth(P1) % 把矩阵正交规范化

1.2 元素引用

1
2
3
4
5
6
7
8
9
10
11
A(4,2) % 引用
A(8) % 从上到下数第8个

A(1:3,2) % 列出前3行及第2列中的元素
A(3,:) % 列出第3行中的所有列

sum(A(:,end)) % 最后一列求和

k = find(isprime(A))' % 使用一维索引选取矩阵A中的质数的位置
A(k) % 输出元素
A(k) = NaN % 将k用作赋值语句的左侧索引时,会保留矩阵结构

1.3 构建表

1
2
3
4
5
6
7
n = (0:9)' % 0~9的列向量

pows = [n n.^2 2.^n]

format short g
x = (1:0.1:2)';
logs = [x log10(x)] % 对数表

1.4 删除元素

1
2
3
4
5
6
7
8
A(:,2) = [] % 删除第二列
A(2:2:10) = [] % 其余元素构成一个行向量

x = x(isfinite(x)) % 删除Inf和NaN

x = x(abs(x-mean(x)) <= 3*std(x)) % 删除比均值大3倍标准差的离群值元素

A(~isprime(A)) = 0 % 将非素数置为0

1.5 多维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
p = perms(1:4); % 所有可能排列

% 生成 4! = 24 置换1:4。第 k 个置换为行向量 p(k,:)
A = magic(4);
M = zeros(4,4,24);

for k = 1:24
M(:,:,k) = A(:,p(k,:));
end

size(M) % 4 4 24
% 24个幻方矩阵

sum(M,1) % 通过改变第1个下标来计算总和,一个含有24个行向量的1×4×24数组

sum(M,2) % 一个含有24个列向量的4×1×24数组

1.6 元胞数组

1
2
3
4
5
6
7
8
9
10
C = {A sum(A) prod(prod(A))}
% 生成一个1×3元胞数组。这3个元胞包含幻方矩阵、列总和的行向量、所有元素的乘积。
% [4x4 double] [1x4 double] [20922789888000]

M = cell(8,1);
for n = 1:8
M{n} = magic(n);
end
% 1~8阶幻方
M{3} % 输出3阶

2 字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
strlength(A) % 求数组中每个字符串的长度

seq = 'GCTAGAATCC'
seq(4) % 引用
seq2 = [seq 'ATTAGAAACC'] % 串联

disp("hello world")

double(s)
char(s)

F = reshape(32:127,16,6)' % 按相应的6×16数组的形式排列
char(F) % 查看对应字符
char(F+128)

S = char('A','rolling','stone','gathers','momentum.')
C = {'A';'rolling';'stone';'gathers';'momentum.'}
C = cellstr(S)
S = char(C)

3 结构体

3.1 结构体基础

1
2
3
4
S(1) = struct('name','Jerry Garcia','score',70,'grade','C')
S(2) = struct('name','John Doe','score',100,'grade','A')

[N1 N2] = S.name

3.2 动态字段名称示例

算平均分。

初始化:

1
testscores.Ann_Lane.week(1:5) = [95 89 76 82 79];

使用 edit avgscore 新建脚本 avgscore.m

1
2
3
4
5
function avg = avgscore(testscores, student, first, last)
for k = first:last
scores(k) = testscores.(student).week(k);
end
avg = sum(scores)/(last - first + 1);

然后运行:

1
avgscore(testscores, 'Ann_Lane', 2, 5)

3.2 集合

1
2
3
4
5
6
A = [1 3 5]
B = [3 6 9]
max(A)
union(A,B) % 集合并,并排序

[minA,maxA] = bounds(A) % 存在多个输出参数

4 绘图

gtext('str hear') 在光标位置添加文字。

4.1 二维绘图 plot 函数

绘制 \([0,2\pi]\) 上的线性间距向量上的正弦函数:

1
2
3
4
5
6
7
8
9
x = linspace(0,2*pi);
y = sin(x);
xlabel("x")
ylabel("sin(x)")
plot(x,y,"r--")
title("Plot of the Sine Function")
legend("sin")

hold on % 使得下一个plot在同一窗格

4.2 三维绘图 surf/mesh 函数

对于给定的行向量和列向量 \(x\)\(y\),每个向量包含 \([-2,2]\) 范围内的 20 个点,计算 \(z=x\mathrm{e}^{-x^2-y^2}\)

1
2
3
4
5
x = linspace(-2,2,20);
y = x';
z = x .* exp(-x.^2 - y.^2);
surf(x,y,z) % 使用颜色显示曲面图的连接线和面
mesh(x,y,z) % 仅以颜色标记连接线条的线框曲面图

创建一个球。

1
2
3
4
[x,y,z] = sphere;
r = 2;
surf(x*r,y*r,z*r)
axis equal

4.3 多个绘图

4.3.1 subplot 函数

绘制二元函数 \(z=\sin⁡(xy)/xy\) 的三维网格图。

1
2
3
4
5
6
7
8
9
10
11
x = -5:0.2:5;
[x,y] = meshgrid(x); % 生成网格数据
z = (sin(x.*y)+eps)./(x.*y+eps); % 为避免0/0,分子分母都加eps
subplot(221);
mesh(x,y,z);
subplot(222);
fmesh(@(x,y) sin(x.*y)./(x.*y));
subplot(223);
surf(x,y,z);
subplot(224);
fsurf(@(x,y) sin(x.*y)./(x.*y));

4.3.2 多个绘图 tiledlayout 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
t = tiledlayout(2,2);
title(t,"Trigonometric Functions")
x = linspace(0,30);

nexttile
plot(x,sin(x))
title("Sine")

nexttile
plot(x,cos(x))
title("Cosine")

nexttile
plot(x,tan(x))
title("Tangent")

nexttile
plot(x,sec(x))
title("Secant")

4.4 隐函数

1
fimplicit(@(x,y) x.^2+y.^2/4-1,[-2,2,-2,2])

在区间 \([0,10\pi]\) 画出参数曲线 \(x=\sin⁡(t)\)\(y=\cos⁡(t)\)\(z=t\)

1
2
3
4
5
t = 0:pi/50:10*pi;
subplot(121);
plot3(sin(t),cos(t),t);
subplot(122);
fplot3(@(t) sin(t),@(t) cos(t),@(t) t,[0,10*pi]);

\(x^2+(y-5)^2=16\)\(x\) 轴旋转一周所形成的旋转曲面为 \(x^2+(\sqrt{y^2+z^2}-5)^2=16\),先把旋转曲面化成参数方程 \(x=4\cos⁡u\)\(y=(5+4\sin ⁡u)\cos ⁡v\)\(z=(5+4\sin ⁡u)\sin ⁡v\),其中 \(\alpha,\beta\in[0,2\pi]\)

1
2
3
4
5
6
7
8
f = @(x,y,z) x.^2 + (sqrt(y.^2 + z.^2)-5).^2-16;
subplot(121);
fimplicit3(f,[-4,4,-9,9,-9,9]);
x=@(u,v) 4*cos(u);
y=@(u,v) (5+4*sin(u)).*cos(v);
z=@(u,v) (5+4*sin(u)).*sin(v);
subplot(122);
fsurf(x,y,z);

4.5 更多与四维数据可视化

椭球面 \(x^2/9+y^2/4+z^2/6=1\)

1
ellipsoid(0,0,0,3,2,sqrt(6));
1
2
3
4
5
6
7
8
9
[x,y,z,v] = flow;
isosurface(x,y,z,v);

x = 1:20;
y = 1:10;
z = -10:10;
[x,y,z] = meshgrid(x,y,z);
v = x.^2.*y.*(z+1);
isosurface(x,y,z,v);

5 数值计算

5.1 积分

  1. \(D=\{(x,y)|x^2+y^2\leq x\}\)\(\int_D\sqrt{1-x^2-y^2}\mathrm{d}\sigma=\int_0^1\mathrm{d}x\int_{-\sqrt{x-x^2}}^{\sqrt{x-x^2}}\sqrt{1-x^2-y^2}\mathrm{d}y=0.6028\)

  2. \(\Omega=\{(x,y,z)|0\leq z\leq\sqrt{1-x^2-y^2}\}\)

\[ \begin{align} &\int_\Omega\frac{z^2\ln⁡( x^2+y^2+z^2+1)}{x^2+y^2+z^2+1}\mathrm{d}v \\ =&\int_{-1}^1\mathrm{d}x\int_{-\sqrt{1-x^2}}^{\sqrt{1-x^2}}\mathrm{d}y\int_0^{\sqrt{1-x^2-y^2}}\frac{z^2\ln⁡(x^2+y^2+z^2+1)}{x^2+y^2+z^2+1}\mathrm{d}z \\ =&0.1273 \end{align} \]

1
2
3
4
5
6
7
8
9
10
f=@(x,y) sqrt(1-x.^2-y.^2);
ymax=@(x) sqrt(x-x.^2);
ymin=@(x) -ymax(x);
integral2(f,0,1,ymin,ymax)

f=@(x,y,z) z.^2.*log(x.^2+y.^2+z.^2+1)./(x.^2+y.^2+z.^2+1);
ymax=@(x) sqrt(1-x.^2);
ymin=@(x) -ymax(x);
zmax=@(x,y) sqrt(1-x.^2-y.^2);
integral3(f,-1,1,ymin,ymax,0,zmax)

5.2 级数求和

1
2
syms n
symsum(1/n^2,n,1,inf)

参考文献

  1. MATLAB 帮助中心:https://ww2.mathworks.cn/help/MATLAB/. ↩︎
  2. 司守奎,孙玺菁. 数学建模算法与应用(第 3 版). ↩︎

MATLAB 学习笔记
https://blog.gtbcamp.cn/article/matlab/
作者
Great Thunder Brother
发布于
2022年10月22日
更新于
2025年8月14日
许可协议