MATLAB 详细教程

目录

  1. MATLAB简介
  2. 安装与环境配置
  3. 基础语法和操作
  4. 数组和矩阵操作
  5. 数据可视化
  6. 编程基础
  7. 函数编写
  8. 文件操作
  9. 数值计算
  10. 符号计算
  11. 图形用户界面
  12. 高级应用
  13. 工具箱介绍

1. MATLAB简介

什么是MATLAB?

MATLAB(Matrix Laboratory)是由MathWorks公司开发的商业数学软件,主要用于数值计算、数据分析和可视化。

MATLAB的特点

  • 强大的矩阵运算能力
  • 丰富的内置函数库
  • 交互式开发环境
  • 专业的工具箱
  • 跨平台兼容性
  • 与其他语言的良好接口

MATLAB应用领域

  • 工程计算和仿真
  • 数据分析和可视化
  • 信号处理和图像处理
  • 控制系统设计
  • 机器学习和深度学习
  • 金融建模

2. 安装与环境配置

安装MATLAB

  1. 访问MathWorks官网:https://www.mathworks.com/
  2. 下载安装程序
  3. 按照向导完成安装

MATLAB桌面环境

1
2
3
4
% 常用命令
clc % 清空命令窗口
clear % 清空工作区变量
close all % 关闭所有图形窗口

路径设置

1
2
3
4
5
6
7
8
9
10
11
% 查看当前路径
pwd

% 添加路径
addpath('D:\my_functions')

% 保存路径
savepath

% 查看搜索路径
path

3. 基础语法和操作

基本运算

1
2
3
4
5
6
7
8
9
10
11
% 算术运算
a = 5 + 3; % 加法
b = 10 - 4; % 减法
c = 6 * 2; % 乘法
d = 8 / 2; % 除法
e = 2 ^ 3; % 幂运算
f = mod(10, 3); % 取余

% 显示结果
disp(a);
fprintf('a = %d\n', a);

变量和数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 数值类型
x = 3.14; % 双精度浮点数
y = int32(5); % 32位整数
z = single(2.5); % 单精度浮点数

% 字符和字符串
name = 'John Doe';
message = "Hello, MATLAB";

% 逻辑类型
flag = true;
result = (5 > 3);

% 查看变量信息
whos

特殊变量和常量

1
2
3
4
5
pi          % 圆周率
eps % 浮点数相对精度
inf % 无穷大
NaN % 非数字
i, j % 虚数单位

4. 数组和矩阵操作

创建数组和矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 行向量
v1 = [1, 2, 3, 4, 5];
v2 = 1:5; % 1到5
v3 = 1:2:10; % 1到10,步长为2

% 列向量
v4 = [1; 2; 3; 4; 5];

% 矩阵
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
B = zeros(3, 3); % 3x3零矩阵
C = ones(2, 4); % 2x4一矩阵
D = eye(3); % 3x3单位矩阵
E = rand(3, 3); % 3x3随机矩阵
F = magic(3); % 3x3魔方矩阵

矩阵运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% 基本运算
A = [1, 2; 3, 4];
B = [5, 6; 7, 8];

C = A + B; % 矩阵加法
D = A - B; % 矩阵减法
E = A * B; % 矩阵乘法
F = A .* B; % 元素乘法
G = A ^ 2; % 矩阵幂
H = A .^ 2; % 元素幂

% 矩阵函数
det_A = det(A); % 行列式
inv_A = inv(A); % 逆矩阵
rank_A = rank(A); % 秩
trace_A = trace(A); % 迹
[V, D] = eig(A); % 特征值和特征向量

数组索引和操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 创建测试矩阵
M = magic(4);

% 索引访问
element = M(2, 3); % 第2行第3列
row = M(2, :); % 第2行
column = M(:, 3); % 第3列
submatrix = M(1:2, 2:4); % 子矩阵

% 线性索引
linear_idx = M(5); % 第5个元素(按列)

% 逻辑索引
idx = M > 10; % 大于10的元素位置
values = M(M > 10); % 大于10的元素值

% 矩阵操作
M_transpose = M'; % 转置
M_reshape = reshape(M, 2, 8); % 重塑形状
M_size = size(M); % 矩阵大小

5. 数据可视化

二维图形

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
30
31
32
33
34
% 基本绘图
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);

figure;
plot(x, y1, 'r-', 'LineWidth', 2);
hold on;
plot(x, y2, 'b--', 'LineWidth', 2);
xlabel('x');
ylabel('y');
title('正弦和余弦函数');
legend('sin(x)', 'cos(x)');
grid on;
hold off;

% 多个子图
figure;
subplot(2, 2, 1);
plot(x, sin(x));
title('正弦函数');

subplot(2, 2, 2);
plot(x, cos(x));
title('余弦函数');

subplot(2, 2, 3);
plot(x, tan(x));
title('正切函数');
ylim([-5, 5]);

subplot(2, 2, 4);
plot(x, exp(-x));
title('指数衰减');

其他二维图形

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
% 散点图
x = randn(100, 1);
y = randn(100, 1);
figure;
scatter(x, y, 50, 'filled');
title('散点图');

% 柱状图
data = [23, 45, 56, 78, 43];
categories = {'A', 'B', 'C', 'D', 'E'};
figure;
bar(data);
set(gca, 'XTickLabel', categories);
title('柱状图');

% 饼图
figure;
pie(data, categories);
title('饼图');

% 直方图
data = randn(1000, 1);
figure;
histogram(data, 30);
title('直方图');

三维图形

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
% 三维曲线
t = 0:0.1:10*pi;
x = sin(t);
y = cos(t);
z = t;
figure;
plot3(x, y, z, 'LineWidth', 2);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('三维螺旋线');
grid on;

% 三维曲面
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X .* exp(-X.^2 - Y.^2);
figure;
surf(X, Y, Z);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('三维曲面');
colorbar;

% 等高线图
figure;
contour(X, Y, Z, 20);
title('等高线图');
colorbar;

6. 编程基础

条件语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
% if-elseif-else
x = 10;

if x > 0
disp('正数');
elseif x < 0
disp('负数');
else
disp('零');
end

% switch-case
day = 3;

switch day
case 1
disp('星期一');
case 2
disp('星期二');
case 3
disp('星期三');
otherwise
disp('其他天');
end

循环语句

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
% for循环
fprintf('for循环示例:\n');
for i = 1:5
fprintf('i = %d\n', i);
end

% while循环
fprintf('\nwhile循环示例:\n');
count = 1;
while count <= 5
fprintf('count = %d\n', count);
count = count + 1;
end

% 循环控制
fprintf('\n循环控制示例:\n');
for i = 1:10
if i == 3
continue; % 跳过本次循环
end
if i == 7
break; % 终止循环
end
fprintf('i = %d\n', i);
end

向量化编程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 非向量化方式(不推荐)
tic;
result1 = zeros(1, 1000000);
for i = 1:1000000
result1(i) = sin(i/1000);
end
time1 = toc;

% 向量化方式(推荐)
tic;
result2 = sin((1:1000000)/1000);
time2 = toc;

fprintf('循环方式时间: %.4f秒\n', time1);
fprintf('向量化方式时间: %.4f秒\n', time2);

7. 函数编写

基本函数

1
2
3
4
5
6
7
8
9
10
11
12
% 保存为 calculate_area.m
function area = calculate_area(radius)
% CALCULATE_AREA 计算圆的面积
% 面积 = CALCULATE_AREA(半径) 返回给定半径的圆的面积

area = pi * radius ^ 2;
end

% 调用函数
r = 5;
a = calculate_area(r);
fprintf('半径为 %.1f 的圆面积: %.2f\n', r, a);

多输入多输出函数

1
2
3
4
5
6
7
8
9
10
11
12
13
% 保存为 circle_properties.m
function [area, circumference] = circle_properties(radius)
% CIRCLE_PROPERTIES 计算圆的面积和周长
% [面积, 周长] = CIRCLE_PROPERTIES(半径)

area = pi * radius ^ 2;
circumference = 2 * pi * radius;
end

% 调用函数
r = 3;
[area, circ] = circle_properties(r);
fprintf('半径: %.1f, 面积: %.2f, 周长: %.2f\n', r, area, circ);

匿名函数

1
2
3
4
5
6
7
8
9
10
11
% 定义匿名函数
f = @(x) x.^2 + 2*x + 1;
g = @(x, y) x.^2 + y.^2;

% 使用匿名函数
x = 1:5;
y = f(x);
z = g(3, 4);

fprintf('f(2) = %.1f\n', f(2));
fprintf('g(3,4) = %.1f\n', z);

函数句柄

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% 创建函数句柄
sin_handle = @sin;
cos_handle = @cos;

% 使用函数句柄
x = 0:0.1:pi;
y1 = sin_handle(x);
y2 = cos_handle(x);

% 将函数作为参数传递
function result = apply_function(func, x)
result = func(x);
end

% 调用
values = apply_function(@exp, 1:3);
disp(values);

8. 文件操作

文本文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 写入文本文件
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
writematrix(data, 'data.txt');

% 读取文本文件
loaded_data = readmatrix('data.txt');
disp('读取的数据:');
disp(loaded_data);

% 使用fprintf写入格式化数据
file_id = fopen('formatted_data.txt', 'w');
fprintf(file_id, '姓名\t年龄\t成绩\n');
fprintf(file_id, '张三\t20\t85.5\n');
fprintf(file_id, '李四\t22\t92.0\n');
fclose(file_id);

Excel文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 写入Excel文件
data = {'姓名', '年龄', '成绩';
'张三', 20, 85.5;
'李四', 22, 92.0};
writecell(data, 'students.xlsx');

% 读取Excel文件
[num_data, txt_data, raw_data] = xlsread('students.xlsx');
disp('数值数据:');
disp(num_data);
disp('文本数据:');
disp(txt_data);

% 使用writetable和readtable
table_data = table({'张三'; '李四'}, [20; 22], [85.5; 92.0], ...
'VariableNames', {'姓名', '年龄', '成绩'});
writetable(table_data, 'students_table.xlsx');
new_table = readtable('students_table.xlsx');
disp(new_table);

MAT文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
% 保存工作区变量
x = 1:10;
y = sin(x);
A = magic(5);

save('my_data.mat', 'x', 'y', 'A');

% 加载MAT文件
clear all;
load('my_data.mat');
whos

% 保存为特定格式
save('data_v7.mat', 'x', 'y', '-v7.3');

9. 数值计算

线性代数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 解线性方程组
A = [3, 2, -1; 2, -2, 4; -1, 0.5, -1];
b = [1; -2; 0];
x = A \ b;
fprintf('方程组的解:\n');
disp(x);

% 验证解
residual = A * x - b;
fprintf('残差: %.2e\n', norm(residual));

% 矩阵分解
[L, U, P] = lu(A); % LU分解
[Q, R] = qr(A); % QR分解
[U, S, V] = svd(A); % 奇异值分解

数值积分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 定积分
f = @(x) exp(-x.^2);
integral_value = integral(f, 0, 1);
fprintf('积分值: %.6f\n', integral_value);

% 二重积分
f2 = @(x, y) x.^2 + y.^2;
integral2_value = integral2(f2, 0, 1, 0, 1);
fprintf('二重积分值: %.6f\n', integral2_value);

% 梯形法数值积分
x = 0:0.01:1;
y = exp(-x.^2);
trapz_value = trapz(x, y);
fprintf('梯形法积分值: %.6f\n', trapz_value);

常微分方程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 解常微分方程
% dy/dt = -2y, y(0) = 1
ode_fun = @(t, y) -2 * y;
t_span = [0, 5];
y0 = 1;
[t, y] = ode45(ode_fun, t_span, y0);

% 绘图
figure;
plot(t, y, 'b-', 'LineWidth', 2);
hold on;
% 解析解
y_analytical = exp(-2*t);
plot(t, y_analytical, 'r--', 'LineWidth', 1);
xlabel('t');
ylabel('y');
legend('数值解', '解析解');
title('常微分方程求解');
grid on;

优化问题

1
2
3
4
5
6
7
8
9
10
11
12
13
% 无约束优化
f = @(x) (x(1)-1)^2 + (x(2)-2)^2;
x0 = [0, 0];
[x_opt, fval] = fminunc(f, x0);
fprintf('最优解: x1=%.2f, x2=%.2f\n', x_opt(1), x_opt(2));
fprintf('最优值: %.2f\n', fval);

% 有约束优化
A = [1, 1];
b = 1;
lb = [0, 0];
[x_opt_con, fval_con] = fmincon(f, x0, A, b, [], [], lb, []);
fprintf('有约束最优解: x1=%.2f, x2=%.2f\n', x_opt_con(1), x_opt_con(2));

10. 符号计算

符号变量和表达式

1
2
3
4
5
6
7
8
9
10
11
12
% 定义符号变量
syms x y z

% 符号表达式
f = x^2 + 2*x + 1;
g = sin(x) + cos(y);
h = x^2 + y^2 - 1;

% 显示表达式
disp('符号表达式:');
disp(f);
disp(g);

符号微积分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 微分
df_dx = diff(f, x);
d2f_dx2 = diff(f, x, 2);
disp('一阶导数:');
disp(df_dx);
disp('二阶导数:');
disp(d2f_dx2);

% 积分
int_f = int(f, x);
int_def = int(f, x, 0, 1);
disp('不定积分:');
disp(int_f);
disp('定积分:');
disp(int_def);

% 极限
lim_sin = limit(sin(x)/x, x, 0);
disp('极限值:');
disp(lim_sin);

方程求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 代数方程
eq1 = x^2 - 3*x + 2 == 0;
sol1 = solve(eq1, x);
disp('方程的解:');
disp(sol1);

% 方程组
eq2 = x + y == 5;
eq3 = x - y == 1;
sol2 = solve([eq2, eq3], [x, y]);
disp('方程组的解:');
disp(sol2);

% 微分方程
syms y(t)
ode = diff(y,t) == -2*y;
cond = y(0) == 1;
y_sol = dsolve(ode, cond);
disp('微分方程的解:');
disp(y_sol);

11. 图形用户界面

使用GUIDE创建GUI

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
30
31
32
33
34
35
36
37
38
39
40
41
% 创建简单的GUI程序
function simple_gui
% 创建图形窗口
fig = figure('Position', [100, 100, 400, 300], ...
'Name', '简单计算器', ...
'NumberTitle', 'off');

% 创建控件
uicontrol('Style', 'text', ...
'Position', [50, 250, 100, 20], ...
'String', '输入数字:');

edit_box = uicontrol('Style', 'edit', ...
'Position', [150, 250, 100, 20]);

uicontrol('Style', 'pushbutton', ...
'Position', [150, 200, 100, 30], ...
'String', '计算平方', ...
'Callback', @calculate_square);

result_text = uicontrol('Style', 'text', ...
'Position', [50, 150, 200, 20], ...
'String', '结果将显示在这里');

% 回调函数
function calculate_square(~, ~)
try
input_str = get(edit_box, 'String');
num = str2double(input_str);
if isnan(num)
set(result_text, 'String', '请输入有效数字');
else
result = num ^ 2;
set(result_text, 'String', ...
sprintf('%.2f的平方是: %.2f', num, result));
end
catch
set(result_text, 'String', '计算错误');
end
end
end

程序化创建GUI

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function programmatic_gui
% 创建主窗口
fig = uifigure('Name', '数据绘图工具', ...
'Position', [100, 100, 600, 400]);

% 创建坐标区
ax = uiaxes('Parent', fig, ...
'Position', [200, 50, 350, 300]);

% 创建下拉菜单
dropdown = uidropdown('Parent', fig, ...
'Position', [50, 300, 100, 22], ...
'Items', {'正弦函数', '余弦函数', '随机数据'});

% 创建按钮
btn = uibutton('Parent', fig, ...
'Position', [50, 250, 100, 30], ...
'Text', '绘图', ...
'ButtonPushedFcn', @plot_data);

% 回调函数
function plot_data(~, ~)
x = linspace(0, 2*pi, 100);
selected = dropdown.Value;

cla(ax);

switch selected
case '正弦函数'
y = sin(x);
plot(ax, x, y, 'b-', 'LineWidth', 2);
title(ax, '正弦函数');

case '余弦函数'
y = cos(x);
plot(ax, x, y, 'r-', 'LineWidth', 2);
title(ax, '余弦函数');

case '随机数据'
y = randn(1, 100);
scatter(ax, 1:100, y, 'filled');
title(ax, '随机数据');
end

grid(ax, 'on');
end
end

12. 高级应用

图像处理

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
% 读取和显示图像
img = imread('peppers.png'); % 使用MATLAB自带的图像
figure;
subplot(2, 2, 1);
imshow(img);
title('原图像');

% 转换为灰度图像
if size(img, 3) == 3
gray_img = rgb2gray(img);
subplot(2, 2, 2);
imshow(gray_img);
title('灰度图像');
end

% 图像增强
enhanced_img = histeq(gray_img);
subplot(2, 2, 3);
imshow(enhanced_img);
title('直方图均衡化');

% 边缘检测
edges = edge(gray_img, 'canny');
subplot(2, 2, 4);
imshow(edges);
title('边缘检测');

信号处理

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
% 生成信号
fs = 1000; % 采样频率
t = 0:1/fs:1; % 时间向量
f1 = 50; % 信号频率
f2 = 120; % 噪声频率

% 合成信号
signal = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t);
noise = 0.5 * randn(size(t));
x = signal + noise;

% 傅里叶变换
N = length(x);
X = fft(x);
f = (0:N-1) * fs / N;

% 绘图
figure;
subplot(2, 1, 1);
plot(t, x);
xlabel('时间 (s)');
ylabel('幅度');
title('时域信号');

subplot(2, 1, 2);
plot(f(1:N/2), abs(X(1:N/2)));
xlabel('频率 (Hz)');
ylabel('幅度');
title('频域信号');

机器学习基础

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
30
31
32
33
34
35
36
37
38
39
% 加载数据
load fisheriris;
X = meas;
Y = species;

% 数据预处理
[m, n] = size(X);
mu = mean(X);
sigma = std(X);
X_norm = (X - mu) ./ sigma;

% 主成分分析
[coeff, score, latent] = pca(X_norm);

% 可视化PCA结果
figure;
gscatter(score(:,1), score(:,2), Y);
xlabel('第一主成分');
ylabel('第二主成分');
title('PCA结果');
legend('Location', 'best');

% 简单的分类器
cv = cvpartition(Y, 'HoldOut', 0.3);
idx_train = training(cv);
idx_test = test(cv);

X_train = X_norm(idx_train, :);
Y_train = Y(idx_train);
X_test = X_norm(idx_test, :);
Y_test = Y(idx_test);

% 使用拟合判别分析
Mdl = fitcdiscr(X_train, Y_train);
Y_pred = predict(Mdl, X_test);

% 计算准确率
accuracy = sum(strcmp(Y_pred, Y_test)) / length(Y_test);
fprintf('分类准确率: %.2f%%\n', accuracy * 100);

13. 工具箱介绍

常用工具箱

  1. 统计和机器学习工具箱

    • 统计分析
    • 机器学习算法
    • 假设检验
  2. 优化工具箱

    • 线性规划
    • 非线性优化
    • 整数规划
  3. 信号处理工具箱

    • 滤波器设计
    • 频谱分析
    • 小波变换
  4. 图像处理工具箱

    • 图像增强
    • 图像分割
    • 形态学操作
  5. 控制系统工具箱

    • 系统建模
    • 控制器设计
    • 系统仿真

工具箱使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% 检查工具箱是否安装
if license('test', 'Statistics_Toolbox')
disp('统计工具箱可用');
else
disp('统计工具箱不可用');
end

% 使用特定工具箱函数
if exist('pca', 'file')
% 使用统计工具箱的PCA函数
[coeff, score, latent] = pca(X);
else
% 手动实现PCA
[V, D] = eig(cov(X));
[~, idx] = sort(diag(D), 'descend');
coeff = V(:, idx);
score = X * coeff;
end

学习资源推荐

官方资源

推荐书籍

  • 《MATLAB编程(中文版)》
  • 《MATLAB数值计算》
  • 《MATLAB机器学习》

实践建议

  1. 从基础开始:熟练掌握基本语法和矩阵操作
  2. 多做练习:通过实际问题巩固知识
  3. 学习向量化:提高代码效率
  4. 探索工具箱:了解专业领域的应用
  5. 参与社区:MathWorks社区和File Exchange

常见问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
% 调试技巧
dbstop if error % 错误时暂停
dbstop if warning % 警告时暂停

% 性能分析
profile on
% 运行你的代码
profile off
profile viewer

% 内存管理
memory % 查看内存使用情况
pack % 整理内存碎片

这个MATLAB教程涵盖了从基础到高级的主要知识点。MATLAB的学习需要大量的实践,建议在学习过程中:

  1. 动手实践:每个示例代码都要亲自运行和修改
  2. 解决问题:尝试用MATLAB解决实际工程或数学问题
  3. 查阅文档:善用MATLAB的帮助文档
  4. 循序渐进:从基础开始,逐步学习高级功能

祝各位MATLAB学习顺利!