MATLAB基础知识
目录
MATLAB中符号意义
MATLAB中空格和逗号都可以作为数组各行中元素的分隔符,逗号,
还可以作为函数参数的分隔符,分号;
为各行元素的分隔符以及不显示计算结果命令行的结尾,
a = [1 2 3]
b = [1,2,3]
c = [1 2 3; 4 5 6]; %使用分号';'则不输出c的结果
冒号:
生成一维数值数组以及表示数组的全部元素a=1:2:10 %output:一维数组1 3 5 7 9
;
单引号用于括住字符串 a='hello'
;
圆括号用于引用数组元素以及确定运算的先后次序 a(1) %指定数组元素
;
方括号[]
用于构成向量和矩阵 a=[1, 2, 3] %构成数组
;
大括号{}
用于构成元胞数组 a {1 2}=[1 2 3] %元胞数组
;
下划线_
可以构成变量 a_1=2
;
续行号...
用于把后面的行与改行连接以构成一个命令 x=2+3*...
(7.8+9)
@
形成函数句柄以及形成用户对象类目录 f=@ sin %函数句柄
惊叹号!
调用操作系统运算 ! dir %运行dir命令
在命令行窗口>>>
后按方向键
↑
\uparrow
↑ 和
↓
\downarrow
↓ 可以浏览历史命令;
Ctrl+
←
\leftarrow
← 或 Ctrl+
→
\rightarrow
→ 可以将光标移动一个单词;
Ctrl + C可以中断MATLAB命令的运行
常用设置
桌面清理大师
clc:用于清空命令行窗口所有的显示内容
clear:清空变量
clear var1 var2 %删除指定变量,变量之间用空格间隔
clear all %删除所有变量
clf:清楚
beep:发出beep的声音
close:关闭窗口
如果上一个程序彻底不再使用,则新的程序可以使用clc; clear all; close all
开头清楚所有数据并关闭全部窗口。
文件格式
MATLAB常用的文件格式有
程序文件即M文件,文件扩展名为.m,M文件包括脚本(Script)文件和函数(Function)文件,MATLAB工具箱中的大部分函数都是M文件。
图形文件(Figure)的扩展名为.fig
模型文件(Model)的扩展名为.mdl
数据文件即MAT文件,其文件的扩展名为.mat,用来保存工作空间的数据变量。
将工作空间中的数据存入MAT文件
save 文件名 变量1 变量2 … 参数
变量名可以省略,省略时保存全部变量,参数为保存的方式,‘-ASCII’表示保存为8位ASCII文本文件、’-append’表示在文件莫问添加变量、'-mat’表示二进制.mat文件
>> a = 1:2:10; >> b = [1 2 3;4 5 6]; >> c = 'hello'; >> save file1 a b %把变量a,b保存到File1.mat文件中 >> save file1 c -append %把变量c添加到File1.mat文件中 >> clear %将工作空间变量清空 >> load file1 >> save file
显示位数设置
使用format
命令可以进行数值显示格式的设置,format命令种类较多,其中 format short
(默认显示方式)保证小数点后5为有效数字,大于1000的实数用含5为有效数字的科学计数法表示,format short e
不论数据大小均使用5为有效数字的科学计数法表示,format short g
会自动在 short 和 short e 之间选择合适的计数方式。将short改为long则显示15位有效数字
>> pi
ans = 3.1416
>> format long
>> pi
ans = 3.141592653589793
>> format short 3
>> pi
3.1416e+00
常用命令
who 列出内存中的变量名 type 显示指定文件的内容 whos 列出内存中的变量名及其性质 which 列出文件所在的目录 clear 清除内存 dbtype 显示文件中带行号的内容 clc 清除工作窗中的显示内容 disp 显示文字或变量内容 clf 清除图形窗中的显示内容 edit 编辑指定的文件 what 查看指定目录下的文件名 close all 关闭所有窗口 exist 查找变量或文件 dir 列出指定目录下的文件 \begin{array}{llll}\text { who } & \text { 列出内存中的变量名 } & \text { type } & \text { 显示指定文件的内容 } \\ \text { whos } & \text { 列出内存中的变量名及其性质 } & \text { which } & \text { 列出文件所在的目录 } \\ \text { clear } & \text { 清除内存 } & \text { dbtype } & \text { 显示文件中带行号的内容 } \\ \text { clc } & \text { 清除工作窗中的显示内容 } & \text { disp } & \text { 显示文字或变量内容 } \\ \text { clf } & \text { 清除图形窗中的显示内容 } & \text { edit } & \text { 编辑指定的文件 } \\ \text{what} & \text { 查看指定目录下的文件名 } & \text { close all } & \text { 关闭所有窗口 } \\ \text{exist}&\text { 查找变量或文件 } & \text { dir } & \text { 列出指定目录下的文件 }\end{array} who whos clear clc clf whatexist 列出内存中的变量名 列出内存中的变量名及其性质 清除内存 清除工作窗中的显示内容 清除图形窗中的显示内容 查看指定目录下的文件名 查找变量或文件 type which dbtype disp edit close all dir 显示指定文件的内容 列出文件所在的目录 显示文件中带行号的内容 显示文字或变量内容 编辑指定的文件 关闭所有窗口 列出指定目录下的文件
比较文件
在当前目录浏览器窗口中选择"example.m",单击鼠标右键,在弹出的菜单中选择"Compare against(比较对象)“,并在文件夹中选择比较的文件"example2.m”,则出现比较文件窗口。
数据类型
MATLAB的基本数据类型
Char 字符型;Numeric数值型 (single单精度型, int8, int16, …) ;cell元胞型;structure结构体型;jave classes Java类;Function handle函数句柄
特殊变量表
ans
运算结果的默认变量名;i
或j
虚数单位;pi
圆周率pi;eps
浮点数的相对误差;inf
或INF
无穷大,如1/0;NaN
或nan
不定值,如0/0、
∞
/
∞
\infty/\infty
∞/∞、
0
×
∞
0\times\infty
0×∞;nargin
函数的输入变量数目;nargout
函数的输出变量数目;realmin
最小的可用正实数 2.225073858507201e-308
;realmax
最大的可用正实数 1.797693134862316e+308
矩阵和数组
空数组(empty array):没有元素的数组
标量(scalar):是指 1 × 1 1\times1 1×1的矩阵,即为只含一个数的矩阵
向量(vector):是指 1 × n 1\times n 1×n或 n × 1 n\times 1 n×1的矩阵,即为只有一行或一列的矩阵
矩阵(matrix):是一个矩形的 m × n m\times n m×n数组,即二维数组
数组(array):是指多维数组 m × n × k × … m\times n\times k\times \dots m×n×k×…,矩阵和向量都是数组的特例
创建空数组
>> a = []; %output: a = []
>> whos a
Name Size Bytes Class Attributes
a 0x0 0 double
向量
如果要生成等差行向量
from: step: to
>> a = -2.5:0.5:2.5
>> a = 5:-1:1 %step为负数时可以创建降序的数组
linspace(a,b,n) %生成线性等分向量,a,b为始末值,n为元素个数
logspace(a,b,n) %生成对数等分向量,10a,10b为始末值,按对数等分
>> x = linspace(0,3,10) %将0~3分成10份
>> y = logspace(-2,2,5) %将0.01~100分成5份
矩阵
矩阵是m行n列的二维数组
>> a = [1:4;linspace(2,5,4);9:-1:6]
>> b = [1 2 3
4 5 6] %使用回车分隔符
特殊矩阵和数组
magic(N) %产生N阶魔方矩阵(矩阵的行、列和对角线上元素相同)
eye(m,n) %产生m*n阶单位矩阵,对角线全为1
zeros(d1,d2,d3,...) %产生d1*d2*d3...的全0数组
ones(d1,d2,d3,...) %产生d1*d2*d3...的全1数组
rand(d1,d2,d3,...) %产生均匀分布的随机数组,元素取值范围0.0~1.0
randn(d1,d2,d3,...) %产生正态分布的随机数组
列阵
列阵是多维数组,对矩阵排列堆积得到三维列阵,矩阵中两个维度称为行和列,我们把这第三个维度的指标称为层,同样对三维列阵排列堆积为四维列阵,第四个维度的指标称之为块。数组中行、列、层、块…统称为维指标(dim),dim=1对于行指标,dim=2(列指标),3(层指标),4(块指标),…。
m行n列l层k块…的列阵的总元素数目为 m × n × l × k m\times n\times l\times k m×n×l×k。
MATLAB对于列阵的显示方法为将列阵依次按矩阵输出,生成4行3列2层的全一三维列阵ones(4,3,2)
,则命令行窗口会显示 ans(:, :, 1)
和ans(:, :, 2)
两个全一矩阵。
数组操作
提取元素
-
全下标方式
a(i,j,...) %在n维数组通过行下标、列下标(高维矩阵还有更多下标)表示
-
单下标方式
数组元素用单下标引用,即使把数组元素的所有列按先左后右的词序连接成"一维长列",然后对元素位置进行编号。
以 m × n m\times n m×n 的矩阵a为例,元素 a(i,j) 对应的单下标 = ( i − 1 ) × n + i = (i-1)\times n+i =(i−1)×n+i。
子矩阵的产生
-
用全下标方式
>> a = magic(4) %用魔方矩阵为例 >> a([1 2],[3 4]) >> a(1:2,3:4) >> a(1:2,3:end) >> a(linspace(1,2,2),3:4)
-
用单下标方式
>> a([10;11;12]) >> a(10:12)' %'表示转置 >> a(10:end)' >> a([10;11;end])
-
逻辑索引方式
在 n × m n\times m n×m 矩阵中创建 1 × m 1\times m 1×m 和 1 × n 1\times n 1×n 两个逻辑数组(元素值为0或1的数组)
>> a = magic(4); %用魔方矩阵为例 >> la1 = logical([1 1 1]) %将数值型变量转换为逻辑型 la1 = 1 1 1 >> la2 = logical([0 0 0 1]); >> a(la1, la2) ans = 4 5 6
矩阵的合并与删除
矩阵合并
c = [a b] %将矩阵a和b水平方向合并为c
c = [a;b] %将矩阵a和b竖直方向合并为c
删除就是将元素赋值为空矩阵
>> x = [1 2 3;4 5 6;7 8 9];
>> x(:,3) = [] %删除一列元素
>> x(1) = [] %删除一个元素,且矩阵会变为行向量
>> x = [] %删除所有元素
%子矩阵不能删除
>> x(1:2,3) = [] %运行会报错
矩阵、数组函数
det(x)
计算方阵行列式的值;
rank(x)
求矩阵的秩;
inv(x)
求矩阵的逆;
[v, d] = eig(x)
计算矩阵特征值和特征向量,如果方程xv = vd存在非零解,则v为特征向量、d为特征值;
diag(x)
产生x矩阵的对角阵;
[q, r] = qr(x)
m
×
n
m\times n
m×n矩阵x分解为一个正交方阵q和一个与x同阶的上三角矩阵r的乘积;
triu(x)
产生x的上三角矩阵,其余元素补0;
tril(x)
产生x的下三角矩阵,其余元素补0
数组翻转
fliqud(x)
矩阵x沿水平轴上下翻转;fliplr(x)
使x沿垂直轴左右翻转;flipdim(x,dim)
使x沿特定轴翻转(dim=1, 上下翻转; dim=2,水平翻转);rot(x,k)
使x逆时针翻转k个90°,默认k取1。
数组查找 find(x)
例如查找a=magic(3)中的元素
find(x==3)
如果使用 [a, b] = find(x==3) (等式左边参数个数=数组维数)则返回全下标;若使用a = find(x==3)则返回单下标。
数据统计
max(x)
返回各列中最大值; min(x)
返回各列中最小值; mean(x)
返回各列的平均值; std(x)
返回各列标准差(各元素与该列平均值差的平方和开方); median(x)
返回数组中各列的中间元素; median(x)
数组中各列的中间元素; var(x)
数组中各列的方差; [s,k] = sort(x,n,mode)
将矩阵x沿第n维按模增大重新排序,k为s元素原位置,mode是排序方式 ascend为升序,descend为降序,例如 [s,k]= sort(x,1,'ascend')
需要注意的是,
sum(matrix)
、min(matrix)
等并不是取整个矩阵元素的和或者最小值,而是对列分别计算,例如矩阵 例如a=[1 2 3; 1 2 3; 2 0 1],则sum(a)=[4 4 7],max(a)=[2 2 3]。
矩阵和数组的算术运算
A*B
为矩阵相乘,需要A的列数等于B的行数
A.*B
为点乘,需要A的维数=B的维数,对应元素相乘
其它点运算同理
A/B
右除,X=A/B是方程X*B=A的解,A/B=A*B^{-1}
B/A 左除,是方程A*X=B的解
向量除法 [2 5]/[1 2]:向量除法即为寻求一个常量x,使得 f(x) = (2 - x * 1)^2 + (5 - x * 2)^2 最小。因此对 f(x) 求导,则有 f’(x) = 10x-25,则x=2.4
A^B
乘方,A必须为方阵,B为正整数时表示A自乘B次,B为负整数时需要先对A求逆再自乘|B|次
A'
矩阵的转置,如果A是复数矩阵则表示共轭转置,此时A.'
为一般转置
inv(A)
矩阵的逆
conj(A)
共轭矩阵
算术函数
abs(x)
绝对值;
sqrt(x)
平方;
real(x)
、imag(x)
实部与虚部;
ceil(x)
向
∞
\infty
∞取整;
rem(x,y)
求余数(与被除数同号);
log(x)
对数,log(x)为以e为底的对数,如果要表示
log
2
8
\log_28
log28则可用log(8)/log(2)
;
pow2(x)
2的幂;
lem(x,y)
x和y的最小公倍数.
conj(x)
复数共轭;
mod(x,y)
x除以y的余数(与除数同号);
round(x)
4舍5入到整数;
fix(x)
向0取整;
floor
向
−
∞
-\infty
−∞取整;
sign(x)
符号函数;
exp(x)
自然函数;
lg10(x)
以10为底的对数;
gcd(x,y)
x和y的最大公约数.
erf(x)
误差函数;
beta(x,y)
计算beta函数;
gamma(x)
伽玛函数;
rat(x,tol)
计算有理近似值,tol是容差
expm(A)
A矩阵指数函数;
logm(A)
A矩阵对数函数;
funm(A,'FUN')
A矩阵的函数运算,[A必须为方阵,举例:funm(A,‘sqrt’)相当于sqrtm(A)]
数组的信息获取
d = size(A) %以行向量d表示A数组的各维尺寸
[m1, m2, ...] = size(A) %返回数组的各维尺寸
d = length(A) %返回数组A各维中最大维的长度
n = ndims(A) %返回数组A的维数
n = numel(A) %返回数组A的元素总个数
数据网络
数据网络是为画图而构造的数据结构,我们就从画图的角度来考虑这样的数据结构。假设你现在要画二维曲线图,你的横轴取点为[1, 2, 3, 4, 5],纵轴取点为[2, 4 ,6],那么既然我们要对所有数据点进行绘图,那么必须知道(1, 2), (1, 4), (1, 6), (2, 2), …, (5,2), (5,4), (5, 6)等多个点对应的矩阵,因此我们需要快速将这些点表示出来,此时就可以使用meshgrid
或ndgrid
生成这样的数据点。
以meshgrid
生成二维数据网格为例,若x=[1 2 3 4 5],y=[2 4 6],则[X, Y]=meshgrid(x,y)
即可产生上面所说的点阵,其中X,Y分别储存点阵的横、纵坐标。
可能有人会有疑惑,为什么要用多个矩阵分别储存横纵坐标而不直接储存点呢?
其实读者仔细琢磨也可以发现,如果直接储存点的坐标则数组每一行都必须用于储存一个点的坐标,以提取三维空间中点的横坐标为例,我们需要进入第一块第一层第一列提取第一行的元素,接下来再进入第一块第一层第一列提取第二行的元素…,这样的操作时间复杂度是O(n^3),一旦数据过多,那所消耗的时间则是爆炸式增长的,而分别储存点的某一维坐标可以使可以使时间复杂度大大降低。
字符串
多个字符串组合
str1 = ['Hello','World'] %ouput:HelloWorld,使用逗号连成长字符串
str2 = ['Hello';'World'] %使用';'构成字符串数组,元素必须长度相同,可用' '补位
字符串合并
strcat(s1,s2,...)
将s1, s2, …合并成一个长字符串
char(s1,s2,...)
将s1, s2, …合并成一个字符数组
strvcat(s1,s2,...)
将s1, s2, …合并成一个字符数组
>> s1 = 'a+b=';
>> s2 = 99;
>> ss1 = strcat(s1,s2) %合并字符串,并将99转换为字符c
字符串和数值转换
abs
将字符串转换为ASCII码数值 abs('ex1') %output:101 120 49
double
将字符串转换为ASCII码数值的double数据 Double('a') %output:97
str2num
将字符串转换为数值 str2num('2 35') %output:2 35
num2str
将数值转换为字符串 num2str(32) %output:'32'
mat2str
将矩阵转换为字符串 mat2str([32 5;4 6]) %output:'[32 5;4 6]
%使用字符串与数值转换来进行字符加密
>> s = 'matlab';
>> n = s + 10
n = 119 107 126 118 107 108
>> s1 = char(n) %转换为相应的字符
s1 = wk~vkl
查找
strmatch(str1,'t')
在字符串中查找另一字符串的位置,返回下标; lower(str1)
转为小写; upper(str1)
转为大写; strjust([str1,''],'right')
对齐字符串(左对齐,右对齐,居中对齐); strrep(str1,'a','b')
替换字符串中部分字符; eval('2*3')
执行字符串 %output:6; double('a')
将字符串转换为其ASCII码的数值 %output:97
关系运算和逻辑运算
关系运算符
关系运算符有常见的大于、小于、小于等于、大于等于以及 不等于~=
,等于==
。
逻辑运算符
& 与 |或 ~非 xor异或
关系运算符和逻辑运算符的结果都是0或1。
逻辑变量,MATLAB中逻辑型(logical)数据只有"1"和"0"
>> a = [0 -1 0 10 0 9 -5 0 0];
>> b = logical(a) %转换成逻辑型,所有非0都是1
逻辑运算符
运算符 | & | | | ~ | xor |
---|---|---|---|---|
含义 | 与 | 或 | 非 | 异或 |
>> A=[1,3,-1,0,7,2]; %输入向量A
>> B=~(A>2) %找出A中不大于2的元素的位置
>> D=A.*B %找出A中不大于2的元素
>> C=(A>0)&(A<3) %找出A中大于0小于2的元素的位置
>> E=A.*C %找出A中大于0小于3的元素
c=xor(a,b)的结果
a | 0 | 0 | 非0 | 非0 |
---|---|---|---|---|
b | 0 | 非0 | 0 | 非0 |
c | 0 | 1 | 1 | 0 |
合理应用关系运算与逻辑运算可以起到重要的作用。
例如我们可以很快判断数组A中大于数组B的元素所在位置 H=(A>B)
,或者找出A中小于等于2的元素C=~(A>2)
。
数值精度
MATLAB中数值分为浮点型和整型两种数据类型。
浮点型
double
双精度浮点数 -2^1024 ~ -2^-1022 与 2^1024 ~ 2^-1022
2^1024=1.79769 x 10308,2^-1022=2.22507 x 10-308,所以上面的浮点数区间其实是包含了
double
可以表示的正负数中所能体现的最小精度与最大数。细心的朋友可能发现了,这就是我们特殊变量表中的realmin
和realmax
。
single
单精度浮点数 -2^128 ~ -2^-126 与 2^128 ~ -2^126
整型
int8
8位有符号整数 -2^7~2^7-1
uint8
8位无符号整数 0~2^8-1
更多MATLAB知识学习见:计算物理入门
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通