MATLAB
1 基础语法
1.1 界面
MATLAB是一种解释型语言,软件下面的命令行窗口就是其解释器的交互窗口,运行脚本后的输出也会显示在这里。
1.2 一些常用指令
-
clear 清空所有变量的值
-
clear x 清楚指定变量的值
-
clc 清空命令行的输出
-
help 命令行窗口中函数的帮助例如函数、方法、类、工具箱或变量,例:
>> help fdatool fdatool Filter Design & Analysis Tool. The fdatool command will be removed in a future release. Use filterDesigner instead. fdatool launches the Filter Design & Analysis Tool (FDATool). FDATool is a Graphical User Interface (GUI) that allows you to design or import, and analyze digital FIR and IIR filters. If the DSP System Toolbox is installed, FDATool seamlessly integrates advanced filter design methods and the ability to quantize filters. % Example: % Launch Filter Design & Analysis Tool. fdatool; % Lanches fdatool See also filterDesigner, fvtool, sptool.
1.3 基本语句
赋值:与大部分编程语言一样,变量名=值,直接使用即可,无须提前声明,无需严格指定变量的类型。
>> data = 1
data =
1
>> data = "hello world"
data =
"hello world"
>> data = "hello";
语句末尾的分号可以加也可以不加,不加分号会在命令行窗口直接输出该值。
如果语句很长,可用续行符 “…
”(三个点)续行,三个点前面加空格;
>> data = 1;
>> data = 1 + 22 + 333 + 4444 + ...
55555
data =
60355
变量命名,字母数字下划线组成,不能以数字开头变量名区分字母的大小写不能与一些关键词冲突。
MATLAB中有一些预定义的变量:
pi(圆周率),inf/Inf(无穷大),nan/NaN(00\frac{0}{0}00之类的),i/j(虚数)
>> pi
ans =
3.1416
>> a = 1/0
a =
Inf
>> b = 0/0
b =
NaN
>> c = 2j
c =
0.0000 + 2.0000i
ans也是预定义的变量,它的类型不固定,值不固定,没有变量接收运算返回值时,ans会作为该次计算的返回值,直到被清空或下次出现该情况时发生变化。
>> a = 1; b = 2;
>> a + b;
>> ans
ans =
3
>> max(a,b);
>> ans
ans =
2
运算符:加减乘除无特殊的,^是幂运算,除号有两个方向的
>> 2^2
ans =
4
>> 7/3
ans =
2.3333
>> 7\3
ans =
0.4286
位运算:与bitand,或bitor,异或bitxor,非bitnot,位移bitshift
循环,条件语句,用end结尾
for i=1:10
if( i > 3 )
a = 1;
elseif( i == 2 )
a = 2;
else
a = 3;
end % if的end
end % for的end
1.4 存储变量和值
在MATLAB中可以将变量和它的值存储到后缀为mat的文件中,下次加载后可以继续使用
>> a = "hello";
>> a
a =
"hello"
>> save("mydata.mat","a")
>> clear % 清空变量值
>> a
函数或变量 'a' 无法识别。
>> load("mydata.mat")
>> a
a =
"hello"
2 矩阵运算
2.1 创建矩阵
直接赋值:数据放在“[]”内,用“;”作为矩阵行与行之间的分隔符,直接输入的时候分号可以用 回车 代替“,”作为数之间的分割符,可以不要,***size()***可以返回矩阵的维度
>> a = [1 2 3; 4 5 6]
a =
1 2 3
4 5 6
>> a = [1 2 3
4 5 6]
a =
1 2 3
4 5 6
>> a = [1 2 3
4 5 6]
a =
1 2 3
4 5 6
>> b = [1, 2, 3; 4, 5, 6]
b =
1 2 3
4 5 6
>> size(a)
ans =
2 3
全零矩阵"ones()“,全一矩阵"zeros()”
>> ones([3,1])
ans =
1
1
1
>> ones([1,3])
ans =
1 1 1
>> zeros(3)
ans =
0 0 0
0 0 0
0 0 0
创建等间隔一维向量**linspace(起始,截止,个数)**或 起始:步长:截止,步长默认为1
>> n = linspace(1,10,4)
n =
1 4 7 10
>> t = 1:3:10
t =
1 4 7 10
>> t = 1:5
t =
1 2 3 4 5
创建对角矩阵
>> a = 1:5
a =
1 2 3 4 5
>> diag(a)
ans =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
访问矩阵中的部分元素,(起始行:截止行,起始列:截止列)
>> 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,2)
ans =
6
>> a(1:2,2)
ans =
2
6
>> a(1:2)
ans =
1 5
>> a(1,:)
ans =
1 2 3 4
>> a(:,1)
ans =
1
5
9
重构数组成矩阵reshape(数组,[行数,列数])
>> a = [1,2,3,4,5,6];
>> reshape(a, [2,3])
ans =
1 3 5
2 4 6
2.2 矩阵计算
矩阵相加“+”、“-”,维度相同即可
矩阵乘法用“*”,对于A∗BA * BA∗B要求A的列数与B的行数相同
>> a = [1,2];
>> b = [1,2,3;4,5,6];
>> size(a)
ans =
1 2
>> size(b)
ans =
2 3
>> a*b
ans =
9 12 15
>> b*a
错误使用 *
用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素
相乘,请使用 '.*'。
相关文档
矩阵中元素一一对应相乘“.*”,给矩阵乘以一个数相当于给矩阵中所有元素都乘这个数
>> a = [1,2;3,4];
>> b = [2,3;1,2];
>> 2*a
ans =
2 4
6 8
>> a.*b
ans =
2 6
3 8
矩阵转置和矩阵的逆
>> a = [1,2;3,4];
>> a'
ans =
1 3
2 4
>> inv(a)
ans =
-2.0000 1.0000
1.5000 -0.5000
行列式计算
>> a = [0,1;2,0];
>> det(a)
ans =
-2
求线性方程组的解
[21−511−507021−116−1−4]∗x=[13−960]
\left[ \begin{matrix} 2&1&-5&1\\1&-5&0&7\\0&2&1&-1 \\ 1&6&-1&-4 \end{matrix} \right]*x=\left[ \begin{matrix} 13\\-9\\6\\0 \end{matrix} \right]
21011−526−501−117−1−4∗x=13−960
>> A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
>> b=[13,-9,6,0]';
>> x=A\b
x =
-66.5556
25.6667
-18.7778
26.5556
求矩阵特征值
>> a = [1,0;0,2];
>> eig(a)
ans =
1
2
3 绘图
>> help plot
plot - 二维线图
此 MATLAB 函数 创建 Y 中数据对 X 中对应值的二维线图。 如果 X 和 Y 都是向量,则它们
的长度必须相同。plot 函数绘制 Y 对 X 的图。 如果 X 和 Y 均为矩阵,则它们的大小必须相
同。plot 函数绘制 Y 的列对 X 的列的图。 如果 X 或 Y 中的一个是向量而另一个是矩阵,则
矩阵的各维中必须有一维与向量的长度相等。如果矩阵的行数等于向量长度,则 plot 函数绘制矩
阵中的每一列对向量的图。如果矩阵的列数等于向量长度,则该函数绘制矩阵中的每一行对向量的
图。如果矩阵为方阵,则该函数绘制每一列对向量的图。 如果 X 或 Y 之一为标量,而另一个为标
量或向量,则 plot 函数会绘制离散点。但是,要查看这些点,您必须指定标记符号,例如
plot(X,Y,'o')。
plot(X,Y)
plot(X,Y,LineSpec)
plot(X1,Y1,...,Xn,Yn)
plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn)
plot(Y)
plot(Y,LineSpec)
plot(___,Name,Value)
plot(ax,___)
h = plot(___)
- xlabel(“”)----------横坐标标签
- ylabel(“”)----------纵坐标标签、
- title(“”)-----------图像的标题
- figure(“”)----------创建新的图像窗口
t = 0:0.001:10;
sint = sin(t);
cost = cos(t);
直接绘制sint和cost
figure(1) % 默认用数字命名
plot(t,sint)
xlabel("t")
ylabel("value")
title("sint value-t")
grid on; % 显示网格
figure('Name','Results') % 命名图的名字
plot(t,cost)
xlabel("t")
ylabel("value")
title("cost value-t")
sint和cost画在同一张图
figure("Name","merge1")
plot(t,sint,t,cost) % x1,y1,x2,y2
xlabel("t")
ylabel("value")
title("value-t")
% -------用hold on也可以实现-----------
% plot(t,sint)
% hold on;
% plot(t,cost)
或
figure("Name","merge2")
plot(t,[sint;cost])
xlabel("t")
ylabel("value")
title("value-t")
放在同一个figure,独立绘制,使用subplot(m,n,p),即绘制m行n列第p个
figure("Name","together")
subplot(2,1,1)
plot(sint)
subplot(2,1,2)
plot(cost)
4 程序设计
常用的有这三种:
这些代码文件的后缀均为.m
4.1 脚本
运行脚本文件时可以直接点击软件上方的运行,或在命令行中输入脚本文件的文件名按回车。
运行脚本的过程本质是在命令行中逐句运行。
实时脚本后缀为.mlx,它类似于Python的jupyter notebook,可以分节运行程序、也可以添加一些文字说明和公式,运行当前节程序的快捷键“ctrl+enter”
4.2 函数
点击“新建”->“函数”可以直接获得一个如下的函数模板,函数名要与文件名对应,一个函数文件里不支持创建多个函数。
大部分MATLAB版本不支持脚本文件中定义函数使用,在2024a (R2024a)版本开始可以支持局部函数的使用。https://www.bilibili.com/video/BV1HK421h7EQ/?spm_id_from=333.999.0.0&vd_source=9ed9bf37b3629d146bc4d30bb523c4b9
关于函数调用:如果函数和你运行的脚本处于同一级工作目录下,可以直接调用,否则需要写**addpath(“路径”)**才可以正常调用。
4.3 面向对象
点击“新建”->“类”可以直接获得一个类的模板,调用方式与函数类似,也与要addpath(“路径”),properties与end之间定义类的属性,methods与age之间定义类的方法,methods中需要有一个方法与类的名称一致作为构造函数。
定义了方法来改变对象的值,需要有返回值,否则没用。
定义如下类存放在**.\myclass**文件夹中
classdef person
properties
age
end
methods
function obj = person(age)
%PERSON 构造此类的实例
obj.age = age;
end
function age_plus(obj)
% age_plus 年龄加一
% 没有返回值,看上去变了实际上没改变
obj.age = obj.age + 1;
end
function obj = age_plus_with_ret(obj)
% age_plus 年龄加一
obj.age = obj.age + 1;
end
end
end
main.m
addpath(".\myclass\")
xiaoMing = person(18);
age_init = xiaoMing.age; % 初始化的值
xiaoMing.age_plus();
age_plust = xiaoMing.age; % 方法没有返回值
xiaoMing.age_plus_with_ret();
age_without_ret = xiaoMing.age; % 方法有返回值但是给ans了
xiaoMing = xiaoMing.age_plus_with_ret();
age_with_ret = xiaoMing.age; % 正确操作
xiaoMing.age_plus_with_ret();
age_without_ret = xiaoMing.age; % 方法有返回值但是给ans了
xiaoMing = xiaoMing.age_plus_with_ret();
age_with_ret = xiaoMing.age; % 正确操作
### 4.4 结构体
直接命名即可。
```matlab
params.num_antennas_tx = 4; % 发射天线数量
params.num_antennas_rx = 4; % 接收天线数量
params.modulation_order = 4; % 调制阶数
params.Rs = 2; % 码元速率(K)
params.snr_dB = 20; % 信噪比(dB)
params.num_symbols = 10; % 符号数
MATLAB中的彩蛋
>> logo
>> image
>> penny
>> earthmap
>> life
>> xpbombs
>> why % 可以多试几次
>> travel
>> spy