MATLAB学习笔记
Published on 2022-06-26 16:10 in 暂未分类 with 仅有的い依靠

MATLAB学习笔记

MATLAB学习笔记

1、MATLAB简介

应用领域:线性代数、数值分析、数学建模、信号与系统、自动控制、数字信号处理、通信仿真等领域的基础工具

官网https://ww2.mathworks.cn

常用快捷键 作用
ctrl+滚轮 放大缩小字体
ctrl+r 注释
ctrl+t 取消注释
ctrl+tab 窗口切换
ctrl+i 代码格式化

2、矩阵

2.1 矩阵的定义

  1. 常规定义方法

    定义空矩阵:m=[]

    定义行矩阵:m=[1 2 3]m=[1,2,3]

    定义列矩阵:m=[1;2;3]

    定义正常矩阵:m=[1 2 3;4 5 6]

    总结:行内元素用空格或者逗号分隔,换行用分号

  2. 使用冒号运算符生成行矩阵

    m:s:n:表示定义行向量,从m开始到n结束,步距为s,s可以不指定,默认为1

  3. linspace(x,y,n)生成行矩阵

    其中x表示起始值,y表示终止值,n表示生成点数(默认为100)

    linspace(1,10,10)生成的矩阵和1:1:10相同

  4. 特殊矩阵和随机矩阵

    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 矩阵的操作

  1. 拼凑和变形

    行拼接:[m,n]

    列拼接:[m;n]

    变形:reshape(矩阵,变换的形状)

  2. 矩阵的自运算

    size(m):获取矩阵的形状

    m’:矩阵m的转置

    inv(m):矩阵m的逆矩阵

    [V,D]=eig(m):矩阵的特征值D和特征向量V

  3. 矩阵间的加减乘除乘方运算

    假设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]:表示对应元素的五次方

  4. 广播机制

    假设a=[1 2;3 4];b=1

    a+b = [2,3;4,5]

    a-b = [0 1;2 3]

    把b广播成了[1 1;1 1]

  5. 矩阵间的逻辑运算

    假设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的数,其他位置的数置零

  6. 矩阵的索引

    假设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控制语句

image

image

image

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

image

绘制y=sin(x)

x = linspace(0,2*pi,20);
y = sin(x);
plot(x,y);

image
同时绘制多条线段

  • 保留原图

    x = linspace(0,2*pi,20);
    y = sin(x);
    y2 = cos(x);
    plot(x,y);hold on;
    plot(x,y2);hold off;
    

image

  • 直接传入多组参数

    x = linspace(0,2*pi,20);
    y = sin(x);
    y2 = cos(x);
    plot(x,y,x,y2);
    

image

绘制多图

在命令行调用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);

image

绘制子图(一个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);

image

设置属性

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 青蓝

image

除了可以指定简单的线条属性之外,还可已指定更复杂的属性

MarkerIndices:在特定数据点显示标记(在MATLABR2016b版本之后才能使用)

LineWidth:指定线宽,默认0.5磅

MarkerSize:指定标记的大小,默认6磅

MarkerEdgeColor:指定标记的轮廓颜色

MarkerFaceColor:指定标记的填充颜色

plot(x,y,'-or','LineWidth',3,'MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor','g')

image

其他二位绘图命令

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);

image

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);
    

image

5.3 APP设计(appdesigner)

image

image

  1. 控件添加(都是UI操作,直接从左侧控件区将控件拖放到画布上即可,右侧可以设置控件属性,这里不做过多介绍)

  2. 功能实现(为控件添加回调函数)

    1. 切换到代码视图

    2. 点击添加回调,选择需要添加回调的控件

    3. 补充完整回调函数

      image

      这里的app.UIAxes指的是当前app画布里面的坐标控件,如果不指定绘图区,他会将图像画在一个新建的figure里面;同样,如果需要改变标签(xlable,ylabel,title等)也需要指定绘图区。

  3. APP打包(根据图形界面操作即可)

    image

6、MATLAB文件读写

6.1 写文件writetable(txt、excel)

基础语法:

writetable(m,filename):将m写入到名为filename的文件,后缀支持.txt,.csv,.xls,.xlsm,.xlsx,同时支持相对路径和绝对路径。除此之外还可以指定其他参数。

writetable(m,filename):用于指定

基本步骤:

  1. 构造table
  2. 写入文件
m = rand(4)+1;
m1 = round(m,2,'decimals');%保留小数点后两位
m2 = round(m,2,'significant');%保留两位有效数字
t = table(m2);
writetable(t,'m.txt')%支持绝对路径也支持相对路径

image

image

  1. 写入文件时可以指定分隔符,也可以指定是否需要列名

    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
    

    image

  2. 可以设置写入模式(覆盖或者追加)

    writetable(t,'m.txt','Delimiter','\t','WriteVariableNames',false,'WriteMode','append')
    

6.2 读文件readtable(txt、excel)

  1. 从文件中读取数据(返回值是一个table类型)
  2. 类型转换table2array
t = readtable('m.txt')
readT = table2array(t)

image

  1. 读取excel文件时还可以指定sheet,如果不指定默认获取第一个表单

    readtable('student.xls','Sheet','sheet1')%可以按照表单名称指定,以可以指定数字指定获取第几个表单。
    sheetnames('student.xls')%获取表格中表单的名称
    
  2. 读取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)

image

image

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时指定未知数的解析解(可以传入多个方程(方程组求解),用逗号隔开)

ax2+bx+c=0

image

8.2 数值解fsolve

fsolve(函数句柄,初值):用于求解方程的数值解

{x+by=5axy=x

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
posted @   仅有的い依靠  阅读(503)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示