为什么要学MATLAB?因为MATLAB是很棒的数学工具,但和其他编程软件一样,它永远是工具,更重要的是我们要解决的问题和解决问题的过程,所以数学建模,学MATLAB的语法是不够的,更要掌握数学模型,了解数据处理的方法,并融合到自己的思想里。笔者了解的不多,所以先摘一张表,共勉。
类型 | 方法 |
---|---|
数据型 | 拟合、回归、分类、聚类、主成分等 |
连续型 | 微分、偏微分、差分、函数等 |
离散型 | 目标规划、智能算法(神经网络、遗传、模拟退火、蚁群、粒子群)等 |
评价型 | 层次分析法、多因子决策、回归等 |
机理型 | 自主编程 |
MATLAB基本数据类型
single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char
MATLAB符号含义的粗浅理解
(),在函数后,规范函数输入,也可以用作数组的输出 比如b(1)
[],在函数输出,规范函数输出,也可以用作数组的输入 比如b=[1,2]
{},在数据类型里是元胞数组,和结构数组很像,但结构数组是一般数组带名字,元胞是下标访问
元胞:a(1,2)={[2,2;3];5}
结构:b(1).name=
%注释
;用在语句后,在命令行窗口不作输出,也可以在数组里表示分行
:单作下标的时候,表示该维度全部范围
~可以是取反,可以是忽略参数[~,idx]=sort(kidx);
@ 粗浅地理解是方便传参的符号。
它可以和函数构成函数句柄。那么什么是句柄呢,句柄是指针的指针,相当于指针是地址,而句柄是代号,在Windows系统里,指针是会变化的,句柄指向的位置是会变的,但句柄是不会变化的。不管理解了没有,反正记住这两种用法。
y=@sin
那么sin(pi/6)=y(pi/6)
f=@(x,y)x.*y;
此时输入
x=[1,1,1,1];
y=[2,3,4,5];
f(x,y)
输出
ans =
2 3 4 5
MATLAB脚本
用edit命令创建脚本
edit mysphere
执行该命令后,会在当前文件夹创建 myshpere.m文件并打开
MATLAB保存工作区
save
save('image_label.mat','label','image_name','m','n','k')
这边第一个是保存的文件名称,后面几个是保存的变量
MATLAB解微分方程
matlab中解常微分方程有两种方法,一种是符号解法,另一种是数值解法
常用符号解法
即使用dslove命令
dsolve('Dy=1','x')
dsolve命令中 D表示一阶微分,D2表示二阶,以此类推
默认变量为t 所以使用时应声明变量
此外,如图所示警告,该写法可以运算,但不符合新版要求,应该先声明符号变量
输出结果:
这是官网的要求
--------------------------------------------我是分割线------------------------------------------
新的写法:
一般微分方程
单个因变量的 返回原函数
syms y(t) a
eqn = diff(y,t) == a*y;
S = dsolve(eqn)
S = C1*exp(a*t)
多个的返回一个结构
syms y(t) z(t)
eqns = [diff(y,t) == z, diff(z,t) == -y];
S = dsolve(eqns)
S = struct with fields:
z: [1x1 sym]
y: [1x1 sym]
如果要输出y和z ,再输入
ySol(t) = S.y
zSol(t) = S.z
or
S.y
S.z
也可以一开始就写如下代码,定义输出类型
syms y(t) z(t)
eqns = [diff(y,t)==z, diff(z,t)==-y];
[ySol(t),zSol(t)] = dsolve(eqns)
其中syms 声明符号变量
eqn(equation 方程式)
diff(y,t)表示y关于t的一阶导数
diff(y,t,2)表示二阶,以此类推
带条件的微分方程
syms y(t) a
eqn = diff(y,t) == a*y;
cond = y(0) == 5;
ySol(t) = dsolve(eqn,cond)
对于没有显式解的微分方程(不做深入了解)
sol = dsolve(eqn,'Implicit',true)
MATLAB矩阵
矩阵的基本操作
- 定义一个数组/矩阵
A=[1,1,1]
B=[1,1,1;2,2,2]
-
数组的基本运算
+,- 作为双目是基本的加减运算,作为单目是正负运算
.* 逐元素乘法 A.*B 表示 A 和 B 的逐元素乘积。(逐元素,即aij*bij)
.^ 逐元素求幂 A.^B 表示包含元素 A(i,j) 的 B(i,j) 次幂的矩阵。(逐元素,即aij^bij)
./ 逐元素右除 A./B 表示A(i,j)/B(i,j) 。
.\ 逐元素左除
.’ 普通转置 -
矩阵的基本运算
’ 复共轭转置 和普通转置区别在于对于含复数的矩阵,复共轭转置后复数取共轭
/ 右除 A/B 结果为BX=A的解
\左除 B\A 结果为 AX=B的解
*矩阵乘法
^ 矩阵幂 矩阵可以作为指数(由于笔者精力和能力不够 先不深入了解)
数组运算隐式转换,自动填充,对于之前定义的A、B
B-A
ans=
0 0 0
1 1 1
但注意3*3矩阵减去3*2是会报错的
Pascal矩阵(杨辉三角)
P=pascal(n)
生成一个Pascal矩阵 如图为pascal(4)
A = pascal(n,1)
返回帕斯卡矩阵的下三角 Cholesky 因子,A 是对合矩阵
对于正定矩阵P,存在Cholesky 因子 A,A*A’=P
下为A = pascal(3,1)
1 0 0
1 -1 0
1 -2 1
P=pascal(3,'double')
指定矩阵的类
求矩阵的逆
inv(A)
单位矩阵
eye(5)
全0矩阵
zeros(5)
全1矩阵
a=ones(5)
对角矩阵
a=diag[1,2,3]
矩阵转化为三角矩阵
下三角(保留矩阵的下三角部分)
tril()
上三角
triu()
MATLAB绘图
画球体
[x,y,z] = sphere(); % 创建一个球,括号里参数k表示由k*k平面组成,默认20*20个平面组成,半径默认为1
r = 2;
figure(1); %打开窗口,可写可不写,默认打开一个窗口,参数是窗口的编号
surf(x*r,y*r,z*r) % 绘制半径为2的球.
axis equal % 坐标轴长度相等. //axis是纵横比