MATLAB 从入门到精通

本教程基于 MATLAB R2024b 及之前版本通用语法编写,适用于所有主流操作系统(Windows/macOS/Linux)。


一、MATLAB 简介与环境搭建

1.1 什么是 MATLAB?

  • 全称:Matrix Laboratory(矩阵实验室)
  • 开发公司:MathWorks
  • 核心优势
    • 强大的矩阵运算能力
    • 内置丰富的数学函数库
    • 支持脚本化、函数化、面向对象编程
    • 提供 Simulink 实现系统级建模与仿真
    • 拥有超过 100 个专业工具箱(Toolbox)

1.2 安装与启动

  • 可通过 MathWorks 官网申请学生版(免费)或购买商业授权。
  • 启动后主界面包括:
    • Command Window:执行命令
    • Workspace:查看变量
    • Current Folder:文件管理
    • Editor:编写 .m 文件
    • Command History:历史命令记录

二、基础语法详解

2.1 变量与数据类型

类型示例说明
doublex = 3.14;默认浮点类型(64位)
singley = single(2.5);单精度浮点
int8/16/32/64a = int16(100);整型,节省内存
charname = 'Tom';字符数组
stringname = "Tom";字符串对象(R2016b+)
logicalflag = true;布尔值
cellC = {1, 'text'; [1 2], 3.14};单元数组(异构数据)
structs.name = 'Alice'; s.age = 25;结构体

注意:MATLAB 是 动态类型语言,无需声明变量类型。


2.2 矩阵与数组操作(核心)

2.2.1 创建矩阵
A = [1 2 3; 4 5 6];           % 手动输入 2x3 矩阵
B = zeros(3);                 % 3x3 零矩阵
C = ones(2,4);                % 2x4 全1矩阵
D = eye(3);                   % 3x3 单位矩阵
E = rand(3,2);                % 3x2 均匀随机矩阵
F = magic(4);                 % 4x4 幻方矩阵
G = 1:0.5:5;                  % 步长为0.5的向量 [1,1.5,...,5]
H = linspace(0, pi, 100);     % 100个点,从0到π
2.2.2 矩阵索引(Indexing)
A(2,3)        % 第2行第3列元素
A(1,:)        % 第1行所有列
A(:,2)        % 第2列所有行
A(2:end,1:2)  % 第2到末行,第1到2列
A([1 3], [2 4]) % 提取指定行列子矩阵
A(:)          % 将矩阵拉成一列向量
2.2.3 矩阵操作
A'            % 转置
A.'           % 非共轭转置(实数相同)
A * B         % 矩阵乘法(内积)
A .* B        % 逐元素乘法(点乘)
A ./ B        % 逐元素除法
A .^ 2        % 逐元素平方
A \ b         % 解线性方程 Ax = b
[A, B]        % 水平拼接(列合并)
[A; B]        % 垂直拼接(行合并)
2.2.4 常用矩阵函数
size(A)       % 返回维度 [m,n]
length(v)     % 向量长度或最大维度
ndims(A)      % 维数
sum(A)        % 每列求和
mean(A)       % 每列均值
max(A), min(A)% 最大/最小值
det(A)        % 行列式(方阵)
rank(A)       % 秩
inv(A)        % 逆矩阵(慎用,推荐用 A\b)
eig(A)        % 特征值与特征向量
svd(A)        % 奇异值分解

2.3 流程控制语句(详细)

2.3.1 if-elseif-else
if x > 0 && y < 10
    disp('条件满足');
elseif x == 0
    disp('x为零');
else
    disp('其他情况');
end

逻辑运算符

  • &&, ||:短路逻辑(推荐用于标量)
  • &, |:逐元素逻辑(用于数组)
2.3.2 for 循环
for i = 1:5
    fprintf('i = %d\n', i);
end

% 遍历数组
for val = [10, 20, 30]
    disp(val);
end

⚠️ 性能提示:尽量使用向量化替代循环。

2.3.3 while 循环
count = 0;
while count < 5
    count = count + 1;
    if count == 3, continue; end
    if count == 4, break; end
    disp(count);
end
2.3.4 switch-case
switch lower(color)
    case 'red'
        c = [1 0 0];
    case {'green','blue'}
        c = [0 1 0] + [0 0 1];
    otherwise
        c = [0.5 0.5 0.5];
end

2.4 函数定义与调用

2.4.1 基本函数格式
% 文件名:myAdd.m
function result = myAdd(a, b)
% MYADD 两数相加
% 输入:a, b
% 输出:result = a + b
    result = a + b;
end
2.4.2 多输出函数
function [sum, diff, prod] = calc(a, b)
    sum = a + b;
    diff = a - b;
    prod = a * b;
end

% 调用
[s, d, p] = calc(10, 3);
2.4.3 局部函数(Local Functions)

一个 .m 文件中可包含多个函数,只有第一个是主函数,其余为局部函数。

function mainFunc()
    x = helperFunc(5);
    disp(x);
end

function y = helperFunc(n)
    y = n^2;
end
2.4.4 匿名函数(Anonymous Functions)
f = @(x) x^2 + 2*x + 1;
g = @(x,y) sin(x).*cos(y);

result = f(3);        % = 16
surface = fsurf(g);   % 绘图使用
2.4.5 函数句柄(Function Handle)
h = @sin;
result = h(pi/2);     % = 1

% 用于高阶函数
arrayfun(@sqrt, [4, 9, 16])  % 返回 [2,3,4]

三、数据可视化(绘图系统)

3.1 二维绘图

x = linspace(0, 4*pi, 100);
y = sin(x);

figure;
plot(x, y, 'r-o', 'LineWidth', 2, 'MarkerSize', 4);
title('正弦函数图像', 'FontSize', 14);
xlabel('x (弧度)'); ylabel('sin(x)');
grid on;
legend('sin(x)', 'Location', 'best');
axis([0 4*pi -1.5 1.5]);
其他常用 2D 图
bar(x(1:10), y(1:10));       % 条形图
stem(x(1:20), y(1:20));      % 火柴杆图
scatter(x, y, 20, y, 'filled'); % 散点图(颜色映射)
polarplot(theta, r);         % 极坐标图

3.2 三维绘图

[X,Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.*exp(-X.^2 - Y.^2);

figure;
surf(X,Y,Z);
shading interp;
colorbar;
xlabel('X'); ylabel('Y'); zlabel('Z');
title('三维曲面图');
camlight; lighting gouraud;
其他 3D 图
mesh(X,Y,Z);    % 网格图
contour(X,Y,Z); % 等高线
slice(X,Y,Z,V, [], [0], []); % 体切片

3.3 子图与多图布局

figure;
subplot(2,2,1); plot(x,sin(x)); title('sin');
subplot(2,2,2); plot(x,cos(x)); title('cos');
subplot(2,2,3); plot(x,tan(x)); title('tan');
subplot(2,2,4); scatter(randn(100,1),randn(100,1));

3.4 高级绘图技巧

  • 使用 yyaxis 创建双Y轴图
  • 使用 tiledlayout / nexttile 精细排版
  • 导出高清图:exportgraphics(gcf, 'plot.png', 'Resolution', 300)

四、文件输入输出(I/O)

4.1 数据保存与加载

save('data.mat', 'A', 'b', 'x');   % 保存变量
load('data.mat');                  % 加载所有变量
s = load('data.mat');              % 以结构体形式加载

4.2 文本文件读写

% 写入文本
fileID = fopen('output.txt','w');
fprintf(fileID, 'Value: %.2f\n', pi);
fclose(fileID);

% 读取文本
data = importdata('data.txt');
% 或使用 textscan

4.3 表格数据处理

T = readtable('data.csv');         % 读取CSV
writetable(T, 'result.xlsx');      % 写入Excel
head(T, 5)                         % 显示前5行
summary(T)                         % 数据摘要

4.4 图像与音频

img = imread('image.jpg');
imshow(img);

[y,fs] = audioread('sound.wav');
sound(y, fs);

五、高级编程技术

5.1 向量化编程(性能关键)

% ❌ 慢:循环
for i = 1:length(x)
    y(i) = x(i)^2 + 2*x(i) + 1;
end

% ✅ 快:向量化
y = x.^2 + 2*x + 1;

5.2 预分配内存

n = 10000;
result = zeros(1, n);  % 预分配
for i = 1:n
    result(i) = i^2;
end

5.3 错误处理(try-catch)

try
    data = load('missing_file.mat');
catch ME
    disp(['错误: ', ME.message]);
    data = [];
end

5.4 定时与性能分析

tic;
% 代码段
pause(1);
toc;  % 显示耗时

% 使用 Profiler
profile on;
myFunction();
profile viewer;

六、面向对象编程(OOP)

6.1 类定义示例

% 文件名:Point.m
classdef Point
    properties
        X = 0
        Y = 0
    end
    
    methods
        function obj = Point(x, y)
            if nargin > 0
                obj.X = x;
                obj.Y = y;
            end
        end
        
        function d = distanceTo(obj, p)
            d = sqrt((obj.X-p.X)^2 + (obj.Y-p.Y)^2);
        end
    end
end

6.2 使用类

p1 = Point(0,0);
p2 = Point(3,4);
dist = p1.distanceTo(p2);  % = 5

七、工具箱与专业应用(精选)

工具箱功能
Signal Processing Toolbox滤波器设计、频谱分析、小波变换
Image Processing Toolbox图像增强、分割、形态学操作
Statistics and ML Toolbox回归、聚类、分类、假设检验
Optimization Toolbox线性/非线性规划、最小化问题
Deep Learning ToolboxCNN、RNN、预训练网络(如ResNet)
Control System ToolboxPID控制、状态空间模型、根轨迹
Simulink图形化建模、仿真动态系统

八、性能优化与调试技巧

8.1 提升运行速度

  • ✅ 向量化代替循环
  • ✅ 预分配数组
  • ✅ 使用 parfor 并行循环
  • ✅ 避免频繁 cleareval
  • ✅ 使用 gpuArray 加速(需GPU)

8.2 调试方法

  • 设置断点(F12)
  • 使用 dbstop if error
  • 查看调用栈(Call Stack)
  • 使用 disp / fprintf 输出中间值

九、最佳实践建议

  1. 命名规范

    • 变量:snake_casecamelCase
    • 函数:动词开头,如 computeMean
    • 文件名与函数名一致
  2. 代码注释

    % 计算加权平均
    % 输入:data - 数据向量,weights - 权重向量
    % 输出:weighted_avg - 加权均值
    
  3. 使用实时脚本(.mlx)

    • 支持 Markdown、公式、图像嵌入
    • 适合教学、报告、文档化代码
  4. 版本控制

    • 推荐使用 Git 管理 .m 文件

十、推荐学习路径

阶段学习内容时间建议
第1周基础语法、矩阵操作、绘图10-15小时
第2周函数编写、流程控制、I/O10小时
第3周向量化、调试、性能优化8小时
第4周OOP、GUI、工具箱应用12小时
持续项目实战、算法实现自主练习

附录:常用快捷键

快捷键功能
Ctrl + Enter运行当前节(实时脚本)
F5运行脚本
F12切换断点
Ctrl + I自动缩进
Ctrl + R / T注释/取消注释
Up/Down历史命令

总结

MATLAB 不仅是一门语言,更是一个科学计算生态系统。掌握它,意味着您拥有了:

✅ 快速原型开发能力
✅ 强大的数据分析与可视化能力
✅ 与 Simulink 联合进行系统级仿真
✅ 无缝接入 AI、控制、通信等前沿领域

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值