MATLAB 数据处理方面功能强大,尤其在高维数据处理和矩阵运算方面。隔壁家的 NumPy 和 R 就是个弟弟。并且 Matlab 集成了很多机器学习和数据挖掘算法,图形界面简单上手,懒人福音。缺点就是软件太庞大,只能无事不登三宝殿。在 Linux 中可以通过 matlab -nodesktop -nodisplay
直接在终端运行,Windows 中虽然可以不显示图形界面,但是还是要用 Matlab 自家的 terminal。但是这样可以明显降低内存占用。
科学计算
常用命令
1
2
3
4
5
6
7
8
9
10
11
% 切换数值显示模式
format long e
pi
format short
pi
% 列出工作区变量
who
% 清除工作区变量
clear
% 清屏
clc
数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% 创建数组
N = []; % 空数组
row = [1 2 3 4]; % 一维行向量
col = [1;2;3;4]; % 一维列向量
square = [1 2 3; 4 5 6; 7 8 9]; % 3x3二维数组
N(1:4) = [2 4 8 16]; % 索引与赋值,索引从 1 开始
% 数组运算
N / row % 左除,得到标量
N ./ row % 点左除,类似元素积,这里是元素商,分母在右
N \ row % 右除,得到矩阵
N .\ row % 点右除,类似元素积,这里是元素商,分母在左
A * B % 矩阵乘
B .* C % 点乘(注意不是数学上的点乘,这里是元素积,求和为点乘结果)
sqrtm(square) % 矩阵平方根,即 sqrtm(X) * sqrtm(X) = X,其中 * 为矩阵乘
sqrt(N) % 分别对每个元素开方
矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
% 创建矩阵
a = [1 2 3; 4 5 6]
b = [a;7 8 9]
% 索引元素
a(2, 2) % 值为5的元素
b(1, :) % 第一行
b(:, 2) % 第二列
b(2:3, 2:3) % 一个2x2的子块:[5 6; 8 9]
% 矩阵生成函数
c = zeros(3) % 3x3全零
c = ones(3) % 3x3全一
c = eye(3) % 3x3对角矩阵
% 矩阵运算
b / c % 左除
b \ c % 右除
% 对于两个方阵,左除和右除是对称的:b/c=c\b
% 非方阵结果不一致,可能有error或warning,这里不完全遵循数学上的运算法则
[e1, e2] = eig(a) % 得到方阵的特征向量和特征值
[L, U, P] = lu(a) % LU分解
多项式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 生成多项式
poly2sym([1 2 3 4]) % 参数为系数,幂数由高到低直到零次
poly2sym(poly(b)) % 由矩阵求特征多项式
root = [-5 -3+4i -3-4i] % 定义一个特征根
poly2sym(poly(root)) % 由特征根生成多项式
% 多项式的运算
p=[1 11 55 125];
b=[1 1;1 1];
polyval(p,b)
polyvalm(p,b)
p=[2 -5 6 -1 9];
roots(p) %求对应系数的多项式的所有根
c=[ 10 40 100 160 170 120];
u=[1 2 3 4];
[q,r]=deconv(c,u) %计算多项式c/u
poly2sym(p)
Dp=polyder(p) %求多项式微分
poly2sym(Dp)
代数与微积分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% 定义代数式
U=sym('3*x^2+5*y+2*x*y+6') %定义符号表达式
syms x y %建立符号变量
V=3*x^2+5*y+2*x*y+6 %定义符号表达式V
2*U-V+6 %由已知代数式计算新的代数式
% 代数运算
A=sym('[a,2*b;3*a,0]') % 由行列式创建方程组
transpose(A) %转置
factor(U) %分解因式
simplify(U) %自动化简
syms a x; f=sin(a*x) %创建函数f
dfx=diff(f,x) %对x求导
dfa=diff(f,a) %对a求导
f1=x*log(1+x) %创建函数f1
int1=int(f1,x) %求x的不定积分
int2=int(f1,x,0,1) %0-1区间上的定积分
%求微分方程dy/dx+3xy=xe^(-x^2)的通解:
f1=dsolve('Dy+3*x*y=x*exp(-x^2)','x')
%求微分方程在y|x=1 = 2e初始条件下的特解:
f2=dsolve('x*Dy+2*y-exp(x)=0','y(1)=2*exp(1)','x')
%求二阶微分方程的通解:
f3=dsolve('D2y+2*Dy+exp(x)=0','x')
数据可视化
基本绘图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 自变量(创建序列)
x = -2*pi:pi/100:2pi
% 工作区绘图:选中工作区变量,点击菜单栏【绘图】选项卡,选择图形
% 命令绘图:plot(x1, y1, option1, x2, y2, option2, ...)
% 获取相应绘图指令:help graph3d(包名)
% 三维绘图:plot(x1, y1, z1, option1, x2, y2, z2, option2, ...)
% 示例1:三维曲线
t = 0:pi/50:8*pi;
x = sin(t); y = cos(t); z = t;
plot3(x, y, z)
% 示例2:三维曲面
x = -8:0.5:8; y = x;
[X, Y] = meshgrid(x, y); % 设置矩形网格
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R) ./ R; % 定义函数关系
mesh(X, Y, Z) % 绘制曲面网格
grid on % 坐标空间网格
surf(X, Y, Z) % 绘制曲面阴影
图像修饰
1
2
3
4
5
6
7
8
9
10
11
12
13
% 打开不同的图形窗口:figure(1), figure(2), ...
% 划分图形窗口:subplot(m, n, p) -- 分成m*n的窗格,p为当前子图编号
% 示例
t=[0:pi/20:4*pi];
hold on %允许在同一坐标系上绘制多个图形
axis([0 4*pi -10 10]) %设置坐标轴范围
plot(t,10*sin(t),'r+:') %线形为点画线,颜色为红色,数据点为加号形状
plot(t,5*cos(t),'b*--')
xlabel('时间t'); ylabel('幅值x')
title('简单绘图实例')
legend('x1=10sint:点画线','x2=5cost:虚线') %添加文字注释
grid on
计算机视觉应用
图像白化处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clear, clc, close all;
I = imread('test.png');
[m, n] = size(I);
p = reshape(I, m*n, 1); % 矩阵转为向量
p = single(p); % 转为单精度
mu = mean(p); % 取均值
va = var(p); % 取方差
for i=1:m % 归一化
for j=1:n
X(i,j) = (double(I(i,j))-mu)/sqrt(va);
end
end
figure, imshow(I)
figure, imshow(X)
% 搞来搞去,感觉还是 opencv 好用一点,MatLab不太行啊
% 有空深入学习一下 opencv
CV模型交叉验证例子
———-get_angerr.m
———-
1
2
3
4
5
6
7
8
% 输入参数 test:测试值 -- 即真值,三通道颜色矩阵
% 输入参数 pred:对应 test 的预测值
% 输出:预测值和真值的角误差 -- 即高维张量在欧几里得空间的余弦相似度
function [r] = get_angerr(test, pred)
i1 = test / sqrt(sum(test.^2));
i2 = pred / sqrt(sum(pred.^2)); % 尺度缩放
r = acosd(sum(i1(:).^2(:))); % 点积的反余弦
———-grid_search.m
———-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
% 导入模型参数表
load('Params_Grid.mat')
% 空矩阵,储存验证集误差
AngularError = zeros(4, N);
idx = 1; % 遍历 N 组参数
best = 1; % 初始化最优参数序号
error = 1e5; % 初始化误差值
% 遍历对应的模型结果
for i = 1:10
for j = 1:10
for k = 1:10 % 循环范围取决于参数网格精度
% 根据参数导入对应模型结果
eval(['load(', num2str(i), num2str(j), num2str(k), '.mat);']);
% 计算并储存误差度量值
AngularError(1, idx) = get_angerr(y_dev, y_pred);
AngularError(2, idx) = i; %储存参数 i
AngularError(3, idx) = j; %储存参数 j
AngularError(4, idx) = k; %储存参数 k
idx = idx + 1;
% 更新最优参数序号
if AngularError(1, idx) < error
error = AngularError(1, idx);
best = idx
end
end
end
end
这里只作为 matlab 流程控制和函数功能的示例,实际上交叉验证使用自带的函数就可以完成。