MATLAB从入门到入土


前言

MATLAB有一些语法和我们常用的python、C++、C等编译语言的语法有所不同,比如MATLAB中的注释使用%而不是/*,但就我个人的使用来说,我认为MATLAB的语法还是更简洁方便的,像python一样,一行语句结束后不需要加分号。
它的功能十分强大,包含很多很多库函数,也可以轻松地实现图形化和可视化,最重要的是使用MATLAB画出的图非常的好看,我们也可以对图像进行处理分析,对用户非常友好。
编者是要参加数学建模比赛,所以想要学一学MATLAB,但对于我这个专业,学习MATLAB也有很大帮助,MATLAB可以与Simulink结合使用,对机器人的控制系统、电气系统以及机器人的运动方式进行仿真,我先学着MATLAB的基本知识,以后或许也会学习使用MATLAB进行仿真。


一、数据类型

MATLAB的数据类型主要有五种:

  • 数字类型
  • 字符与字符串
  • 矩阵
  • 单元数组
  • 结构体

其中一些数据结构我们已经习以为常了,我就不再介绍了,主要介绍一下一些专有的数据结构。


1. 矩阵

创建矩阵的方式有两种:直接赋值创建和使用函数创建。

示例如下:

% 矩阵
A = [1,2,3;4,5,6;7,8,9] %直接赋值创建
B = rand(3,4) %创建一个34列的随机矩阵,每个位置都是01之间的数

结果如下:
在这里插入图片描述
在这里插入图片描述

矩阵的操作也很丰富,MATLAB可以轻易地实现矩阵的转置、矩阵的逆、将矩阵排成一列、矩阵相乘等操作。

实例如下:

C = A' %矩阵的转置
D = inv(A) %矩阵的逆
E = A(:) %将矩阵元素排成一列
A * D %矩阵相乘

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果矩阵是复数,在转置操作时略有不同,这一部分在电路中可能会用到,比如PID

示例如下:

%% 复数矩阵的转置

clear all
A = [4+3i 5+6i 7+i]
B = A' %共轭转置
B2 = A.' %位置转置

结果如下:
在这里插入图片描述
在这里插入图片描述

同时,如果我们的矩阵的行和列很多,在命令行中无法完全查看到,我们也可以对矩阵进行一些查看的操作。

示例如下:

rows = size(A,1) %查看矩阵行数
cols = size(A,2) %查看矩阵列数

结果如下:
在这里插入图片描述
在这里插入图片描述
矩阵块操作:

%% 矩阵的块操作

clc
clear all
A = magic(2)
B = repmat(A,2,3)

结果如下:
在这里插入图片描述

将多个矩阵作为对角块产生新矩阵
示例如下:

%% 将多个矩阵作为对角块产生新的矩阵

clear all
A = magic(3)
B = [1:2;3:4]
C = blkdiag(A,B)

结果如下:
在这里插入图片描述
矩阵的旋转也是很重要的一部分,在机器人的位姿变换中用处很大。

示例如下:

%% 逆时针旋转90度的K倍,默认为1倍

clear all
A = rand(2,3)
B = rot90(A) %逆时针旋转90度的1倍
C = rot90(A,2) %逆时针旋转90度的2

结果如下:
在这里插入图片描述

在这里插入图片描述
矩阵翻转

%% 矩阵翻转
clear all
A = rand(2,2)
B = fliplr(A) %左右翻转
C = flipud(A) %上下翻转
D = flipdim(A,1) %指定方向翻转,1为左右,2为上下
E = flipdim(A,2)

结果如下:
在这里插入图片描述


2. 单元数组

创建单元数组的方法也是有两种:直接创建和使用cell函数创建

示例如下:

% 单元数组
clear all %清空所有变量
A = cell(1,6) %创建一个16列的单元数组
B = {'haha','哈哈';[7,5,6],88} %直接创建一个单元数组

结果如下:
在这里插入图片描述
在这里插入图片描述
对于单元数组,我们也可以对其元素进行一些操作,比如单独显示单元数组的元素、对数组进行扩充和删除、图形化显示单元数组元素、赋值等。

示例如下:

clear all;
c = {'hhh','shabby';[5,4,6,8,7],7} %创建数组
c{1,1} %查看单元数组元素
c{2,2}=[] %删除操作

% 单独显示单元数组元素
celldisp(c)
% 图形化显示单元数组元素
figure
out = cellplot(c,'legend')

结果如下:
在这里插入图片描述
在这里插入图片描述
也可以进行将矩阵转换成单元数组的操作,并判断是否转换成功

示例如下:

%% 将矩阵转换成单元数组

clear all
a = [4 5 2; 4 2 1]
c = num2cell(a) %将矩阵转换成单元数组
iscell(c) %判断是否为单元数组

结果如下:
在这里插入图片描述


3. 结构体

MATLAB中的结构体和以前编译语言中的定义有所不同,感觉有点抽象…

创建结构体:

% 结构体

clear all
s = struct('figure',{'big','little'},'yanse',{'blue'})
diyi = s(1) %查看所有成员的第一个内容
dier = s(2)

结果如下:
在这里插入图片描述
在这里插入图片描述
删除成员变量:

shan1 = rmfield(s,'figure') %删除figure这个成员变量
shan1and2 = rmfield(s,{'figure','yanse'}) %删除12两个成员变量

结果如下:
在这里插入图片描述
判断:

f1 = isstruct(s) %判断是否为结构体
f2 = isfield(s,'figure') %判断是否为结构体成员

结果如下:
在这里插入图片描述
获取成员变量的值:

% 获取某个实际成员变量的值
s(1).figure

结果如下:
在这里插入图片描述
使用函数获取:

%使用函数获取成员变量的值
f = getfield(s,'figure')

结果如下:
在这里插入图片描述


4. 数值取整

整数是一个我们非常常用,也很喜欢的数据类型,MATLAB中数值取整主要有以下几种方法。

示例如下:

r = round(8.5) %四舍五入取整
a = fix(9.9) %0取整
f = floor(6.8) %向小于等于该数的最近接的整数取整
c = ceil(2.2) %向大于等于该数的最接近整数取整

结果如下:
在这里插入图片描述
在这里插入图片描述


二、数据显示格式

数据显示格式的意思是:改变数据显示格式,但不改变数值,默认保留小数点后四位

示例如下:

a = 6.32254188
format long
a
format short
a
format long e
a
format short e
a

结果如下:
在这里插入图片描述
在这里插入图片描述
我们也可以将数值转换成逻辑值0或1,转换规则就是只有出现0才会为假,其他数值均为真。
转换时,需要使用函数logical

示例如下:

a = 6.32254188
logical(a) %真值转换
b = 0
logical(b) %假值转换

结果如下:
在这里插入图片描述
在这里插入图片描述
最后,说一下函数句柄,函数句柄是用来间接调用函数的工具,非常好用!

示例如下:

f = @cos %创建函数句柄
t = 0:pi/4:pi %t的范围是0到π,以π/4为一个单位
f(t)

结果如下:
在这里插入图片描述
对函数句柄也可以进行一些操作,这里只介绍判断函数句柄和检测是否为同一个。

示例如下:

isa(f,'function_handle') %判断f是否为函数句柄
isequal(f1,f2) %判断两个函数句柄是否为同一个

结果如下
在这里插入图片描述


三、运算方法和求积分

运算方法和我们以前熟知的编译器相同,我就懒得再整理一遍了,直接讲一些MATLAB使用起来比较方便或者说比较特殊的吧。

积分求解:

%% 求积分

%% 使用quad函数求积分 单变量数值积分求解

clear all
syms x; %设置自变量
f = inline('1./(sin(x)+exp(-x.^2))') %内联函数
y = quad(f,0,1) %积分求解

%% 使用quadl函数求解积分,速度更快,精度更高

clear all
syms x
f = inline('1./(sin(x)+exp(-x.^2))')
y = quadl(f,0,1)

%% 双重积分求解

clear all
syms x
f = inline('x*cos(y)+y*sin(x)','x','y')
y = dblquad(f,pi,2*pi,0,pi)


%% 三重积分求解

clear all
syms x
f = inline('x*sin(y)+z','x','y','z')
y = triplequad(f,0,1,2,4,5,7)

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、求解微分方程和函数最小值及零点

1. 求通解

示例如下:

%% 求通解
clear all
f1 = dsolve('Dy-y=sin(x)') %默认情况下以t为自变量求解
f2 = dsolve('Dy-y=sin(x)') %以x为自变量求解

结果如下:
在这里插入图片描述


2. 求特解

示例如下:

%% 求特解
clear all
dsolve('Dy=a*y','y(0)=b')

结果如下:
在这里插入图片描述


3. 求微分方程组

示例如下:

%% 求微分方程组
clear all
z = dsolve('Dx = y','Dy = x')
z.x %查看x与t的函数
z.y %查看y与t的函数

结果如下:
在这里插入图片描述


4. 求函数最小值和零点

示例如下:

%% 求解一元函数的最小值和零点
format short
clear all
close all
[x,fval]=fminbnd(@cos,1,5)
y = cos(x)

结果如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/e57a04d7b1d24c129369b918cd80cd69.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/3bc5207fda3a48c8817bc08ea14746b7.png) **限定自变量范围:**
%% 限定自变量范围
clear all
close all
f = @(x)x.^2 - 6*x -9
[x,fval] = fminbnd(f,0,6,optimset('Display','iter'))
%自变量在06之间的最小值,显示计算过程
y = f(x)

结果如下:
在这里插入图片描述
求多元函数最小值:

%% 求多元函数最小值
clear all
close all
f = @(x) 2*(x(2)-x(1)^2)^2+(2-x(1))^2
[x,fval] = fminsearch(f,[-6.7 8]) %指定一个起始点 在-6.78附近开始查找最小值
y = f(x)

结果如下:
在这里插入图片描述


4. 求函数零点

示例如下:

%% 求一元函数的零点
clear all
close all
f = @(x)sin(x)*cos(x)
figure
fplot(f,[-5,5])
xlabel('x')
ylabel('f(x)')
grid on;
x1 = fzero(f,[-4,-2])
x3 = fzero(f,-2)
[x4,fval] = fzero(f,[-3,1])

结果如下:
在这里插入图片描述
在这里插入图片描述


五、矩阵升级操作

矩阵排序:

%% 矩阵排序

clear all
clc
A = [3 4 0; 6 85 9;4 5 10]
B = sort(A) %每一列从小到大排序
C = sort(A,'descend') %降序
D = sort(A,2,'descend') %按照行排序

结果如下:
在这里插入图片描述
矩阵差分:

%% 矩阵差分
clear all
clc
A = [3 4 0; 6 85 9;4 5 10]
diff(A)
diff(A,2) %在列上进行二阶差分
diff(A,1,1) %在列上进行一阶差分
diff(A,1,2) %在行上进行一阶差分

结果如下:
在这里插入图片描述
在这里插入图片描述
求特征值:

%% 求矩阵的特征值
clear all
clc
A = [3 4 0; 6 85 9;4 5 10]
E = eig(A) %求矩阵的全部特征值,是一个向量
[V,D] = eig(A) %V的每列是一个特征向量,D的对角线上的元素时特征值

结果如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/3b9cab3dfcb3462b930bc0980547aa3a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUyNzg1NTgw,size_16,color_FFFFFF,t_70) **求方程的根:**
%% 求方程的根
clear all
clc
A = [3 4 0]
Aa = compan(A) %求A的伴随矩阵
x1 = eig(Aa) %求特征值就是根
x2 = roots(A) %另一种方法

结果如下:
在这里插入图片描述
矩阵求秩:

%% 求方程的秩
clear all
clc
A = [3 4 0]
r = rank(A)

结果如下:
在这里插入图片描述
矩阵求范数:

%% 求方程的范数 默认求2范数
clear all
clc
A = [3 4 0;2 56 34;1 2 2]
n1 = norm(A,1)  %1范数
n2 = norm(A)    %2范数
n3 = norm(A,inf) %求无穷范数

结果如下:
在这里插入图片描述


六、逻辑及流程控制

这一部分和以前的编译语言类似,但是MATLAB中所有流程执行完毕后需要在结尾加上end,不然程序无法判断结束。

1.if…else…end

示例如下:

% if...else...end
A = rand(1,10)
B = A>0.5
if any(B)
    fprintf('Indices of values > %4.2f:\n');
    disp(find(B))
else
    disp('所有值都小于0.5')
end

结果如下:
在这里插入图片描述

2. for…end

示例如下:

%% for...end
k = 5
hilbert = zeros(k,k)

for m = 1:k
    for n = 1:k
        hilbert(m,n) = 1/(m+n - 1);
    end
end

结果如下:
在这里插入图片描述

3. while…end

示例如下:

%% while...end
n = 1;
nFactorial = 1;
while nFactorial < 1e50
    n = n+1;
    nFactorial = nFactorial * n;
end
n

结果如下:
在这里插入图片描述

3. switch…case…end

示例如下:

% switch...case...end
m = input('请输入一个数字:')

switch m
    case -1
        disp('负一')
    case 0
        disp('零')
    case 1
        disp('正一')
    otherwise
        disp('其他')
end

结果如下:
在这里插入图片描述


八、文件导入

1. mat格式

%% mat格式
save data.mat x y1 y2
clear all
load data.mat %加载文件

2. txt格式

%% txt格式
M = importdata('myfile.txt');

S = M.data; %将文本中的数据单独拿出来
save 'data.txt' S -ascii
T = load('data.txt');

isequal(S,T)

3. xls格式

%% xls格式
xlswrite('data.xls',S)
W = xlsread('data.xls');
isequal(S,W)

xlswrite('data.xlsx',S)
U = xlsread('data.xlsx');
isequal(S,T)

4. csv格式

%% csv格式
csvwrite('data.csv',S)
V = csvread('data.csv')
isequal(S,V)

九、随机数的产生

1. 二项分布随机数

示例如下:

%% 随机数的产生

%% 二项分布随机数
clear all
r = binornd(6,0.8)
R = binornd(6,0.8,4,5) %产生一个4*5的矩阵

结果如下:
在这里插入图片描述

2. 泊松分布随机数

示例如下:

%% 泊松分布随机数
clear all
r = poissrnd(6) %泊松分布
R = poissrnd(6,3,3) %产生一个3*3的矩阵

结果如下:
在这里插入图片描述

3. 均匀分布随机数

均匀性:

%% 均匀分布随机数

% 连续型
clear all
r = unifrnd(1,5) %均匀分布 15之间
R = unifrnd(1,5,3,3) %产生一个3*3的矩阵

结果如下:
在这里插入图片描述
离散型:

% 离散型
clear all
r = unidrnd(6)
R = unidrnd(6,3,3)

结果如下:
在这里插入图片描述

4. 正态分布

示例如下:

%% 正态分布
clear all
r = normrnd(0,1)
R = normrnd(0,1,[3 4]) % 产生一个3*4的矩阵,均值为0,标准差为1

结果如下:
在这里插入图片描述


十、MATLAB绘图

MATLAB具有强大的绘图功能,可以绘制各种各样的图,这里为大家展示几种。

一元函数:

%% MATLAB绘图

%% 一元函数
x = -2:0.1:4;
figure;
plot(x,humps(x));
title('plot');
figure;
fplot(@humps,[-2,4])  %曲线更加光滑
title('fplot');

结果如下:
在这里插入图片描述
请添加图片描述

极坐标绘图:

%% 极坐标绘图
clear all
figure;
ezpolar('sin(8*t).*cos(8*t)',[0,pi]);

结果如下:
在这里插入图片描述
符号函数的三位网格图:

%% 符号函数的三位网格图

clear all
figure;
ezmesh('x.*exp(x.^2-y.^2)');

结果如下:
在这里插入图片描述
三维彩色曲面图:

%% 三维彩色曲面图

clear all
figure;
ezsurf('x.*y.^3/(x.^2+y.^3)');

结果如下:
在这里插入图片描述
上述两种图形都可以加等值面或等值线,只需要在相应函数后加“c”即可。

绘图更多操作:

%% 一元函数
x = -2:0.1:4;
figure; %显示绘图界面
subplot(1,2,1) %同时显示两个图
plot(x,humps(x),'r-.*'); %绘图
title('plot');  %题目
xlabel('x') %加横坐标标签x
ylabel('y') %加纵坐标标签y
grid on; %显示网格线
hold on;
subplot(122)
fplot(@sin,[-2,4])  %曲线更加光滑
title('fplot');

结果如下:
在这里插入图片描述
饼状图:

%% 饼状图
clear all
figure;
y = [0.1 0.2 0.3 0.2 0.2];
explode=[0 0 1 0 0] %第三个突出
pie(y,explode);

结果如下:
在这里插入图片描述
直方图:

%% 直方图
clear all
figure;
x = randn(500,1) %标准正态分布
subplot(121)
hist(x); %默认十个柱子
subplot(122);
y = randn(800,1)
hist(y,-4:0.1:4);

结果如下:
在这里插入图片描述
火柴杆图:

%% 火柴杆图
clear all
x = 0.1:0.5:5*pi
y = sin(x)
figure;
stem(x,y,'r')

结果如下:
在这里插入图片描述
阶梯图:

%% 阶梯图
clear all
x = 0.1:0.5:5*pi
y = sin(x)
figure;
stairs(x,y,'r')

结果如下:
在这里插入图片描述
罗盘图:

%% 罗盘图
clear all;
x = [1 -3 5 -6 8 9];
y = [5 7 -9 12 15 -9];
figure;
compass(x,y,'r')

结果如下:
在这里插入图片描述
羽毛图:

%% 羽毛图
clear all;
x = [1 -3 5 -6 8 9];
y = [5 7 -9 12 15 -9];
figure;
feather(x,y,'r')

结果如下:
在这里插入图片描述
彗星图:

%% 彗星图

clear all
t = -pi:pi/100:pi;
y = tan(sin(t))-sin(tan(t));
comet(t,y);

结果如下:
在这里插入图片描述


这篇MATLAB笔记写的太简陋了,美国也限制我们学校使用MATLAB,所以可能MATLAB也不会成为我日后使用的主力,还是好好学C++和python吧!

这篇文章就酱。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值