MATLAB学习笔记
MATLAB学习笔记
1、MATLAB简介
应用领域:线性代数、数值分析、数学建模、信号与系统、自动控制、数字信号处理、通信仿真等领域的基础工具
常用快捷键 | 作用 |
---|---|
ctrl+滚轮 | 放大缩小字体 |
ctrl+r | 注释 |
ctrl+t | 取消注释 |
ctrl+tab | 窗口切换 |
ctrl+i | 代码格式化 |
2、矩阵
2.1 矩阵的定义
-
常规定义方法
定义空矩阵:
m=[]
定义行矩阵:
m=[1 2 3]
或m=[1,2,3]
定义列矩阵:
m=[1;2;3]
定义正常矩阵:
m=[1 2 3;4 5 6]
总结:行内元素用空格或者逗号分隔,换行用分号
-
使用冒号运算符生成行矩阵
m:s:n
:表示定义行向量,从m开始到n结束,步距为s,s可以不指定,默认为1 -
linspace(x,y,n)生成行矩阵
其中x表示起始值,y表示终止值,n表示生成点数(默认为100)
linspace(1,10,10)
生成的矩阵和1:1:10
相同 -
特殊矩阵和随机矩阵
eye(n)
:生成一个n阶的单位矩阵zeros(n)
:生成一个n阶的全0矩阵zeros([m,n])
:生成一个m行n列的全0矩阵zeros([m,n,x])
:生成一个m行n列x页的全0矩阵ones(n)
:生成一个n阶的全1矩阵ones([m,n])
:生成一个m行n列的全1矩阵ones([m,n,x])
:生成一个m行n列x页的全1矩阵rand(n)
:生成一个n阶的随机矩阵rand([m,n])
:生成一个m行n列的随机矩阵rand([m,n,x])
:生成一个m行n列x页的随机矩阵randi(max)
:生成一个1-max之间的随机整数randi(max,n)
:生成一个1-max之间的n阶随机整数矩阵randi(max,[m,n])
:生成一个1-max之间的m行n列的随机整数矩阵randi(max,[m,n,x])
:生成一个1-max之间的m行n列x页的随机整数矩阵randn
:符合正态分布的随机数,用它生成随机矩阵时的用法同rand一样
2.2 矩阵的操作
-
拼凑和变形
行拼接:[m,n]
列拼接:[m;n]
变形:reshape(矩阵,变换的形状)
-
矩阵的自运算
size(m)
:获取矩阵的形状m’
:矩阵m的转置inv(m)
:矩阵m的逆矩阵[V,D]=eig(m)
:矩阵的特征值D和特征向量V -
矩阵间的加减乘除乘方运算
假设
a=[1 2;3 4];b=a
则:
a+b = [2 4;6 8]
:表示对应元素相加a-b = [0 0;0 0]
:表示对应元素相减a*b = [7 10;15 22]
:表示矩阵之间相乘a.*b = [1 4;9 16]
:表示对应元素之间相乘a/b = [1 0;0 1]
:表示a与b的逆矩阵相乘a./b = [1 1;1 1]
:表示对应元素相除a\b = [1 0;0 1]
:表示a的逆矩阵与b相乘a^5 = a*a*a*a*a
:表示a连乘5次a.^5 = [1 32;243 1024]
:表示对应元素的五次方 -
广播机制
假设
a=[1 2;3 4];b=1
a+b = [2,3;4,5]
a-b = [0 1;2 3]
把b广播成了[1 1;1 1]
-
矩阵间的逻辑运算
假设
a=[1 2;3 4];b=[2 1;3 4]
则:
a==b = [0 0;1 1]
:表示对每个元素进行逻辑运算注:逻辑运算也有广播机制
a>2 = [0 0;1 1]
高级用法:
a.*(a>2)
保留矩阵a中大于2的数,其他位置的数置零 -
矩阵的索引
假设
m=[1 2 3;4 5 6;7 8 9]
则:
m(8) = 6
:表示matlab中的矩阵是按照列方向进行检索m([1,3,5]) = [1 7 5]
:表示按照列方向检索,第1,3,5个位置的元素并且组成一个行向量m(2,3) = 6
:表示检索第二行第三列位置的元素m([1,2],3) = [3;6]
:表示检索第一行和第二行的第三列的元素,组成列向量m(1,[2,3]) = [2 3]
:表示检索第一行的第二列和第三列的元素,组成行向量m([1,2],[1,2]) = [1 2;4 5]
:表示检索第一二行,第一二列的元素m([1,2],:)
:表示检索前两行元素m(:,[1,2])
:表示检索前两列元素
3、逻辑操作
输入输出:input("提示消息",'输入类型')
用于从控制台获取输入,不指定输入类型的时候默认只能接收数值类型或者数值矩阵;disp("要输出的信息")
用于输出信息,disp输出多个字段时,需要将多个字段转化为字符串矩阵再进行输出。
类型转换:str2num()
和num2str()
用于字符串和数值之间的转换
关系运算符:'>' '<' '>=' '<=' '=='
逻辑运算符:与运算& 或运算| 非运算~
if/for/while控制语句:
break/continue/return:
break:跳出本层循环
continue:结束本次循环
return:结束所有循环
4、函数与脚本
4.1 函数
函数定义:
%function [输出参数] = myfun(输入参数)
% 函数体
%end
%调用语句必须写在所有函数定义的上方
area(2);
%圆的面积
function s = area(r)
s = pi * r.^2;
end
匿名函数:
%f = @(输入参数)函数体
%f:函数句柄
f=@(x)x.^2;
f(2);
匿名函数和普通函数的转换:
f2 = @fun;
f3 = @(x)fun(x);
funtion y = fun(x)
y = x.^2;
end
使用场景:当函数体复杂时使用普通函数,当函数体比较简单的时候使用匿名函数
4.2 脚本
脚本文件就是matlab中后缀为.m
的文件,当脚本文件中只有函数时,就成为函数脚本文件或者函数文件,函数文件可以被其他脚本调用,也可以在命令行调用
5、MATLAB绘图
基本思想:连点成线
5.1 二维绘图命令plot
绘制y=sin(x)
x = linspace(0,2*pi,20);
y = sin(x);
plot(x,y);
同时绘制多条线段
-
保留原图
x = linspace(0,2*pi,20); y = sin(x); y2 = cos(x); plot(x,y);hold on; plot(x,y2);hold off;
-
直接传入多组参数
x = linspace(0,2*pi,20); y = sin(x); y2 = cos(x); plot(x,y,x,y2);
绘制多图
在命令行调用plot命令的时候,通常只会保留最后一张figure,如果要显示所有的figure就需要在plot前面加上figure,这样就会展开多个窗口
x = linspace(0,2*pi,20);
y = sin(x);
y2 = cos(x);
figure;plot(x,y);
figure;plot(x,y2);
绘制子图(一个figure)
使用subplot可以在一张figure中绘制多个坐标轴的图片
subplot(x,y,n)
:表示把这张图画在x行y列的第n个位置上
x = linspace(0,2*pi,20);
y = sin(x);
y2 = cos(x);
y3 = x.^2;
y4= x.^0.5;
subplot(2,2,1);plot(x,y);
subplot(2,2,2);plot(x,y2);
subplot(2,2,3);plot(x,y3);
subplot(2,2,4);plot(x,y4);
设置属性
grid on
:添加网格
grid off
:取消网格
axis on
:显示坐标轴,刻度线和坐标轴标签
axis off
:关闭坐标轴,刻度线和坐标轴标签
axis ([xmin,xmax,ymin,ymax])
:设置坐标轴的显示范围
axis equal
:沿每个坐标轴使用相同的数据单位长度
axis square
:使用相同长度的坐标轴线,相应调整数据单位之间的增量(将坐标轴绘制成正方形)
设置样式
在传入的每一组参数的后面都可以设置绘制这组参数时用什么属性(线段类型,颜色等),属性设置参照下表
x = linspace(0,2*pi,20);
y = sin(x);
y2 = cos(x);
plot(x,y,'b - o',x,y2,'g -. ^');
线型 | 说明 |
---|---|
- (默认) | 实线 |
-- | 虚线 |
: | 点线 |
-. | 点划线 |
标记 | 说明 |
---|---|
none(默认) | 不显示 |
o | 圆圈 |
+ | 加号 |
* | 星号 |
. | 点 |
x | 叉号 |
_ | 水平线条 |
| | 垂直线条 |
s | 方形 |
d | 菱形 |
^ | 上三角 |
v | 下三角 |
> | 右三角 |
< | 左三角 |
p | 五角形 |
h | 六角形 |
颜色 | 说明 |
---|---|
r | 红色 |
g | 绿色 |
b | 蓝色 |
w | 白色 |
k | 黑色 |
y | 黄色 |
m | 品红/洋红 |
c | 青蓝 |
除了可以指定简单的线条属性之外,还可已指定更复杂的属性
MarkerIndices
:在特定数据点显示标记(在MATLABR2016b版本之后才能使用)
LineWidth
:指定线宽,默认0.5磅
MarkerSize
:指定标记的大小,默认6磅
MarkerEdgeColor
:指定标记的轮廓颜色
MarkerFaceColor
:指定标记的填充颜色
plot(x,y,'-or','LineWidth',3,'MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor','g')
其他二位绘图命令
errorbar(x,y,err,方向)
:含误差条的线图,方向可以不指定,默认沿y轴方向,指定“both”就两个方向都有误差条
histogram(x,n)
:根据x创建直方图,n为区间数量
scatter(x,y)
:散点图,和plot用法类似,也可以指定其它参数
bar(y)
:柱状图,传入的y是一个矩阵,y的每个元素对应一个条形,如果y是2维矩阵,则bar会按照每行元素进行分组
pie(X,explode)
:饼图,X和explode都是一维向量,explode用来指定对应位置的扇区是否有爆炸效果
x = linspace(0,2*pi,20);
y = sin(x);
error=rand(size(x))
x2 = randn([1,10000]);
y3 = x.^2;
y4= [2 3 6;11 23 26];
x3 = [1 2 3 2 1]
explode = [0 1 0 1 0]
subplot(3,2,1);errorbar(x,y,error);
subplot(3,2,2);histogram(x2,50);
subplot(3,2,3);scatter(x,y3);
subplot(3,2,4);bar(y4);
subplot(3,2,5);pie(x3,explode);
5.2 三维绘图命令
-
三位曲线plot3
plot3(x,y,z)
:使用方法同plot一样,就是多了一个维度,也可以设置其他属性 -
散点图scatter3
scatter(x,y,z)
:使用方法同scatter一样 -
三位曲面mesh、surf、meshgrid、isosurface
meshgrid(x,y)
:根据给定的x,y向量,生成一个两个二维矩阵X,Y,这里两个二维矩阵组成的坐标可以组成一个平面网格;如果只传入一个参数,则生成一个正方形的平面网格。传入三个参数就生成三维网格。mesh(x,y,z)
:常用于绘制显函数的三维图像,绘制的是网格图surf(x,y,z)
:常用于绘制显函数的三维图像,绘制的是曲面图(有填充色)isosurface(x,y,z,f,0)
:常用于绘制隐函数的图像,传入x,y,z对应meshgrid生成的三维网格,f表示隐函数,0表示绘制f=0时的图像;a = linspace(0,10*pi,500); b = sin(a); c = cos(a); [X,Y]=meshgrid(-10:1:10,-10:1:10); Z=X.^2+Y.^2; subplot(3,2,1);plot3(a,b,c); subplot(3,2,2);scatter3(a,b,c); subplot(3,2,3);mesh(X,Y,zeros([21 21])); subplot(3,2,4);surf(X,Y,Z); subplot(3,2,5);mesh(X,Y,Z); [x,y,z]=meshgrid(linspace(-2,2)); f=@(x,y,z)(x.^2 + (9./4).* y.^2 + z.^2 - 1).^3 - x.^2. * z.^3 - (9./80).* y.^2. * z.^3; subplot(3,2,6);isosurface(x,y,z,f(x,y,z),0);axis equal;view(3);
5.3 APP设计(appdesigner)
-
控件添加(都是UI操作,直接从左侧控件区将控件拖放到画布上即可,右侧可以设置控件属性,这里不做过多介绍)
-
功能实现(为控件添加回调函数)
-
切换到代码视图
-
点击添加回调,选择需要添加回调的控件
-
补充完整回调函数
这里的app.UIAxes指的是当前app画布里面的坐标控件,如果不指定绘图区,他会将图像画在一个新建的figure里面;同样,如果需要改变标签(xlable,ylabel,title等)也需要指定绘图区。
-
-
APP打包(根据图形界面操作即可)
6、MATLAB文件读写
6.1 写文件writetable(txt、excel)
基础语法:
writetable(m,filename)
:将m写入到名为filename的文件,后缀支持.txt
,.csv
,.xls
,.xlsm
,.xlsx
,同时支持相对路径和绝对路径。除此之外还可以指定其他参数。
writetable(m,filename)
:用于指定
基本步骤:
- 构造table
- 写入文件
m = rand(4)+1;
m1 = round(m,2,'decimals');%保留小数点后两位
m2 = round(m,2,'significant');%保留两位有效数字
t = table(m2);
writetable(t,'m.txt')%支持绝对路径也支持相对路径
-
写入文件时可以指定分隔符,也可以指定是否需要列名
m = rand(4)+1; m1 = round(m,2,'decimals');%保留小数点后两位 m2 = round(m,2,'significant');%保留两位有效数字 t = table(m2); writetable(t,'m.txt');%默认使用逗号分隔 type m.txt writetable(t,'m.txt','Delimiter','\t')%Delimititer可以指定分隔符 type m.txt writetable(t,'m.txt','Delimiter','\t','WriteVariableNames',false)%WriteVariableNames可以指定是否需要列名 type m.txt
-
可以设置写入模式(覆盖或者追加)
writetable(t,'m.txt','Delimiter','\t','WriteVariableNames',false,'WriteMode','append')
6.2 读文件readtable(txt、excel)
- 从文件中读取数据(返回值是一个table类型)
- 类型转换table2array
t = readtable('m.txt')
readT = table2array(t)
-
读取excel文件时还可以指定sheet,如果不指定默认获取第一个表单
readtable('student.xls','Sheet','sheet1')%可以按照表单名称指定,以可以指定数字指定获取第几个表单。 sheetnames('student.xls')%获取表格中表单的名称
-
读取excel文件时可以指定范围
t_range=readtable('student.xls','Range','B2:E4')%指定单元格获取
6.3 table的更多用法
%table的构造
Names = {'zhangsan';'lisi';'wangwu'}
ID = {1001;1002;1003}
Chinese = {90;91;93}
Math = {23;14;90}
English = {93;23;45}
table(Names,ID,Chinese,Math,English)
t = table(ID,Chinese,Math,English,'RowNames',Names)
%访问表格元素
%1. 索引(和矩阵一致)
t(1,2)
t(1,:)
%2. 列名
t(:,'ID')
rowname = t.Properties.VariableNames%获取表格列名
rowname(1) = {'id'}%修改列名
%增加行
t(4,:) = {'xiaosi',1004,24,43,12}
%增加列
t.total = t.Chinese+t.Math+t.English
%表格合并
% join(table1,table2)
7、图像处理
imread('imgPath')
:读取图像文件,返回一个矩阵,黑白图像为二维的单通道矩阵,彩色图像返回的是RGB三通道的三维矩阵
imshow(imgMatrix)
:显示图像文件,传入imread读出来的矩阵或者自己构造的矩阵,就可以显示图像
imwrite(imgMatrix,'imgPath')
:保存图片
rgb2gray(imgMatrix)
:彩色图转灰度图
imbinarize(grayMatrix)
:灰度图二值化(小于阈值置0,大于阈值置1,可以根据原理自己写二值化方法,自己控制阈值)
imresize(imgMatrix,scale)/imresize(imgMatrix,[row col])
:调整图像大小,可以指定缩放比例调整,也可以指定大小调整
imrotate(imgMatrix,Angle)
:旋转图片,Angle为旋转的角度
imsubtract/immultiply/imdivide/imadd(imgMatrix,imgMatrix)/imadd(imgMatrix,常量)
:图像的加减乘除(给矩阵的每一个元素进行运算)
imhist(imgMatrix)
:直方图
histeq(imgMatrix)
:直方图均衡化
bwlabel(Matrix,4)/bwlabel(Matrix,8)
:标注联通分量(4联通和8联通)
8、方程求解
8.1 解析解solve
solve(方程,要求解的未知数)
:用于求解方程为0时指定未知数的解析解(可以传入多个方程(方程组求解),用逗号隔开)
8.2 数值解fsolve
fsolve(函数句柄,初值)
:用于求解方程的数值解
a = 3;
b = 5;
f = @(x)funs(x,a,b);
fsolve(f,[0,0])
%x = [x,y]
function y = funs(x,a,b)
y(1) = x(1) + b*x(2) - 5;
y(2) = a*x(1) - x(2) - x(1);
end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix