收集一些好用的函数名,具体语法等用时再查文档。
常用的可以看 MATLAB 教程书籍的附录。这里放一个整理的 pdf。
# 统计函数
# 向量的元素和/矩阵的每列和/最值/均值
cumsum(A) % 累积和/每列的累积和,即前缀和
sum(A)
min(A)
max(A)
mean(A)
[x, l] = min(A) % 顺便把最小值位置 index 给 l
sum(A,2) % 矩阵的每行和(平均数),2 是第二维
# 向量长度、矩阵大小
length(V)
size(A) %返回一个1x2数组
# 列排序(返回数列、原数列元素在新数列的index)
[B I] = sort(V)
[B I] = sort(V,'descend') %降序
# find
很重要很重要!!
第一行找到 v 中大于 0 的元素的下标。
第二行把下标矩阵作为原矩阵的下标,则可以直接筛选到对应下标的元素组成的矩阵。
相当于实现了一个筛选矩阵元素的功能。可以用 if
改写,但是 MATLAB 中矩阵运算更快,因此能用矩阵运算就不要用 if
。
v = [1 0 -3 7 -5];
idx = find(v>=0); % idx == [1 2 4]
v1 = v(idx); % v1 = [1 0 7]
注意到,除了把下标矩阵 idx
传给 v
以外,还可以直接把 v>=0
传给矩阵,省去了一个 find
的过程。
v = [1 0 -3 7 -5];
v2 = v(v>=0); % v2 = [1 0 7]
# 好用的函数收集
(从 xls/xlsx csv txt)读写表格:xlsread
,readmatrix
(MATLAB R2019a 起)。
注意 readmatrix
如不指定 NumHeaderLines
参数时,会自动识别并去掉行表头。写代码的时候小心。
映射、map:containers.Map
(opens new window)。
分段函数:piecewise
。
# 最优化、规划问题相关
求函数最小值,有一堆工具箱函数不知道有什么区别,可能使用的算法不同:
功能 | 函数名 | 注释 |
---|---|---|
单变量优化 | fminbnd() | 求一元函数最小值 |
无约束优化 | fminsearch() | 使用无导数法计算最小值 |
fminunc() | 计算无约束的多变量函数的最小值 | |
有约束优化 | fmincon() | 在有线性约束下计算最小值 |
线性规划 | linprog() | 解线性规划问题 |
整数规划 | intlinprog() | 解整数线性规划问题 |
遗传算法 | ga() | 包含以上所有功能,不过精度较低 |
# 基于问题的最优化
最优化相关的基于问题的方法 Problem-Based Approach
:
x = optimvar('x',2,'LowerBound',0);
xb = optimvar('xb','LowerBound',0,'UpperBound',1,'Type','integer');
prob = optimproblem('Objective',-3*x(1)-2*x(2)-xb);
cons1 = sum(x) + xb <= 7;
cons2 = 4*x(1) + 2*x(2) + xb == 12;
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
% Convert the problem object to a problem structure.
problem = prob2struct(prob);
% Set Options
problem.options = optimoptions('intlinprog','Display',"off");
% Solve the resulting problem structure.
[sol,fval,exitflag,output] = intlinprog(problem)
说白了,就是 prob2struct
函数能够将 4*x(1) + 2*x(2) + xb == 12
这样的直白的优化式子和约束条件,换为 intlinprog
的 Aeq
beq
。
如果使用传统的方式,这一步转化需要人工完成。
对于复杂的问题,这样更不容易出错。
跑出来的 sol
是一个 1*3 向量,那么 x
和 xb
对应哪些变量呢?
可以使用 varindex
:
>> varindex(prob)
ans =
包含以下字段的 struct:
x: [1 2]
xb: 3
就可以看出对应关系了。
更多相关资料可查看 Problem-Based Optimization Setup - MATLAB & Simulink (opens new window)
# 插值拟合相关
该部分详解可见数模自学笔记——插值和拟合。
功能 | 函数名 | 注释 |
---|---|---|
一维插值 | interp1 | |
二维插值 | interp2 | |
样条插值 | csape | |
多项式拟合 | polyfit | 多项式值计算可使用 polyval |
# 概率统计相关
功能 | 函数名 | 注释 |
---|---|---|
正态概率函数 | normpdf | pdf: Probability Density Function |
正态分布函数 | normcdf | cdf: Cumulative Density Function |
正态下侧分位数 | norminv(p) | 返回 满足 |
按正态分布生成随机数 | normrnd | |
上述函数的卡方分布版本 | 将四个函数的 norm 改为 chi2 | 很香 |
上述函数的均匀分布版本 | 将四个函数的 norm 改为 unif | |
上述函数的指数分布版本 | 将四个函数的 norm 改为 exp | |
正态均值检验、参数估计 | ttest | |
正态方差检验、参数估计 | vartest | |
总体均值差检验、参数估计 | ttest2 | |
拟合优度(goodness-of-fit)检验 | chi2gof | |
正态分布拟合 | normfit | 使用 Wald 检验 |
曲线拟合工具箱 | cftool | |
分布拟合工具箱 | distributionFitter |
# 工具箱函数
命令 | 名称 |
---|---|
cftool | 曲线拟合工具箱 |
distributionFitter | 分布拟合工具箱 |
# 图论
命令名 | 作用 |
---|---|
graphallshortestpaths | 求图中所有顶点对之间的最短距离 |
graphconncomp | 找无向图的连通分支,或有向图的强弱连通分支 |
graphisdag | 测试有向图是否含有圈,不含圈返回1,否则返回0 |
graphisomorphism | 确定两个图是否同构,同构返回1,否则返回0 |
graphisspantree | 确定一个图是否是生成树,是返回1,否则返回0 |
graphmaxflow | 计算有向图的最大流 |
graphminspantree | 在图中找最小生成树 |
graphpred2path | 把前驱顶点序列变成路径的顶点序列 |
graphshortestpath | 求图中指定的一对顶点间的最短距离和最短路径 |
graphtopootder | 执行有向无圈图的拓扑排序 |
graphtraverse | 求从一顶点出发,所能遍历图中的顶点 |
# 绘图及图片处理
见绘图。
# 符号编程
见符号编程。