Matlab learning
1. basic grammar
1.1 数据类型
1.1.1 cell
1. 创建
c = {42, rand(5), "abcd"}
2. 列表索引
要对表进行索引,可以使用圆括号 ()
返回子表,或者使用花括号 {}
提取内容。
1.1.2 matrix
(1)创建特殊矩阵:
① 0矩阵:zeros()
zeros(n) %创建一个n阶0矩阵
B=zeros(2,4) %创建一个2×4的0矩阵
B(1, : ) %第一行数组
C=zeros(2,3,4) %创建一个三维0矩阵
C( : , : , 2) %是一个2×3的二维0矩阵
②1矩阵:ones()
ones(n,'int8') % 规定数据类型的矩阵
X = ones(___,'like',p) % 指定 X 具有与数值变量 p 相同的数据类型、稀疏性和复/实性(实数或复数)
③ 单位矩阵:eye()
特别的
eye(3,5) % 非方阵单位矩阵结果如下
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
sz=[2,3] % 创建 2×3矩阵的向量
>> eye(sz)
1 0 0
0 1 0
④ 对角矩阵 diag()
% 创建对角矩阵
V = [1,3,4,5,0] % 向量
D = diag(v) % 主对角为V的5×5的对角矩阵
D = diag(v,k) % k<0,主对角线下方对角线k,如k=-2为第二条下对角线,7×7的矩阵;k>0,主对角线上方
x = diag(A) % A为矩阵,x返回的主对角线值
x = diag(A,k) % A的第k条对角线值
⑤ 随机矩阵rand()
X = rand(n) % n阶的(0,1)均匀分布的矩阵
X = rand(sz1,...,szN) % 多维度矩阵
r = -5 + (5+5)*rand(10,1) % 生成-5到5的均匀分布的10×1列向量
randi()均匀分布的伪随机整函数
r = randi([10 50],1,5) % 使用 randi 函数(而不是 rand)生成在 10 和 50 之间均匀分布的 5 个随机整数。
%% 函数用法
X = randi(imax)
X = randi(imax,n)
X = randi(imax,sz1,...,szN)
X = randi(imax,sz)
X = randi(___,typename)
X = randi(___,"like",p)
X = randi([imin,imax],___)
%% 生成标准正太分布的(-1,1)数组
X = randn
X = randn(n)
X = randn(sz1,...,szN)
X = randn(sz)
rng随机数生成器
rng(seed) % seed可以是0,1....
rng(seed,generator)
s = rng
% 如下举例
s=rng(1,'twister') % 创建结构体
rng(s);rand(1,3) % 选择生成器s,产生随机数
rand(1,3) % 初始生成器产生随机数,与上面产生的数组不同
rng(s);rand(1,3) % 选择生成器s,与第一个产生的数组相同
% generator生成器名称
值 生成器名称
'twister' 梅森旋转
'simdTwister' 面向 SIMD 的快速梅森旋转算法
'combRecursive' 组合多递归
'multFibonacci' 乘法滞后 Fibonacci
'philox' 执行 10 轮的 Philox 4×32 生成器
'threefry' 执行 20 轮的 Threefry 4×64 生成器
%% 整数随机排列
p = randperm(n) % 返回行向量,其中包含从 1 到 n 没有重复元素的整数随机排列。
p = randperm(n,k) % 返回向量k,产生1到n里的随机数,随机排成1×k向量,k<=n
p = randperm(s,___)
⑥ true () false()矩阵
用法同上,true矩阵值为1,false 为0
(2)矩阵索引及运算
特殊索引A([n,m]) % ???
A=magic(5)
>> A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
A([2,3])
>> 23 4
A(1:2:8,:)
% 1:2:9表示起始为1步长为2,结束为9,数组:[1,3,5,7,9]
% : 表示所有列举数
① blkdiag()
%% 返回通过沿 B 的对角线对齐输入矩阵 A1,...,AN 创建的分块对角矩阵。
A1 = ones(2,2);
A2 = 2*ones(3,2);
A3 = 3*ones(2,3);
B = blkdiag(A1,A2,A3)
>>
B =
1 1 0 0 0 0 0
1 1 0 0 0 0 0
0 0 2 2 0 0 0
0 0 2 2 0 0 0
0 0 2 2 0 0 0
0 0 0 0 3 3 3
0 0 0 0 3 3 3
② 矩阵串联
C = cat(dim,A1,A2,…,An) % dim串联维度,dim=1等同于[A1;A2;....]和horzcat();dim=2等同于[A1,A2,A3....]和vertchat()
③ 重复
%% 重复向量
v = [1 2 3 4];
u = repelem(v,3)
% u=[ 1 1 1 2 2 2 3 3 3 4 4 4]
u = repelem(v,[2 2 3 3])
% u= [1 1 2 2 3 3 3 4 4 4]
%% 重复矩阵
A = [1 2; 3 4]
B = repelem(A,3,2) % 每个元素列重复2次,行重复3次
>>
B = 6×4
1 1 2 2
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
3 3 4 4
④ repmat()
参考:重复数组副本 - MATLAB repmat - MathWorks 中国
(2)矩阵运算
区别
.* 与 * 的区别
* 矩阵乘法
.* 矩阵对应元素相乘
其他:算术运算 - MATLAB & Simulink - MathWorks 中国
1.1.3 struct
1. 创建
data.x = linspace(0,2*pi);
data.y = sin(data.x);
data.title = 'y = sin(x)'
或
s = struct(field,value)
s = struct(field1,value1,...,fieldN,valueN)
field = 'f';
value = {'some text';
[10, 20, 30];
magic(5)};
s = struct(field,value)
s.f % 输出所有value值
s(1).f % 输出value的第一个值
或
s = struct('a',{},'b',{},'c',{})
1.1.4 table
1. 列表创建
表 - MATLAB & Simulink - MathWorks 中国
2. 列表索引
要对表进行索引,可以使用圆括号 ()
返回子表,或者使用花括号 {}
提取内容。
1.2 创建网格
①linspace
%% 创建线性等间距的向量
y = linspace(-5,5); % 生成从-5到5的100个等间距点
y = linspace(-5,5,10); % 生成从-5到5的10个等间距点
%% 创建对数的间距点向量
y = logspace(a,b) % 10^a 和 10^b(10 的 N 次幂)之间的 50 个对数间距点组成的行向量
y = logspace(a,b,n) % 10^a 和 10^b(10 的 N 次幂)之间的n 个对数间距点组成的行向量
y = logspace(a,pi) %在 10^a 和 pi 之间生成 50 个点s
freqspace
② freqspace
参考:频率响应的频率间距 - MATLAB freqspace - MathWorks 中国
③ meshgrid()
% 列如
[X,Y] = meshgrid(x,y) % 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵,每一行是 x 的一个副本;Y 也是一个矩阵,每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。
[X,Y] = meshgrid(x) % 等同于[X,Y] = meshgrid(x,x)
%% 绘制三维图形
x = -2:0.25:2;
y = x;
[X,Y] = meshgrid(x);
F = X.*exp(-X.^2-Y.^2);
surf(X,Y,F)
④ ndgrid()
N 维空间中的矩形网格 - MATLAB ndgrid - MathWorks 中国
1.3 文件调用
1.3.1 数据文件
(1)数据保存
save data1 a % 创建data1.mat数据文件,将a保存到data1
load data1 % 加载文件数据
2. 拟合与插值
2.1 曲线拟合
% 多项式拟合函数
p = polyfit(x,y,n) % p 中的系数按降幂排列,p 的长度为 n+1
[p,S] = polyfit(x,y,n) % 还返回一个结构体 S,后者可用作 polyval 的输入来获取误差估计值
[p,S,mu] = polyfit(x,y,n)
2.2 曲线插值
一维线性插值
% 向量 x 包含样本点,v 包含对应值 v(x)。向量 xq 包含查询点的坐标,vq返回xq对应值
vq = interp1(x,v,xq)
% 指定备选插值方法:'linear'、'nearest'、'next'、'previous'、'pchip'、'cubic'、'v5cubic'、'makima' 或 'spline'。默认方法为 'linear'
% nearest 光滑度差,速度快
% spline 光滑,内存小,运行慢
vq = interp1(x,v,xq,method)
% 外插值 可将 extrapolation = 'extrap'
vq = interp1(x,v,xq,method,extrapolation)
二维插值
Vq = interp2(X,Y,V,Xq,Yq)
2.3 三次样条插值
spline
s = spline(x,y,xq)
% 返回一个分段多项式结构体以用于 `ppval` 和样条实用工具 `unmkpp`
pp = spline(x,y)
yi = ppval(pp,xi) % 在查询点 xq处计算分段多项式 pp
[breaks,coefs,L,order,dim] = unmkpp(pp)
3. 绘图
3.1 plot 函数
一参数形式:plot(Y)
-
如果
Y
是向量,x 轴的刻度范围是从 1 至length(Y)
。 -
如果
Y
是矩阵,则plot
函数绘制Y
中各列对其行号的图。x 轴的刻度范围是从 1 到Y
的行数。 -
如果
Y
是复数,则plot
函数绘制Y
的虚部对Y
的实部的图,使得plot(Y)
等效于plot(real(Y),imag(Y))
。
二参数形式plot(x,y)
-
如果
X
和Y
都是向量,则它们的长度必须相同。plot
函数绘制Y
对X
的图。 -
如果
X
和Y
均为矩阵,则它们的大小必须相同。plot
函数绘制Y
的列对X
的列的图。 -
如果
X
或Y
中的一个是向量而另一个是矩阵,则矩阵的各维中必须有一维与向量的长度相等。如果矩阵的行数等于向量长度,则plot
函数绘制矩阵中的每一列对向量的图。如果矩阵的列数等于向量长度,则该函数绘制矩阵中的每一行对向量的图。如果矩阵为方阵,则该函数绘制每一列对向量的图。 -
如果
X
或Y
之一为标量,而另一个为标量或向量,则plot
函数会绘制离散点。但是,要查看这些点,您必须指定标记符号,例如plot(X,Y,'o')
-
‘o’ 表示线属性
三参数形式plot(X,Y,LineSpec)
plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)
lineSpec属性:
示例: '--or'
是带有圆形标记的红色虚线
线型 | 说明 |
---|---|
- | 实线 |
-- | 虚线 |
: | 点线 |
-. | 点划线 |
标记 | 说明 |
---|---|
'o' | 圆圈 |
'+' | 加号 |
'*' | 星号 |
'.' | 点 |
'x' | 叉号 |
'_' | 水平线条 |
`’ | '` |
's' | 方形 |
'd' | 菱形 |
'^' | 上三角 |
'v' | 下三角 |
'>' | 右三角 |
'<' | 左三角 |
'p' | 五角形 |
'h' | 六角形 |
颜色 | 说明 |
---|---|
y | 黄色 |
m | 品红色 |
c | 青蓝色 |
r | 红色 |
g | 绿色 |
b | 蓝色 |
w | 白色 |
k | 黑色 |
绘图样式:
Colordef : 图形整体样式
grid 显示格栅
3.2 加标签text,gtext
text(x,y,txt) % 二维坐标x,y位置
text(x,y,z,txt) % 三维坐标
gtext(str) % 鼠标可以拖动的
gtext(str,Name,Value) % specifies text properties using one or more name-value pair arguments. For example, 'FontSize',14 specifies a 14-point font.
3.3 加图例legend
legend('cos(x)','cos(2x)')
3.4 box显示三维坐标坐标线
box on : displays the box outline around the current axes by setting their Box
property to 'on'
. This property value is the default for GeographicAxes
objects.
3.4 加标签
xlabel(str),ylabel(str)
title(str)
可以手动调整
3.5 定制坐标轴
(1) axis设置坐标参数
axis(limits)
% limits = [xmin,xmax,ymin,ymax] % 坐标值限制
axis style
axis mode
axis ydirection
axis visibility
lim = axis
(2) 绘制双y坐标
% 命令
yyaxis left
yyaxis right
% 举例
x = linspace(0,10);
y = sin(3*x);
yyaxis left
plot(x,y)
z = sin(3*x).*exp(0.5*x);
yyaxis right
plot(x,z)
ylim([-150 150])
(3) 极坐标
polar 新版推荐 polarplot
% 函数用法
polarplot(theta,rho) % 极角,极径
polarplot(theta,rho,LineSpec)
polarplot(theta1,rho1,...,thetaN,rhoN)
polarplot(theta1,rho1,LineSpec1,...,thetaN,rhoN,LineSpecN)
3.6 多重图行或多窗口
1) 一个图形窗口绘制同坐标多曲线
hold on
hold off
ishold:判断是否打开
tiledlayout(2,1) 一窗口绘制不同坐标曲线
2) 开多个图形窗口
h1 = figure % 句柄
h2 = figure
figure(h2) % 打开窗口
3)图形窗口内容
close(h1) %关闭图形窗口
clf %清除图形窗口内容
4) 子图
subplot(m,n,p) % 生成mxn的图形图形窗口,激活窗口p,对第p个子图进行操作
% 举例
subplot(2,1,1);
x = linspace(0,10);
y1 = sin(x);
plot(x,y1)
subplot(2,1,2);
y2 = sin(5*x);
plot(x,y2)
3.7 交互式绘图工具
% 缩放工具
zoom on
zoom off
zoom out
% 在曲线上采点
[x,y] = ginput(n) % 采取n个点
3.8 快速绘图
% 函数表达式f,f可以是数组函数f='[f1,f2,f3]'
fplot(f) % y = f(x) over the default interval [-5 5] for x.
fplot(f,xinterval)
fplot(funx,funy)
fplot(funx,funy,tinterval)
% 老版本
fplot('sin(x)',[-10,10])
4. 多项式
创建多项式或求矩阵特征值
% 创建多项式系数,即创建出了多项式,为0的系数也要写出,如p数组
p = [1,3,0,9]
% 多项式求根,返回列向量r
r = roots(p)
% 根值r
r =
-3.6687 + 0.0000i
0.3343 + 1.5302i
0.3343 - 1.5302i
% 逆运算:由多项式的根构建相应多项式函数
pp=poly(r)
% 返回值
pp = 1.0000 3.0000 0.0000 9.0000
% 矩阵A特征向量P
P = ploy(A)
多项式加减:同数组运算,注意不同项要补0项运算
多项式乘法:conv(a,b)
(
5
x
2
+
3
x
−
1
)
×
(
3
x
3
−
2
x
2
+
x
)
(5x^2+3x-1)×(3x^3-2x^2+x)
(5x2+3x−1)×(3x3−2x2+x)
a = [0 5 3 1];
b = [3 2 1 0];
% a,b系数的卷积,函数conv支持多项式乘法(执行两个数组的卷积) ,
c = conv(a,b)
c =[ 0 15 19 14 5 1 0]
多项式除法:deconv(a,b) ???
% b向量不能为0
[d,r] = deconv(a,b)
% a除以b ,d为商多项式和r为余数
d = 0
r = 0 5 3 1
多项式导数:polyder§
% 多项式a的导数
de_a = polyder(a)
% 多项式a*b卷积的导数
de_ab = polyder(a,b)
% 对有理多项式求导
[b1,a1]=polyder(b,a)
多项式积分:q = polyint§
多项式估值:**y = polyval(p,x) **即计算多项式p的x值对应的y
% x 是数组
y = polyval(a,x)
% 以矩阵方式返回多项式 p 的计算值。此计算方式等同于使用多项式 p 替换矩阵 X
Y = polyvalm(p,X)
有理多项式:residue和polyder
% 计算以如下形式展开的两个多项式之比的 部分分式展开式 的留数、极点和直项
[r,p,k] = residue(b,a)
% 逆运算
[b,a] = residue(r,p,k)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqZrqUAB-1669171339308)(C:\Users\YP\AppData\Roaming\Typora\typora-user-images\image-20221118161410308.png)]
14 5 1 0]
多项式除法:**deconv(a,b)** ???
```matlab
% b向量不能为0
[d,r] = deconv(a,b)
% a除以b ,d为商多项式和r为余数
d = 0
r = 0 5 3 1
多项式导数:polyder§
% 多项式a的导数
de_a = polyder(a)
% 多项式a*b卷积的导数
de_ab = polyder(a,b)
% 对有理多项式求导
[b1,a1]=polyder(b,a)
多项式积分:q = polyint§
多项式估值:**y = polyval(p,x) **即计算多项式p的x值对应的y
% x 是数组
y = polyval(a,x)
% 以矩阵方式返回多项式 p 的计算值。此计算方式等同于使用多项式 p 替换矩阵 X
Y = polyvalm(p,X)
有理多项式:residue和polyder
% 计算以如下形式展开的两个多项式之比的 部分分式展开式 的留数、极点和直项
[r,p,k] = residue(b,a)
% 逆运算
[b,a] = residue(r,p,k)
[外链图片转存中…(img-bqZrqUAB-1669171339308)]